首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

ORACLE备份&回复案例

2012-08-01 
ORACLE备份&恢复案例?ORACLE备份&恢复案例ORACLE BACKUP&RESTORESCHEME第一章. 理解什么是数据库恢复当我

ORACLE备份&恢复案例

?

ORACLE备份&恢复案例

ORACLE BACKUP&RESTORESCHEME

第一章. 理解什么是数据库恢复

当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过程大致可以分为复原(Restore)与恢复(Restore)过程。

数据库恢复可以分为以下两类:

1.1实例故障的一致性恢复

当实例意外地(如掉电、后台进程故障等)或预料地(发出SHUTDOUM ABORT语句)中止时出现实例故障,此时需要实例恢复。实例恢复将数据库恢复到故障之前的事务一致状态。如果在在线后备发现实例故障,则需介质恢复。在其它情况ORACLE在下次数据库起动时(对新实例装配和打开),自动地执行实例恢复。如果需要,从装配状态变为打开状态,自动地激发实例恢复,由下列处理:

(1) 为了解恢复数据文件中没有记录的数据,进行向前滚。该数据记录在在线日志,包括对回滚段的内容恢复。

(2) 回滚未提交的事务,按步1重新生成回滚段所指定的操作。

(3) 释放在故障时正在处理事务所持有的资源。

(4) 解决在故障时正经历一阶段提交的任何悬而未决的分布事务。

1.2介质故障或文件错误的不一致恢复

介质故障是当一个文件、一个文件的部分或磁盘不能读或不能写时出现的故障。

文件错误一般指意外的错误导致文件被删除或意外事故导致文件的不一致。

这种状态下的数据库都是不一致的,需要DBA手工来进行数据库的恢复,这种恢复有两种形式,决定于数据库运行的归档方式和备份方式。

(1) 完全介质恢复可恢复全部丢失的修改。一般情况下需要有数据库的备份且数据库运行在归档状态下并且有可用归档日志时才可能。对于不同类型的错误,有不同类型的完全恢复可使用,其决定于毁坏文件和数据库的可用性。

(2) 不完全介质恢复是在完全介质恢复不可能或不要求时进行的介质恢复。重构受损的数据库,使其恢复介质故障前或用户出错之前的一个事务一致性状态。不完全介质恢复有不同类型的使用,决定于需要不完全介质恢复的情况,有下列类型:基于撤消、基于时间和基于修改的不完全恢复。

基于撤消(CANCEL)恢复:在某种情况,不完全介质恢复必须被控制,DBA可撤消在指定点的操作。基于撤消的恢复地在一个或多个日志组(在线的或归档的)已被介质故障所破坏,不能用于恢复过程时使用,所以介质恢复必须控制,以致在使用最近的、未损的日志组于数据文件后中止恢复操作。

基于时间(TIME)和基于修改(SCN)的恢复:如果DBA希望恢复到过去的某个指定点,是一种理想的不完全介质恢复,一般发生在恢复到某个特定操作之前,恢复到如意外删除某个数据表之前。

?

第二章. 数据库恢复案例测试环境2.1 数据库环境

以下的所有案例都是通过测试经过,环境为:

? OS:Windows 2000 Server

? DB:Oracle 816

? DBNAME:TEST

数据文件:

SQL> selectfile#,status,enabled,name from v$datafile;

?

???? FILE# STATUS? ENABLED???NAME

----------------- ------------------------------------------------------

?? ??????1 SYSTEM?READ WRITE D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF

???????? 2 ONLINE? READ WRITE D:\ORACLE\ORADATA\TEST\RBS01.DBF

???????? 3 ONLINE? READ WRITE D:\ORACLE\ORADATA\TEST\USERS01.DBF

???????? 4 ONLINE? READ WRITE D:\ORACLE\ORADATA\TEST\TEMP01.DBF

????????5 ONLINE? READ WRITED:\ORACLE\ORADATA\TEST\TOOLS01.DBF

