oracle数据库未被干净关闭,打开时如何 *** 作恢复数据

oracle数据库未被干净关闭,打开时如何 *** 作恢复数据,第1张

1 数据库的启动(STARTUP)

在Startup命令中,可以通过不同的选项来控制数据库的不同启动步骤。

1、STARTUP NOMOUNT

NONOUNT选项仅仅创建一个Oracle实例。读取initora初始化参数文件、启动后台进程、初始化系统全局区(SGA)。Initora文件定义了实例的配置,包括内存结构的大小和启动后台进程的数量和类型等。实例名根据Oracle_SID设置,不一定要与打开的数据库名称相同。当实例打开后,系统将显示一个SGA内存结构和大小的列表,如下所示:

SQL> startup nomount

ORACLE instance started

Total System Global Area 35431692 bytes

Fixed Size 70924 bytes

Variable Size 18505728 bytes

Database Buffers 16777216 bytes

Redo Buffers 77824 bytes

2、STARTUP MOUNT

该命令创建实例并且安装数据库,但没有打开数据库。Oracle系统读取控制文件中关于数据文件和redo log文件的内容,但并不打开这些文件。这种打开方式常在数据库维护 *** 作时使用,如对数据文件的更名、改变redo log以及打开归档方式、执行数据库的full database recovery。在这种打开方式下,除了可以看到SGA系统列表以外,系统还会给出" Database mounted "的提示。

3、STARTUP

该命令完成创建实例、安装实例和打开数据库的所有三个步骤。此时数据库使数据文件和redo log文件在线,通常还会请求一个或者是多个回滚段。这时系统除了可以看到前面Startup Mount方式下的所有提示外,还会给出一个" Database opened "的提示。此时,数据库系统处于正常工作状态,可以接受用户请求。

如果采用STARTUP NOMOUNT或者是STARTUP MOUNT的数据库打开命令方式,必须采用ALTER DATABASE命令来执行打开数据库的 *** 作。例如,如果你以STARTUP NOMOUNT方式打开数据库,也就是说实例已经创建,但是数据库没有安装和打开。这时必须运行下面的两条命令,数据库才能正确启动。

ALTER DATABASE MOUNT;

ALTER DATABASE OPEN;

而如果以STARTUP MOUNT方式启动数据库,则只需要运行下面一条命令即可以打开数据库:

ALTER DATABASE OPEN;

4、其他打开方式

除了前面介绍的三种数据库打开方式选项外,还有另外其他的一些选项。

(1) STARTUP RESTRICT

这种方式下,数据库将被成功打开,但仅仅允许一些特权用户(具有DBA角色的用户)才可以使用数据库。这种方式常用来对数据库进行维护,如数据的导入/导出 *** 作时不希望有其他用户连接到数据库 *** 作数据、数据装载、特定的迁移或者升级 *** 作等。

(2) STARTUP FORCE

该命令其实是强行关闭数据库(shutdown abort)和启动数据库(startup)两条命令的一个综合。该命令仅在关闭数据库遇到问题不能关闭数据库时采用。

(3) ALTER DATABASE OPEN READ ONLY;

该命令在创建实例以及安装数据库后,以只读方式打开数据库。对于那些仅仅提供查询功能的产品数据库可以采用这种方式打开。

2 数据库的关闭(SHUTDOWN)

对于数据库的关闭,有四种不同的关闭选项。

1、SHUTDOWN NORMAL

这是数据库关闭SHUTDOWN命令的确省选项。也就是说如果输入SHUTDOWN这样的命令,也就是执行SHUTDOWN NORNAL命令。

发出该命令后,任何新的连接都将再不允许连接到数据库。在数据库关闭之前,Oracle将等待目前连接的所有用户都从数据库中退出后才开始关闭数据库。采用这种方式关闭数据库,在下一次启动时不需要进行任何的实例恢复。但需要注意的是,采用这种方式,也许关闭一个数据库需要几天时间,或者更长。

