什么起泡酒比较高端:ORACLE备份&恢复案例之三

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 20:34:18
ORACLE备份&恢复案例之三(精品) 2006-10-22 15:55:39标签:备份 oracle 数据容灾 容灾系统 复制

4.4 不完全恢复案例

4.4.1 OS备份下的基于时间的恢复

不完全恢复可以分为基于时间的恢复,基于改变的恢复与基于撤消的恢复,这里已基于时间的恢复为例子来说明不完全恢复过程。基于时间的恢复可以不完全恢复到现在时间之前的某一个时间,对于某些误操作,如删除了一个数据表,可以在备用恢复环境上恢复到表的删除时间之前,然后把该表导出到正式环境,避免一个人为的错误。1、连接数据库,创建测试表并插入记录SQL*Plus: Release 8.1.6.0.0 - Production on Tue May 6 13:46:32 2003(c) Copyright 1999 Oracle Corporation. All rights reserved.SQL> connect internal/password as sysdba;Connected.SQL> create table test(a int);Table createdSQL> insert into test values(1);1 row insertedSQL> commit;Commit complete2、备份数据库,这里最好备份所有的数据文件,包括临时数据文件SQL> @hotbak.sql 或在DOS下 svrmgrl @hotbak.sql或冷备份也可以3、删除测试表,假定删除前的时间为T1,在删除之前,便于测试,继续插入数据并应用到归档。SQL> insert into test values(2);1 row insertedSQL> commit;Commit completeSQL> select * from test;A---------------------------------------12SQL> alter system switch logfile;Statement processed.SQL> alter system switch logfile;Statement processed.SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;TO_CHAR(SYSDATE,'YY-------------------2003-05-21 14:43:01SQL> drop table test;Table dropped.4、准备恢复到时间点T1,找回删除的表,先关闭数据库SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.5、拷贝刚才备份的所有数据文件回来C:>copy D:DATABAK*.DBF D:ORACLEORADATATEST6、启动到mount下SQL> startup mount;ORACLE instance started.Total System Global Area 102020364 bytesFixed Size 70924 bytesVariable Size 85487616 bytesDatabase Buffers 16384000 bytesRedo Buffers 77824 bytesDatabase mounted.7、开始不完全恢复数据库到T1时间SQL> recover database until time '2003-05-21:14:43:01';ORA-00279: change 30944 generated at 05/21/2003 14:40:06 needed for thread 1ORA-00289: suggestion : D:ORACLEORADATATESTARCHIVETESTT001S00191.ARCORA-00280: change 30944 for thread 1 is in sequence #191Specify log: {=suggested | filename | AUTO | CANCEL}autoLog applied.Media recovery complete.8、打开数据库,检查数据SQL> alter database open resetlogs;Database altered.SQL> select * from test;A---------------------------------------12说明:1、不完全恢复最好备份所有的数据,冷备份亦可,因为恢复过程是从备份点往后恢复的,如果因为其中一个数据文件的时间戳(SCN)大于要恢复的时间点,那么恢复都是不可能成功的。2、不完全恢复有三种方式,过程都一样,仅仅是recover命令有所不一样,这里用基于时间的恢复作为示例。3、不完全恢复之后,都必须用resetlogs的方式打开数据库,建议马上再做一次全备份,因为resetlogs之后再用以前的备份恢复是很难了。4、以上是在删除之前获得时间,但是实际应用中,很难知道删除之前的实际时间,但可以采用大致时间即可,或可以采用分析日志文件(logmnr),取得精确的需要恢复的时间。5、一般都是在测试机后备用机器上采用这种不完全恢复,恢复之后导出/导入被误删的表回生产系统

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

以上用OS备份说明了一个基于时间的恢复,现在用RMAN说明一个基于改变的恢复1、连接数据库,创建测试表并插入记录SQL*Plus: Release 8.1.6.0.0 - Production on Tue May 6 13:46:32 2003(c) Copyright 1999 Oracle Corporation. All rights reserved.SQL> connect internal/password as sysdba;Connected.SQL> create table test(a int);Table createdSQL> insert into test values(1);1 row insertedSQL> commit;Commit complete2、备份数据库C:>rmanRecovery Manager: Release 8.1.6.0.0 - ProductionRMAN> connect rcvcat rman/rman@backRMAN-06008: connected to recovery catalog databaseRMAN> connect target internal/virpureRMAN-06005: connected to target database: TEST (DBID=874705288)RMAN> run{2> allocate channel c1 type disk;3> backup full tag 'dbfull' format 'd:backupfull%u_%s_%p' database4> include current controlfile;5> sql 'alter system archive log current';6> release channel c1;7> }RMAN-03022: compiling command: allocateRMAN-03023: executing command: allocateRMAN-08030: allocated channel: c1RMAN-08500: channel c1: sid=12 devtype=DISKRMAN-03022: compiling command: backupRMAN-03023: executing command: backupRMAN-08008: channel c1: starting full datafile backupsetRMAN-08502: set_count=1 set_stamp=494607834 creation_time=21-MAY-03RMAN-08010: channel c1: specifying datafile(s) in backupsetRMAN-08522: input datafile fno=00001 name=D:ORACLEORADATATESTSYSTEM01.DBFRMAN-08011: including current controlfile in backupsetRMAN-08522: input datafile fno=00002 name=D:ORACLEORADATATESTRBS01.DBFRMAN-08522: input datafile fno=00003 name=D:ORACLEORADATATESTUSERS01.DBFRMAN-08522: input datafile fno=00004 name=D:ORACLEORADATATESTTEMP01.DBFRMAN-08522: input datafile fno=00005 name=D:ORACLEORADATATESTTOOLS01.DBFRMAN-08522: input datafile fno=00006 name=D:ORACLEORADATATESTINDX01.DBFRMAN-08013: channel c1: piece 1 createdRMAN-08503: piece handle=D:BACKUPFULL01ENM7EQ_1_1 comment=NONERMAN-08525: backup set complete, elapsed time: 00:00:16RMAN-03023: executing command: partial resyncRMAN-08003: starting partial resync of recovery catalogRMAN-08005: partial resync completeRMAN-03022: compiling command: sqlRMAN-06162: sql statement: alter system archive log currentRMAN-03023: executing command: sqlRMAN-03022: compiling command: releaseRMAN-03023: executing command: releaseRMAN-08031: released channel: c1RMAN>3、删除测试表,在删除之前,便于测试,继续插入数据并应用到归档,并获取删除前的scn号。SQL> insert into test values(2);1 row insertedSQL> commit;Commit completeSQL> select * from test;A---------------------------------------12SQL> alter system switch logfile;Statement processed.SQL> alter system switch logfile;Statement processed.SQL> select max(ktuxescnw * power(2, 32) + ktuxescnb) scn from x$ktuxe;SCN----------31014SQL> drop table test;Table dropped.4、准备恢复到SCN 31014,先关闭数据库,然后启动到mount下SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 53126412 bytesFixed Size 70924 bytesVariable Size 26763264 bytesDatabase Buffers 26214400 bytesRedo Buffers 77824 bytesDatabase mounted.5、开始恢复到改变点SCN 31014RMAN> run{2> allocate channel c1 type disk;3> restore database;4> recover database until scn 31014;5> sql 'ALTER DATABASE OPEN RESETLOGS';6> release channel c1;7> }RMAN-03022: compiling command: allocateRMAN-03023: executing command: allocateRMAN-08030: allocated channel: c1RMAN-08500: channel c1: sid=10 devtype=DISKRMAN-03022: compiling command: restoreRMAN-03022: compiling command: IRESTORERMAN-03023: executing command: IRESTORERMAN-08016: channel c1: starting datafile backupset restoreRMAN-08502: set_count=1 set_stamp=494613682 creation_time=21-MAY-03RMAN-08089: channel c1: specifying datafile(s) to restore from backup setRMAN-08523: restoring datafile 00001 to D:ORACLEORADATATESTSYSTEM01.DBFRMAN-08523: restoring datafile 00002 to D:ORACLEORADATATESTRBS01.DBFRMAN-08523: restoring datafile 00003 to D:ORACLEORADATATESTUSERS01.DBFRMAN-08523: restoring datafile 00004 to D:ORACLEORADATATESTTEMP01.DBFRMAN-08523: restoring datafile 00005 to D:ORACLEORADATATESTTOOLS01.DBFRMAN-08523: restoring datafile 00006 to D:ORACLEORADATATESTINDX01.DBFRMAN-08023: channel c1: restored backup piece 1RMAN-08511: piece handle=D:BACKUPFULL01ENMD5I_1_1 tag=DBFULL params=NULLRMAN-08024: channel c1: restore completeRMAN-03023: executing command: partial resyncRMAN-08003: starting partial resync of recovery catalogRMAN-08005: partial resync completeRMAN-03022: compiling command: recoverRMAN-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 recoveryRMAN-03022: compiling command: recover(4)RMAN-06050: archivelog thread 1 sequence 191 is already on disk as file D:ORACLEORADATATESTARCHIVETESTT001S00191.ARCRMAN-06050: archivelog thread 1 sequence 192 is already on disk as file D:ORACLEORADATATESTARCHIVETESTT001S00192.ARCRMAN-03023: executing command: recover(4)RMAN-08515: archivelog filename=D:ORACLEORADATATESTARCHIVETESTT001S00191.ARC thread=1 sequence=191RMAN-08515: archivelog filename=D:ORACLEORADATATESTARCHIVETESTT001S00192.ARC thread=1 sequence=192RMAN-08055: media recovery completeRMAN-03022: compiling command: sqlRMAN-06162: sql statement: ALTER DATABASE OPEN RESETLOGSRMAN-03023: executing command: sqlRMAN-03022: compiling command: releaseRMAN-03023: executing command: releaseRMAN-08031: released channel: c16、检查数据Database altered.SQL> select * from test;A---------------------------------------12可以看到,表依然存在说明:1、RMAN也可以实现不完全恢复,方法比OS备份恢复的方法更简单可靠2、RMAN可以基于时间,基于改变与基于日志序列的不完全恢复,基于日志序列的恢复可以指定恢复到哪个日志序列,如run { allocate channel ch1 type disk; allocate channel ch2 type 'sbt_tape'; set until logseq 1234 thread 1; restore controlfile to '$ORACLE_HOME/dbs/cf1.f' ; replicate controlfile from '$ORACLE_HOME/dbs/cf1.f'; alter database mount; restore database; recover database; sql "ALTER DATABASE OPEN RESETLOGS";}3、与所有的不完全恢复一样,必须在mount下,restore所有备份数据文件,需要resetlogs4、基于改变的恢复比基于时间的恢复更可靠,但是可能也更复杂,需要知道需要恢复到哪一个改变号(SCN),在正常生产中,获取SCN的办法其实也有很多,如查询数据库字典表(V$archived_log or v$log_history),或分析归档与联机日志(logmnr)等。

第五章 其它恢复案例

5.1 损坏联机日志的恢复方法

5.1.1 损坏非当前联机日志

大家都清楚,联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。1、启动数据库,遇到ORA-00312 or ORA-00313错误,如ORA-00313: open failed for members of log group 1 of thread 1ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'从这里我们知道日志组1的数据文件损坏了从报警文件可以看到更详细的信息2、查看V$log视图SQL> select group#,sequence#,archived,status from v$log;GROUP# SEQUENCE# ARCHIVED STATUS---------- ---------- -------- ----------------1 1 YES INACTIVE2 2 YES INACTIVE3 3 NO CURRENT可以知道,该组是非当前状态,而且已经归档。3、用CLEAR命令重建该日志文件SQL>alter database clear logfile group 1;如果是该日志组还没有归档,则需要用SQL>alter database clear unarchived logfile group 1;4、打开数据库,重新备份数据库SQL>alter database open;说明:1、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear。2、建议clear,特别是强行clear后作一次数据库的全备份。3、此方法适用于归档与非归档数据库

5.1.2 损坏当前联机日志

归档模式下当前日志的损坏有两种情况,一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份B. 通过强制性恢复,但是可能导致数据库不一致。下面分别用来说明这两种恢复方法

5.1.2.1 通过备份来恢复

1、打开数据库,会遇到一个类似的错误ORA-00313: open failed for members of log group 1 of thread 1ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'ORA-27041: unable to open fileOSD-04002: unable to open fileO/S-Error: (OS 2) 系统找不到指定的文件2、查看V$log,发现是当前日志SQL> select group#,sequence#,archived,status from v$log;GROUP# SEQUENCE# ARCHIVED STATUS---------- ---------- -------- ----------------1 1 NO CURRENT2 2 YES INACTIVE3 3 YES INACTIVE3、发现clear不成功SQL> alter database clear unarchived logfile group 1;alter database clear unarchived logfile group 1*ERROR at line 1:ORA-01624: log 1 needed for crash recovery of thread 1ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'4、拷贝有效的数据库的全备份,并不完全恢复数据库可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复recover database until cancel先选择auto,尽量恢复可以利用的归档日志,然后重新recover database until cancel这次输入cancel,完成不完全恢复,也就是说恢复两次。如:SQL> recover database until cancel;Auto……SQL> recover database until cancel;Cancel;5、利用alter database open resetlogs打开数据库说明:1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据2、这种方法适合于归档数据库并且有可用的数据库全备份。3、恢复成功之后,记得再做一次数据库的全备份。4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

5.1.2.2 如果没有备份,进行强制性恢复

1、打开数据库,会遇到一个类似的错误ORA-00313: open failed for members of log group 1 of thread 1ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'ORA-27041: unable to open fileOSD-04002: unable to open fileO/S-Error: (OS 2) 系统找不到指定的文件2、查看V$log,发现是当前日志SQL> select group#,sequence#,archived,status from v$log;GROUP# SEQUENCE# ARCHIVED STATUS---------- ---------- -------- ----------------1 1 NO CURRENT2 2 YES INACTIVE3 3 YES INACTIVE3、发现clear不成功SQL> alter database clear unarchived logfile group 1;alter database clear unarchived logfile group 1*ERROR at line 1:ORA-01624: log 1 needed for crash recovery of thread 1ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'4、把数据库down掉SQL>shutdown immediate5、在init.ora中加入如下参数_allow_resetlogs_corruption=TRUE6、重新启动数据库,利用until cancel恢复SQL>recover database until cancel; Cancel如果出错,不再理会,发出 SQL>alter database open resetlogs;7、数据库被打开后,马上执行一个full export8、shutdown数据库,去掉_all_resetlogs_corrupt参数 9、重建库10、import并完成恢复11、建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;说明:1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析4、全部完成后做一次数据库的全备份5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。