???????? 6 ONLINE? READ WRITE D:\ORACLE\ORADATA\TEST\INDX01.DBF

控制文件:

SQL> select* from v$controlfile;

?

STATUS? NAME

---------------------------------------------------

???? D:\ORACLE\ORADATA\TEST\CONTROL01.CTL

???? D:\ORACLE\ORADATA\TEST\CONTROL02.CTL

???? D:\ORACLE\ORADATA\TEST\CONTROL03.CTL

联机日志:

SQL> select* from v$logfile;

?

??? GROUP# STATUS? MEMBER

-------------------------------------------------------------

????? 1 STALE??D:\ORACLE\ORADATA\TEST\REDO01.LOG

????? 2?????????D:\ORACLE\ORADATA\TEST\REDO02.LOG

????? 3 STALE??D:\ORACLE\ORADATA\TEST\REDO03.LOG

2.2 数据库备份脚本

冷备份脚本

rem???? script:coldbak.sql

rem???? creater:chenjiping

rem???? date:5.8.2003

rem???? desc:offline full backup database

?

--connectdatabase

connectinternal/password;

--shutdowndatabase

shutdownimmediate;

--Copy Datafile

!xcopyd:\oracle\oradata\test\*.dbf d:\database/H/R;

--Copy Controlfile

!xcopyd:\oracle\oradata\test\*.ctl d:\database/H/R;

--Copy Log file

!xcopyd:\oracle\oradata\test\*.log d:\database/H/R;

--startupdatabase

startup;

?

说明:

1、以上脚本在数据库关闭状态下备份数据库所有的数据文件,联机日志,控制文件(在一个目录下),如果成功备份,所有文件是一致的。

2、没有备份参数文件,参数文件可以另外备份,没有必要每次都备份,只需要在改变设置后备份一次。

3、如果以上命令没有成功依次执行,那么备份将是无效的,如连接数据库不成功,那么肯定关闭数据库也不成功,那么备份则无效

4、冷备份建议下人工干预下执行。

rem???? script:hotbak.sql

rem???? creater:chenjiping

rem???? date:5.8.2003

rem???? desc:backup all database datafile inarchive

?

--connectdatabase

connectinternal/password;

?

--archive

alter systemarchive log current;

--start

?

altertablespace system begin backup;

!xcopyd:\oracle\oradata\test\system01.dbf d:\databak/H/R;

altertablespace system end backup;

?

altertablespace rbs begin backup;

!xcopyd:\oracle\oradata\test\rbs01.dbf d:\databak/H/R;

altertablespace rbs end backup;

?

altertablespace users begin backup;

!xcopyd:\oracle\oradata\test\users01.dbf d:\databak/H/R;

altertablespace users end backup;

?

altertablespace tools begin backup;

!xcopyd:\oracle\oradata\test\tools01.dbf d:\databak/H/R;

altertablespace tools end backup;

?

altertablespace indx begin backup;

!xcopyd:\oracle\oradata\test\indx01.dbf d:\databak/H/R;

altertablespace indx end backup;

--end

?

--bak controlfile

--binary

alter databasebackup controlfile to 'd:\databak\controlbinbak.000';

--ascii

alter databasebackup controlfile to trace;

?

alter systemarchive log current;

说明:

1、热备份必须在数据库归档方式下才可以运行

2、以上脚本可以在数据库运行状态下备份数据库所有的数据文件(除了临时数据文件),没有必要备份联机日志。

3、归档日志至少需要一次完整备份之后的所有日志。

4、如果以上命令没有成功依次执行,那么备份也是无效的,如连接数据库不成功,那么备份则无效

?

RMAN备份只讲叙有恢复目录的情况,如果没有恢复目录,情形大致相似。以下是RMAN的热备份全备份的脚本:

#?? script:bakup.rcv

#?? creater:chenjiping

#?? date:5.8.2003

#?? desc:backup all database datafile in archivewith rman

?

# connectdatabase

connect rcvcatrman/rman@back;

connect targetinternal/virpure;

?

# start backupdatabase