2、SHUTDOWN IMMEDIATE

这是常用的一种关闭数据库的方式,想很快地关闭数据库,但又想让数据库干净的关闭,常采用这种方式。

当前正在被Oracle处理的SQL语句立即中断,系统中任何没有提交的事务全部回滚。如果系统中存在一个很长的未提交的事务,采用这种方式关闭数据库也需要一段时间(该事务回滚时间)。系统不等待连接到数据库的所有用户退出系统,强行回滚当前所有的活动事务,然后断开所有的连接用户。

3、SHUTDOWN TRANSACTIONAL

该选项仅在Oracle 8i后才可以使用。该命令常用来计划关闭数据库,它使当前连接到系统且正在活动的事务执行完毕,运行该命令后,任何新的连接和事务都是不允许的。在所有活动的事务完成后,数据库将和SHUTDOWN IMMEDIATE同样的方式关闭数据库。

4、SHUTDOWN ABORT

这是关闭数据库的最后一招,也是在没有任何办法关闭数据库的情况下才不得不采用的方式,一般不要采用。如果下列情况出现时可以考虑采用这种方式关闭数据库。

1、 数据库处于一种非正常工作状态,不能用shutdown normal或者shutdown immediate这样的命令关闭数据库;

2、 需要立即关闭数据库;

3、 在启动数据库实例时遇到问题;

所有正在运行的SQL语句都将立即中止。所有未提交的事务将不回滚。Oracle也不等待目前连接到数据库的用户退出系统。下一次启动数据库时需要进行实例恢复,因此,下一次启动可能比平时需要更多的时间。

下表为上述四种不同关闭数据库的区别和联系。

关闭方式 Abort Immediate Transaction Nornal

允许新的连接 × × × ×

等待直到当前会话中止 × × × √

等待直到当前事务中止 × × √ √

强制CheckPoint,关闭所有文件 × √ √ √

oracle数据库的备份与恢复

---- 当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(包括机器故障、介质故障、误 *** 作等),数据库有时也可能遭到破坏,这时如何尽快恢复数据就成为当务之急。如果平时对数据库做了备份,那么此时恢复数据就显得很容易。由此可见,做好数据库的备份是多么的重要,下面笔者就以oracle7为例,来讲述一下数据库的备份和恢复。oracle 数据库有三种标准的备份方法,它们分别为导出/导入(export/import)、冷备份、热备份。导出备份是一种逻辑备份,冷备份和热备份是物理备份。

---- 一、 导出/导入(export/import)

---- 利用export可将数据从数据库中提取出来,利用import则可将提取出来的数据送回oracle数据库中去。

---- 1 简单导出数据(export)和导入数据(import)

---- oracle支持三种类型的输出:

---- (1)表方式(t方式),将指定表的数据导出。

---- (2)用户方式(u方式),将指定用户的所有对象及数据导出。

---- (3)全库方式(full方式),将数据库中的所有对象导出。

---- 数据导出(import)的过程是数据导入(export)的逆过程,它们的数据流向不同。

---- 2 增量导出/导入

---- 增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作为system来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为exportdmp,如果不希望自己的输出文件定名为exportdmp,必须在命令行中指出要用的文件名。

---- 增量导出包括三个类型:

---- (1)“完全”增量导出(complete)

---- 即备份整个数据库,比如:

---- $exp system/manager inctype=complete file=990702dmp

---- (2) “增量型”增量导出

---- 备份上一次备份后改变的数据。比如:

---- $exp system/manager inctype=incremental file=990702dmp

---- (3) “累计型”增量导出(cumulative)

---- 累计型导出方式只是导出自上次“完全” 导出之后数据库中变化了的信息。比如:

---- $exp system/manager inctype=cumulative file=990702dmp

---- 数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效地完成。

---- 比如数据库的备份任务可作如下安排:

---- 星期一:完全导出(a)

---- 星期二:增量导出(b)

---- 星期三:增量导出(c)

---- 星期四:增量导出(d)

---- 星期五:累计导出(e)

---- 星期六:增量导出(f)

---- 星期日:增量导出(g)

---- 如果在星期日,数据库遭到意外破坏,数据库管理员可按以下步骤来恢复数据库:

---- 第一步:用命令create database重新生成数据库结构;

---- 第二步:创建一个足够大的附加回段。

---- 第三步:完全增量导入a:

---- $imp system/manager inctype= rectore full=y file=a

---- 第四步:累计增量导入e:

---- $imp system/manager inctype= rectore full=y file =e

---- 第五步:最近增量导入f:

---- $imp system/manager inctype=restore full=y file=f

---- 二、 冷备份

---- 冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份oracle信息而言,冷备份是最快和最安全的方法。冷备份的优点是:

---- 1.是非常快速的备份方法(只需拷贝文件)

---- 2.容易归档(简单拷贝即可)

---- 3.容易恢复到某个时间点上(只需将文件再拷贝回去)

---- 4.能与归档方法相结合,作数据库“最新状态”的恢复。

---- 5.低度维护,高度安全。

---- 但冷备份也有如下不足:

---- 1.单独使用时,只能提供到“某一时间点上”的恢复。

---- 2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。

---- 3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。

---- 4.不能按表或按用户恢复。

---- 如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以工作)并将所备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷备份中必须拷贝的文件包括:

---- 1.所有数据文件

---- 2.所有控制文件

---- 3.所有联机redo log文件

---- 4.initora文件(可选)。

---- 值得注意的是冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的

---- 下面是做冷备份的完整例子:

---- (1) 关闭数据库$sqldba lmode=y

---- sqldba >connect internal;

---- sqldba >shutdown normal;

---- (2) 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件

---- sqldba >! cp < file > <; backup directory >

---- (3) 重启oracle数据库

---- $sqldba lmode=y

---- sqldba >connect internal;

---- sqldba >startup;

---- 三、 热备份

---- 热备份是在数据库运行的情况下,采用archivelog mode方式备份数据的方法。所以,如果你有昨天夜里的一个冷备份而且又有今天的热备份文件,在发生问题时,就可以利用这些资料恢复更多的信息。热备份要求数据库在archivelog方式下 *** 作,并需要大量的档案空间。一旦数据库运行在archivelog状态下,就可以做备份了。热备份的命令文件由三部分组成:

---- 1.数据文件一个表空间一个表空间地备份。

---- (1)设置表空间为备份状态

---- (2)备份表空间的数据文件

---- (3)恢复表空间为正常状态

---- 2.备份归档log文件。

---- (1)临时停止归档进程

---- (2)log下那些在archive redo log目标目录中的文件

---- (3)重新启动archive进程

---- (4)备份归档的redo log 文件

---- 3.用alter database backup controlfile命令来备份拷贝文件

---- 热备份的优点是:

---- 1.可在表空间或数据文件级备份,备份时间短。

---- 2.备份时数据库仍可使用。

---- 3.可达到秒级恢复(恢复到某一时间点上)。

---- 4.可对几乎所有数据库实体作恢复。

---- 5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。

---- 热备份的不足是:

---- 1.不能出错,否则后果严重。

---- 2.若热备份不成功,所得结果不可用于时间点的恢复。

---- 3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”。

Oracle中没有备份和还原的概念,应该叫导出和导入。

一、导出:

1 获取帮助

exp help=y

2 导出一个完整数据库

exp system/manager file=bible_db log=dible_db full=y

3 导出数据库定义而不导出数据

exp system/manager file=bible_db log=dible_db full=y rows=n

4 导出一个或一组指定用户所属的全部表、索引和其他对象

exp system/manager file=seapark log=seapark owner=seapark

exp system/manager file=seapark log=seapark owner=(seapark,amy,amyc,harold)

注意:在导出用户时,尽管已经得到了这个用户的所有对象,但是还是不能得到这些对象引用的任何同义词。解决方法是用以下的SQLPlus命令创建一个脚本文件,运行这个脚本文件可以获得一个重建seapark所属对象的全部公共同义词的可执行脚本,然后在目标数据库上运行该脚本就可重建同义词了。

SET LINESIZE 132

SET PAGESIZE 0

SET TRIMSPOOL ON

SPOOL c:\seaparksyn

SELECT 'Create public synonym '||synonym_name

||' for '||table_owner||''||table_name||';'

FROM dba_synonyms

WHERE table_owner = 'SEAPARK' AND owner = 'PUBLIC';

SPOOL OFF

5 导出一个或多个指定表

exp seapark/seapark file=tank log=tank tables=tank

exp system/manager file=tank log=tank tables=seaparktank

exp system/manager file=tank log=tank tables=(seaparktank,amyartist)

6 估计导出文件的大小

全部表总字节数:

SELECT sum(bytes)

FROM dba_segments

WHERE segment_type = 'TABLE';

seapark用户所属表的总字节数:

SELECT sum(bytes)

FROM dba_segments

WHERE owner = 'SEAPARK'

AND segment_type = 'TABLE';

seapark用户下的aquatic_animal表的字节数:

SELECT sum(bytes)

FROM dba_segments

WHERE owner = 'SEAPARK'

AND segment_type = 'TABLE'

AND segment_name = 'AQUATIC_ANIMAL';

7 导出表数据的子集(oracle8i以上)

NT系统:

exp system/manager query='Where salad_type='FRUIT'' tables=amysalad_type

file=fruit log=fruit

UNIX系统:

exp system/manager query=\"Where salad_type=\'FRUIT\'\" tables=amysalad_type

file=fruit log=fruit

8 用多个文件分割一个导出文件

exp system/manager

file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)

log=paycheck, filesize=1G tables=hrpaycheck

9 使用参数文件

exp system/manager parfile=bible_tablespar

bible_tablespar参数文件:

#Export the sample tables used for the Oracle8i Database Administrator's Bible

file=bible_tables

log=bible_tables

tables=(

amyartist

amybooks

seaparkcheckup

seaparkitems

)

10 增量导出

“完全”增量导出(complete),即备份整个数据库

exp system/manager inctype=complete file=990702dmp

“增量型”增量导出(incremental),即备份上一次备份后改变的数据

exp system/manager inctype=incremental file=990702dmp

“累计型”增量导出(cumulative),即备份上一次“完全”导出之后改变的数据

exp system/manager inctype=cumulative file=990702dmp

二、导入:

1 获取帮助

imp help=y

2 导入一个完整数据库

imp system/manager file=bible_db log=dible_db full=y ignore=y

3 导入一个或一组指定用户所属的全部表、索引和其他对象

imp system/manager file=seapark log=seapark fromuser=seapark

imp system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)

4 将一个用户所属的数据导入另一个用户

imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy

imp system/manager file=tank log=tank fromuser=(seapark,amy) touser=(seapark1, amy1)

5 导入一个表

imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)

6 从多个文件导入

imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)

log=paycheck, filesize=1G full=y

7 使用参数文件

imp system/manager parfile=bible_tablespar

bible_tablespar参数文件:

#Import the sample tables used for the Oracle8i Database Administrator's

Bible fromuser=seapark touser=seapark_copy file=seapark log=seapark_import

8 增量导入

imp system/manager inctype= RECTORE FULL=Y FILE=A

以上就是关于oracle数据库未被干净关闭,打开时如何 *** 作恢复数据全部的内容,包括:oracle数据库未被干净关闭,打开时如何 *** 作恢复数据、如何Oracle 数据库备份与恢复、怎样用命令备份还原Oracle数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9506461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存