run{

allocate channelc1 type disk;

backup full tag'dbfull' format 'd:\backup\full%u_%s_%p' database

include currentcontrolfile;

sql 'altersystem archive log current';

release channelc1;

}

# end

?

?

以上举例说明了数据库的恢复案例的测试环境与部分备份测试脚本,其它的备份脚本可以根据以上脚本演变而来或在案例中加以说明。

数据库的自动实例将不加以说明,这里只举例说明媒体错误或人为错误造成的恢复可能。

以上包括以下案例都是在WINDOWS+ORACLE816上测试验证的,在不同的操作系统与不同的数据库版本中略有差别。

?

第三章. 了解与恢复相关的信息

1、理解报警日志文件

报警日志文件一般记载了数据库的启动/关闭信息,归档信息,备份信息,恢复信息,常见错误信息,部分数据库修改记录等。一般令名规则为<SID>Alrt.log或Alrt<SID>.log,如我的测试数据库的报警日志文件的名称为testalrt.log。

报警日志文件的路径是根据初始化参数background_dump_dest来决定的,如在我的机器上,该参数值为 D:\Oracle\admin\test\bdump,那么,你就可以在该路径下找到该文件

2、后台进程跟踪文件

后台进程跟踪文件的路径与报警日志文件的路径一致,在某些情况下,你可以通过后台跟踪文件的信息了解更多的需要恢复的信息。如在数据库需要恢复的时候,报警日志文件中常有这样的语句:

Errors in fileD:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157:cannot identify/lock data file 1 - see DBWR trace file

通过提示的DBWR跟踪文件,可以查询到更详细的信息。

3、v$recover_file与v$recovery_log

这是两个动态性能视图,可以在mount下查看,通过这两个视图,你可以了解详细的需要恢复的数据文件与需要使用到的归档日志。

第四章. 数据库恢复案例4.1非归档模式下的备份与恢复

备份方案:采用OS冷备份

1.连接数据库并创建测试表

SQL*Plus:Release 8.1.6.0.0 - Production on Tue May 613:46:32 2003

(c) Copyright1999 Oracle Corporation.? All rightsreserved.

SQL> connectinternal/password as sysdba;

Connected.

SQL> createtable test(a int);

Table created

SQL> insertinto test values(1);

1 row inserted

SQL> commit;

Commit complete

?

2.备份数据库

SQL>@coldbak.sql 或在DOS下 svrmgrl @coldbak.sql

?

3.再插入记录

SQL> insertinto test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select* from test;

???????????????????????? A

---------------------------------------

???????????????????????? 1

???????????????????????? 2

4.关闭数据库

SQL>shutdown immediate;

Databaseclosed.

Databasedismounted.

ORACLE instanceshut down.

?

5.毁坏一个或多个数据文件,如删除user01.dbf

C:\>delD:\ORACLE\ORADATA\TEST\USERS01.DBF

模拟媒体毁坏

?

6.重新启动数据库,会发现如下错误

SQL> startup

ORACLE instancestarted.

?

Total SystemGlobal Area? 102020364 bytes

Fixed Size??????????????????? 70924 bytes

VariableSize????????????? 85487616 bytes

DatabaseBuffers?????????? 16384000 bytes

RedoBuffers????????????????? 77824 bytes

Databasemounted.

ORA-01157:cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: datafile 3: 'D:\ORACLE\ORADATA\TEST\USERS01.DBF'

?

在报警文件中,会有更详细的信息

Errors in fileD:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157:cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: datafile 3: 'D:\ORACLE\ORADATA\TEST\USERS01.DBF'

ORA-27041:unable to open file

OSD-04002:unable to open file

O/S-Error: (OS2) 系统找不到指定的文件。

?

7.拷贝备份复原到原来位置(restore过程)

C:\>xcopyd:\database\*.* d:\oracle\oradata\test/H/R/S

?

8.打开数据库,检查数据

SQL> alterdatabase open;

Databasealtered.

SQL> select* from test;

???????????????????????? A

---------------------------------------

???????????????????????? 1

?

这里可以发现,数据库恢复成功,但在备份之后与崩溃之前的数据丢失了。

说明:

1、非归档模式下的恢复方案可选性很小,一般情况下只能有一种恢复方式,就是数据库的冷备份的完全恢复,仅仅需要拷贝原来的备份就可以(restore),不需要recover。

2、这种情况下的恢复,可以完全恢复到备份的点上,但是可能是丢失数据的,在备份之后与崩溃之前的数据将全部丢失。

3、不管毁坏了多少数据文件或是联机日志或是控制文件,都可以通过这个办法恢复,因为这个恢复过程是Restore所有的冷备份文件,而这个备份点上的所有文件是一致的,与最新的数据库没有关系,就好比把数据库又放到了一个以前的“点”上。

4、对于非归档模式下,最好的办法就是采用OS的冷备份,建议不要用RMAN来作冷备份,效果不好,因为RMAN不备份联机日志,restore不能根本解决问题。

5、如果没有备份联机日志,如RMAN的备份,就需要利用不完全恢复(until cancel)的方法来重新创建联机日志文件

4.2归档模式下丢失或损坏一个数据文件4.2.1 OS备份方案

在归档方式下损坏或丢失一个数据文件,如果存在相应的备份与该备份以来的归档日志,恢复还是比较简单的,可以作到尽量少的Down机时间,并能作到数据库的完全恢复。

SQL>shutdown immediate;

Databaseclosed.

Databasedismounted.

ORACLE instanceshut down

copy d:\databak\users01.dbf d:\oracle\oradata\test;

1、采用热备份,需要运行在归档模式下,可以实现数据库的完全恢复,也就是说,从备份后到数据库崩溃时的数据都不会丢失。

2、可以采用全备份数据库的方式备份,对于特殊情况,也可以只备份特定的数据文件,如只备份用户表空间(一般情况下对于某些写特别频繁的数据文件,可以单独加大备份频率)

3、如果在恢复过程中,发现损坏的是多个数据文件,即可以采用一个一个数据文件的恢复方法(第5步中需要对数据文件一一脱机,第6步中需要对数据文件分别恢复),也可以采用整个数据库的恢复方法。

4、如果是系统表空间的损坏,不能采用此方法

4.2.2 RMAN备份方案

Database altered.

Database altered.

1、RMAN也可以实现单个表空间或数据文件的恢复,恢复过程可以在mount下或open方式下,如果在open方式下恢复,可以减少down机时间

2、如果损坏的是一个数据文件,建议offline并在open方式下恢复

3、这里可以看到,RMAN进行数据文件与表空间恢复的时候,代码都比较简单,而且能保证备份与恢复的可靠性,所以建议采用RMAN的备份与恢复

4.3丢失多个数据文件,实现整个数据库的恢复4.3.1 OS备份方案

1、只要有备份与归档存在,就可以实现数据库的完全恢复(不丢失数据)

2、适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复

3、恢复过程在mount下进行,如果恢复成功,再打开数据库,down机时间可能比较长一些。

4.3.2 RMAN备份方案

1、连接数据库,创建测试表并插入记录

SQL*Plus:Release 8.1.6.0.0 - Production on Tue May 613:46:32 2003

(c) Copyright1999 Oracle Corporation.? All rightsreserved.

SQL> connectinternal/password as sysdba;

Connected.

SQL> createtable test(a int);

Table created

SQL> insertinto test values(1);

1 row inserted

SQL> commit;

Commit complete

?

2、备份数据库

DOS下 C:>\ rman cmdfile=bakup.rcvmsglog=backup.log;

?

以下是backup.log内容。

RecoveryManager: Release 8.1.6.0.0 -Production

RMAN> #???? script:bakup.rcv

2> #???? creater:chenjiping

3> #???? date:5.8.2003

4> #???? desc:backup all database datafile inarchive with rman

5>

6> #connectdatabase

7> connectrcvcat rman/rman@back;

8> connecttarget internal/virpure;

9>

10> #startbackup database

11> run{

12> allocatechannel c1 type disk;

13> backupfull tag 'dbfull' format 'd:\backup\full%u_%s_%p' database

14> includecurrent controlfile;

15> sql'alter system archive log current';

16> releasechannel c1;

17> }

18> #end

19>

?

RMAN-06008:connected to recovery catalog database

RMAN-06005:connected to target database: TEST (DBID=1788174720)

RMAN-03022:compiling command: allocate

RMAN-03023:executing command: allocate

RMAN-08030:allocated channel: c1

RMAN-08500:channel c1: sid=15 devtype=DISK

RMAN-03022:compiling command: backup

RMAN-03023:executing command: backup

RMAN-08008:channel c1: starting full datafile backupset

RMAN-08502:set_count=4 set_stamp=494074368 creation_time=15-MAY-03

RMAN-08010:channel c1: specifying datafile(s) in backupset

RMAN-08522:input datafile fno=00002 name=D:\ORACLE\ORADATA\TEST\RBS01.DBF

RMAN-08522:input datafile fno=00001 name=D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF

RMAN-08011:including current controlfile in backupset

RMAN-08522:input datafile fno=00005 name=D:\ORACLE\ORADATA\TEST\TOOLS01.DBF

RMAN-08522:input datafile fno=00004 name=D:\ORACLE\ORADATA\TEST\TEMP01.DBF

RMAN-08522:input datafile fno=00006 name=D:\ORACLE\ORADATA\TEST\INDX01.DBF

RMAN-08522:input datafile fno=00003 name=D:\ORACLE\ORADATA\TEST\USER01.DBF

RMAN-08013:channel c1: piece 1 created

RMAN-08503:piece handle=D:\BACKUP\FULL04EN5UG0_4_1 comment=NONE

RMAN-08525:backup set complete, elapsed time: 00:01:16

RMAN-03023:executing command: partial resync

RMAN-08003:starting partial resync of recovery catalog

RMAN-08005:partial resync complete

RMAN-03022:compiling command: sql

RMAN-06162: sqlstatement: alter system archive log current

RMAN-03023:executing command: sql

RMAN-03022:compiling command: release

RMAN-03023:executing command: release

RMAN-08031:released channel: c1

RecoveryManager complete.

到这里表示备份成功。

?

3、继续在测试表中插入记录

SQL> insertinto test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select* from test;

???????????????????????? A

---------------------------------------

???????????????????????? 1

???????????????????????? 2

SQL> altersystem switch logfile;

System altered.

SQL> altersystem switch logfile;

System altered.

?

4、关闭数据库,模拟丢失数据文件

SQL>shutdown immediate;

Databaseclosed.

Databasedismounted.

ORACLE instanceshut down

C:\>delD:\ORACLE\ORADATA\TEST\SYSTEM01.DBF

C:\>delD:\ORACLE\ORADATA\TEST\INDX01.DBF

C:\>delD:\ORACLE\ORADATA\TEST\TOOLS01.DBF

C:\>delD:\ORACLE\ORADATA\TEST\RBS01.DBF

?

5、启动数据库,检查错误

SQL> STARTUP

ORACLE instancestarted.

Total SystemGlobal Area? 102020364 bytes

Fixed Size??????????????????? 70924 bytes

VariableSize????????????? 85487616 bytes

DatabaseBuffers?????????? 16384000 bytes

RedoBuffers????????????????? 77824 bytes

Databasemounted.

ORA-01157:cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: datafile 1: 'D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF'

?

查询v$recover_file

SQL> select* from v$recover_file;

?

???? FILE# ONLINE? ERROR???????????????? CHANGE# TIME

----------------- ------------------ ---------- -----------

???????? 1 ONLINE? FILE NOT FOUND????????????? 0

???????? 2 ONLINE? FILE NOT FOUND???? ?????????0

???????? 5 ONLINE? FILE NOT FOUND????????????? 0

???????? 6 ONLINE? FILE NOT FOUND????????????? 0

可以知道有四个数据文件需要恢复

?

6、利用RMAN进行恢复

C:\>rman

RecoveryManager: Release 8.1.6.0.0 -Production

RMAN>connect rcvcat rman/rman@back

RMAN-06008:connected to recovery catalog database

RMAN>connect target internal/virpure

RMAN-06005:connected to target database: TEST (DBID=1788174720)

RMAN> run{

2> allocatechannel c1 type disk;

3> restoredatabase;

4> recoverdatabase;

5> sql'alter database open';

6> releasechannel c1;

7> }

?

RMAN-03022:compiling command: allocate

RMAN-03023:executing command: allocate

RMAN-08030:allocated channel: c1

RMAN-08500:channel c1: sid=17 devtype=DISK

RMAN-03022:compiling command: restore

RMAN-03025:performing implicit partial resync of recovery catalog

RMAN-03023:executing command: partial resync

RMAN-08003:starting partial resync of recovery catalog

RMAN-08005:partial resync complete

RMAN-03022:compiling command: IRESTORE

RMAN-03023:executing command: IRESTORE

RMAN-08016:channel c1: starting datafile backupset restore

RMAN-08502:set_count=4 set_stamp=494074368 creation_time=15-MAY-03

RMAN-08089:channel c1: specifying datafile(s) to restore from backup set

RMAN-08523:restoring datafile 00001 to D:\ORACLE\ORADATA\TEST\SYSTEM01.DBF

RMAN-08523:restoring datafile 00002 to D:\ORACLE\ORADATA\TEST\RBS01.DBF

RMAN-08523:restoring datafile 00003 to D:\ORACLE\ORADATA\TEST\USER01.DBF

RMAN-08523:restoring datafile 00004 to D:\ORACLE\ORADATA\TEST\TEMP01.DBF

RMAN-08523:restoring datafile 00005 to D:\ORACLE\ORADATA\TEST\TOOLS01.DBF

RMAN-08523:restoring datafile 00006 to D:\ORACLE\ORADATA\TEST\INDX01.DBF

RMAN-08023:channel c1: restored backup piece 1

RMAN-08511:piece handle=D:\BACKUP\FULL04EN5UG0_4_1 tag=DBFULL params=NULL

RMAN-08024:channel c1: restore complete

RMAN-03023:executing command: partial resync

RMAN-08003:starting partial resync of recovery catalog

RMAN-08005:partial resync complete

RMAN-03022:compiling command: recover

RMAN-03022:compiling command: recover(1)

RMAN-03022:compiling command: recover(2)

RMAN-03022:compiling command: recover(3)

RMAN-03023:executing command: recover(3)

RMAN-08054:starting media recovery

RMAN-03022:compiling command: recover(4)

RMAN-06050:archivelog thread 1 sequence 327 is already on disk as fileD:\ORACLE\ORADATA\TEST\ARCHIVE\TESTT001S00327.ARC

RMAN-06050:archivelog thread 1 sequence 328 is already on disk as fileD:\ORACLE\ORADATA\TEST\ARCHIVE\TESTT001S00328.ARC

RMAN-06050:archivelog thread 1 sequence 329 is already on disk as fileD:\ORACLE\ORADATA\TEST\ARCHIVE\TESTT001S00329.ARC

RMAN-06050:archivelog thread 1 sequence 330 is already on disk as fileD:\ORACLE\ORADATA\TEST\ARCHIVE\TESTT001S00330.ARC

RMAN-03023:executing command: recover(4)

RMAN-08515:archivelog filename=D:\ORACLE\ORADATA\TEST\ARCHIVE\TESTT001S00327.ARC thread=1sequence=327

RMAN-08515:archivelog filename=D:\ORACLE\ORADATA\TEST\ARCHIVE\TESTT001S00328.ARC thread=1sequence=328

RMAN-08055:media recovery complete

RMAN-03022:compiling command: sql

RMAN-06162: sqlstatement: alter database open

RMAN-03023:executing command: sql

RMAN-03022:compiling command: release

RMAN-03023:executing command: release

RMAN-08031:released channel: c1

RMAN>

?

7、检查数据库的数据(完全恢复)

SQL> select* from test;

???????????????????????? A

---------------------------------------

???????????????????????? 1

???????????????????????? 2

?

说明:

1、只要有备份与归档存在,RMAN也可以实现数据库的完全恢复(不丢失数据)

2、同OS备份数据库恢复,适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复

3、目标数据库在mount下进行,如果恢复成功,再打开数据库。

4、RMAN的备份与恢复命令相对比较简单并可靠,建议有条件的话,都采用RMAN进行数据库的备份。

4.4 不完全恢复案例4.4.1 OS备份下的基于时间的恢复

不完全恢复可以分为基于时间的恢复,基于改变的恢复与基于撤消的恢复,这里已基于时间的恢复为例子来说明不完全恢复过程。

基于时间的恢复可以不完全恢复到现在时间之前的某一个时间,对于某些误操作,如删除了一个数据表,可以在备用恢复环境上恢复到表的删除时间之前,然后把该表导出到正式环境,避免一个人为的错误。

SQL> insertinto test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select* from test;

???????????????????????? A

---------------------------------------

???????????????????????? 1

???????????????????????? 2

SQL> altersystem switch logfile;

Statementprocessed.

SQL> altersystem switch logfile;

Statementprocessed.

?

SQL> selectto_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY

-------------------

2003-05-2114:43:01

SQL> droptable test;

Table dropped.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> select* from test;

???????????????????????? A

---------------------------------------

???????????????????????? 1

???????????????????????? 2

1、不完全恢复最好备份所有的数据,冷备份亦可,因为恢复过程是从备份点往后恢复的,如果因为其中一个数据文件的时间戳(SCN)大于要恢复的时间点,那么恢复都是不可能成功的。

2、不完全恢复有三种方式,过程都一样,仅仅是recover命令有所不一样,这里用基于时间的恢复作为示例。

3、不完全恢复之后,都必须用resetlogs的方式打开数据库,建议马上再做一次全备份,因为resetlogs之后再用以前的备份恢复是很难了。

4、以上是在删除之前获得时间,但是实际应用中,很难知道删除之前的实际时间,但可以采用大致时间即可,或可以采用分析日志文件(logmnr),取得精确的需要恢复的时间。

5、一般都是在测试机后备用机器上采用这种不完全恢复,恢复之后导出/导入被误删的表回生产系统

4.4.2 RMAN备份下的基于改变的恢复

SQL> insertinto test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select* from test;

???????????????????????? A

---------------------------------------

???????????????????????? 1

?????????????? ??????????2

SQL> select* from test;

????????? ???????????????A

---------------------------------------

???????????????????????? 1

???????????????????????? 2

1、RMAN也可以实现不完全恢复,方法比OS备份恢复的方法更简单可靠

2、RMAN可以基于时间,基于改变与基于日志序列的不完全恢复,基于日志序列的恢复可以指定恢复到哪个日志序列,如

3、与所有的不完全恢复一样,必须在mount下,restore所有备份数据文件,需要resetlogs

4、基于改变的恢复比基于时间的恢复更可靠,但是可能也更复杂,需要知道需要恢复到哪一个改变号(SCN),在正常生产中,获取SCN的办法其实也有很多,如查询数据库字典表(V$archived_logor v$log_history),或分析归档与联机日志(logmnr)等。

第五章 其它恢复案例5.1 损坏联机日志的恢复方法5.1.1 损坏非当前联机日志

1、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear。

2、建议clear,特别是强行clear后作一次数据库的全备份。

3、此方法适用于归档与非归档数据库

5.1.2 损坏当前联机日志

一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。

二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法

1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致

2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。

3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析

4、全部完成后做一次数据库的全备份

5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

5.2 损坏控制文件的恢复方法5.2.1 损坏单个控制文件

1、损失单个控制文件是比较简单的,因为数据库中所有的控制文件都是镜相的,只需要简单的拷贝一个好的就可以了

2、建议镜相控制文件在不同的磁盘上

3、建议多做控制文件的备份,长期保留一份由alter databasebackup control file to trace产生的控制文件的文本备份

5.2.2 损坏全部控制文件

--noarchive

-- RECOVER DATABASE UNTIL CANCELUSING BACKUP CONTROLFILE

--archive

-- RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL

-- Database can now be opened normally.

--ALTER DATABASE OPEN RESETLOGS;

1、重建控制文件用于恢复全部数据文件的损坏,需要注意其书写的正确性,保证包含了所有的数据文件与联机日志

2、经常有这样一种情况,因为一个磁盘损坏,我们不能再恢复(store)数据文件到这个磁盘,因此在store到另外一个盘的时候,我们就必须重新创建控制文件,用于识别这个新的数据文件,这里也可以用这种方法用于恢复

5.3 损坏回滚数据文件的恢复方法

回滚段表空间中的一个数据文件丢失或者损坏导致数据库无法识别它,在启动数据库的时候会出现ORA-1157, ORA-1110的错误,或者操作系统级别的错误,例如ORA-7360。在关闭数据库的时候(normal或者immediate)会出现ORA-1116, ORA-1110的错误,或者操作系统级别的错误,例如ORA-7368。

感谢coolyl的辛勤工作,关于回滚段的大部分内容都是摘自他在itpub的文章。

5.3.1 损坏数据文件,但数据库处于Open状态

这种情况下最简单的方法就是offline drop掉这个坏了的或者丢失的数据文件,然后以restricted模式打开数据库然后删除并且重建包含损坏文件的回滚段表空间。

1、这种方法的前提条件是数据库是正常关闭(不是abort)可用

2、这种方法是正常方法,不会引起数据错误

5.3.3 数据库关闭,数据文件中有活动事务,没有可用备份

1、这种办法是万不得以的时候使用的方法,如果有备份,都建议从备份上进行恢复

2、这种方法恢复的数据库,可能会引起数据库的数据错误

3、恢复成功以后,建议exp/imp数据,并重新分析检查数据库

5.3.4 数据库关闭,数据文件中有活动事务,从备份恢复

1、这种方法要求在归档有备份的方式下进行,而且是建议方式

2、这种方法不会导致数据库的错误

5.4 损坏临时数据文件的恢复方法

临时数据文件的恢复是比较简单的,因为临时文件中不涉及到其它的有用的数据,所以可以删除后重建

1、临时数据文件是非重要文件,不保存永久数据,可以随时删除重建,不影响数据库的数据安全

2、如果重新建立以后,别忘了重新分配给用户。

第五章. 常见恢复误区

1、可以不需要备份,只有归档就能进行数据库的向前的恢复

答:这个在ORACLE 9i以前起码是不可能的,在别的数据库我也没有听说过,不完全恢复的主要思路是利用不完全点之前的备份,加上归档日志,恢复到不完全恢复点,9i中出现了一个flashback的特性,这个特性的使用,也是有很多局限的。

2、进行不完全恢复只需要拷贝一个需要恢复的备份数据文件

答:不完全恢复需要拷贝所有的数据文件,最好包括临时数据文件在内,否则需要另外的处理,如果有一个数据文件的SCN大于不完全恢复点,那么这个恢复都将是失败的。

3、使用RMAN目录与目标数据库在同一数据库能很好进行数据库的恢复

答:使用恢复目录与目标数据库在同一个数据库中,将存在很大的恢复局限,如该数据库的系统数据文件的损害,数据库根本不能open,那么RMAN也就无法连接恢复目录,也就不存在恢复了。

第六章. 小结

这里我们反复演示了多种情况下的恢复方案,通过这些演示,我们应该掌握了如下内容:

1、利用OS与RMAN进行各种常规备份与恢复。

2、熟悉没有备份或简单的非常规备份与恢复的方法。

?

热点排行