Oracle 数据恢复从恢复类型来说,抛开具体的文件,总共可分为两大类型的恢复,一是完全恢复,一个是不完全恢复。其实,熟悉了Oracle
体系结构之后,对于Oracle恢复就会有一个总体的概念。因为Oracle组成的外围部分,主要由不同的文件来组成,每种不同类型的文件有不同的
作用,因此只要了解了其作用,更利于了解与掌握Oralce数据库的备份与恢复。言归正传,完全恢复即是把数据库恢复到最新的SCN,出故障前
的那一刻,是无损恢复。而不完全恢复即是有损恢复,多用于恢复用户误操作,归档日志丢失等情形。本文主要描述基于用户管理的不完全恢复。
一、不完全恢复特性
1、不完全恢复
不完全恢复仅仅是将数据恢复到某一个特定的时间点或特定的SCN,而不是当前时间点。不完全恢复会影响整个数据库,需要在MOUNT状
态下进行。在不完全恢复成功之后,通常需要使用 resetlogs 选项来打开数据库。当使用resetlogs后,SCN 计数器不会被重置,原来的日
志序号 log sequence 会结束,从新开始新的日志序列号。在Oracle里称之为产生一个新的incarnation。同时Oracle还会重置联机重做日
志内容,因此resetlogs之后建议重新全备数据库。
2、不完全恢复的情形
介质故障(media failure)导致部分或全部联机重做日志(online redo log)损坏
用户操作失误(user error)导致数据丢失,例如,用户由于疏忽而移除了表,提交了无效的数据到表
由于归档重做日志(archived redo log)丢失而无法进行完全恢复(complete recovery)
当前控制文件(control file)丢失,必须使用备份的控制文件打开(open)数据库
3、不完全恢复的步骤
关闭数据库并备份数据库(以防止恢复失败)
启动数据库到mount 状态
还原所有数据文件,同时可以选择还原控制文件(注意需要还原所有数据文件,而不仅仅是受损文件)
将数据库恢复至某个时间点、序列、或系统改变号
使用RESETLOGS关键字打开数据库
4、注意
不完全恢复的前提条件是Oracl数据库够到mount状态,即参数文件,控制文件
在做不完全恢复前建议在恢复前后做一次备份,避免恢复失败导致不必要的损失
不完全恢复完成后,建议不要直接使用OPEN RESETLOGS 命令以读/写模式打开(open)数据库,而应先以只读模式打开数据库,并检查是否已
将数据库恢复到正确的时间点。如果恢复的时间点有误,在没有使用OPEN RESETLOGS命令的情况下,重新执行恢复操作相对简单。
对于恢复结果早于指定的时间点,只需重新执行恢复操作。如果恢复结果超过了指定的时间点,则应再次还原数据库并重新进行恢复。
本文中的示例为便于演示,没有在恢复前备份故障数据,也没有在resetlog之后进行备份。
注:Oracle 10g中已经可以在 resetlogs 之后不备份数据库,恢复的时候能够穿越resetlogs
5、不完全介质恢复的几种类型
基于时间的恢复(Time-based recovery) 将数据恢复到指定的时间点
用户控制的恢复(Cancel-based recovery) 当用户提交CANCEL后停止恢复(此选项在使用RMAN时无效)
基于SCN 的恢复(Change-based recovery) 将数据恢复到指定的SCN
按重做日志序号恢复(Log sequence recovery)将数据恢复到指定的重做日志序号(仅使用RMAN时有效)
二、演示基于用户管理的不完全恢复
- --1、untiltime恢复(恢复到指定时间点)
- sys@SYBO2SZ>conn/assysdba
- Connected.
- sys@SYBO2SZ>archiveloglist;-->当前数据库处于归档模式
- DatabaselogmodeArchiveMode
- AutomaticarchivalEnabled
- Archivedestination/u02/database/SYBO2SZ/archive/
- Oldestonlinelogsequence0
- Nextlogsequencetoarchive1
- Currentlogsequence1
- sys@SYBO2SZ>@db_hot_bak-->对数据库进行热备份
- hocp/u02/database/SYBO2SZ/oradata/sysSYBO2SZ.dbf/u02/database/SYBO2SZ/backup/hotbak
- hocp/u02/database/SYBO2SZ/undo/undotbsSYBO2SZ.dbf/u02/database/SYBO2SZ/backup/hotbak
- hocp/u02/database/SYBO2SZ/oradata/sysauxSYBO2SZ.dbf/u02/database/SYBO2SZ/backup/hotbak
- hocp/u02/database/SYBO2SZ/undo/undotbsSYBO2SZ2.dbf/u02/database/SYBO2SZ/backup/hotbak
- hocp/u02/database/SYBO2SZ/oradata/SYBO2SZ_system_tbl.dbf/u02/database/SYBO2SZ/backup/hotbak
- hocp/u02/database/SYBO2SZ/oradata/SYBO2SZ_account_tbl.dbf/u02/database/SYBO2SZ/backup/hotbak
- hocp/u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_tbl.dbf/u02/database/SYBO2SZ/backup/hotbak
- hocp/u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_l_tbl.dbf/u02/database/SYBO2SZ/backup/hotbak
- sys@SYBO2SZ>settimeon;
- 12:40:07sys@SYBO2SZ>createtabledeptasselect*fromscott.dept;
- 12:40:31sys@SYBO2SZ>createtableempasselect*fromscott.emp;
- 12:40:41sys@SYBO2SZ>
- 12:40:55sys@SYBO2SZ>truncatetableemp;-->对表emp进行truncate
- Tabletruncated.
- 12:41:02sys@SYBO2SZ>insertintodeptselect50,'DEV','SZ'fromdual;-->为表dept新增两条记录并提交
- 12:41:14sys@SYBO2SZ>insertintodeptselect60,'HR','GZ'fromdual;
- 12:41:19sys@SYBO2SZ>commit;
- Commitcomplete.
- 12:41:22sys@SYBO2SZ>altersystemcheckpoint;-->执行检查点进程以写入日志
- Systemaltered.
- 12:41:31sys@SYBO2SZ>shutdownimmediate;-->关闭数据库
- 12:42:25sys@SYBO2SZ>startupmount;-->启动数据库到mount状态
- ORACLEinstancestarted.
- TotalSystemGlobalArea599785472bytes
- FixedSize2074568bytes
- VariableSize213911608bytes
- DatabaseBuffers377487360bytes
- RedoBuffers6311936bytes
- Databasemounted.-->下面将备份的数据进行还原,由于并非所有数据文件位于相同路径,因此进行多次cp
- 12:42:36sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf/u02/database/SYBO2SZ/oradata/.
- 12:42:57sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/sys*.dbf/u02/database/SYBO2SZ/oradata/.
- 12:43:24sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/undotbs*/u02/database/SYBO2SZ/undo/.
- 12:43:50sys@SYBO2SZ>recoverdatabaseuntiltime'2012-08-22:12:40:55';-->使用untiltime恢复到指定时间点
- Mediarecoverycomplete.
- 12:44:07sys@SYBO2SZ>alterdatabaseopenresetlogs;-->介质分恢复成功之后,resetlog方式打开数据库
- Databasealtered.
- 12:44:20sys@SYBO2SZ>selectcount(*)fromemp;-->emp表被成功恢复
- COUNT(*)
- ----------
- 14
- 12:44:28sys@SYBO2SZ>select*fromdept;-->由于恢复时间点在插入新记录之前,因此新记录丢失
- DEPTNODNAMELOC
- -------------------------------------
- 10ACCOUNTINGNEWYORK
- 20RESEARCHDALLAS
- 30SALESCHICAGO
- 40OPERATIONSBOSTON
- 4rowsselected.
- --2、unitlscn恢复(基于系统改变号的恢复)
- sys@SYBO2SZ>@db_hot_bak-->热备数据库
- sys@SYBO2SZ>select*fromdept;
- DEPTNODNAMELOC
- -------------------------------------
- 10ACCOUNTINGNEWYORK
- 20RESEARCHDALLAS
- 30SALESCHICAGO
- 40OPERATIONSBOSTON
- 4rowsselected.
- sys@SYBO2SZ>insertintodeptselect50,'DEV','SZ'fromdual;-->为表dept新增记录
- 1rowcreated.
- sys@SYBO2SZ>commit;
- Commitcomplete.
- sys@SYBO2SZ>selectcurrent_scnfromv$database;-->查看当前SCN以便后续恢复使用
- CURRENT_SCN
- -----------
- 471613
- sys@SYBO2SZ>insertintodeptselect60,'HR','GZ'fromdual;-->再次为表dept新增记录,以便查看恢复后是否丢失
- sys@SYBO2SZ>commit;
- Commitcomplete.
- sys@SYBO2SZ>deletefromempwheredeptno=10;-->删除表emp上deptno=10的记录
- 3rowsdeleted.
- sys@SYBO2SZ>commit;
- Commitcomplete.
- sys@SYBO2SZ>altersystemcheckpoint;-->执行检查点进程
- Systemaltered.
- sys@SYBO2SZ>shutdownimmediate;
- sys@SYBO2SZ>startupmount;
- ORACLEinstancestarted.
- TotalSystemGlobalArea599785472bytes
- FixedSize2074568bytes
- VariableSize218105912bytes
- DatabaseBuffers373293056bytes
- RedoBuffers6311936bytes
- Databasemounted.
- sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf/u02/database/SYBO2SZ/oradata/.-->还原数据库
- sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/sys*.dbf/u02/database/SYBO2SZ/oradata/.
- sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/undotbs*/u02/database/SYBO2SZ/undo/.
- sys@SYBO2SZ>recoverdatabaseuntilchange471613-->基于SCN恢复数据库
- Mediarecoverycomplete.
- sys@SYBO2SZ>alterdatabaseopenresetlogs;-->使用resetlog方式打开数据库
- Databasealtered.
- sys@SYBO2SZ>select*fromdept;-->SCN之后的操作丢失
- DEPTNODNAMELOC
- -------------------------------------
- 10ACCOUNTINGNEWYORK
- 20RESEARCHDALLAS
- 30SALESCHICAGO
- 40OPERATIONSBOSTON
- 50DEVSZ
- 5rowsselected.
- --3、untilcancel恢复(基于放弃的恢复)
- -->Author:RobinsonCheng-->Blog:http://blog.youkuaiyun.com/robinson_0612
- sys@SYBO2SZ>@db_hot_bak-->热备数据库
- sys@SYBO2SZ>select*fromdept;
- DEPTNODNAMELOC
- -------------------------------------
- 10ACCOUNTINGNEWYORK
- 20RESEARCHDALLAS
- 30SALESCHICAGO
- 40OPERATIONSBOSTON
- 50DEVSZ
- sys@SYBO2SZ>hols-hltr/u02/database/SYBO2SZ/archive-->当前已经存在的归档日志
- total348K
- -rw-r-----1oracleoinstall340K2012-08-2217:01arch_792003491_1_1.arc
- -rw-r-----1oracleoinstall2.0K2012-08-2217:01arch_792003491_1_2.arc
- -rw-r-----1oracleoinstall1.0K2012-08-2217:02arch_792003491_1_3.arc
- sys@SYBO2SZ>altersystemswitchlogfile;-->切换日志
- Systemaltered.
- sys@SYBO2SZ>hols-hltr/u02/database/SYBO2SZ/archive-->可以看到新增了arch_792003491_1_4.arc
- total416K
- -rw-r-----1oracleoinstall340K2012-08-2217:01arch_792003491_1_1.arc
- -rw-r-----1oracleoinstall2.0K2012-08-2217:01arch_792003491_1_2.arc
- -rw-r-----1oracleoinstall1.0K2012-08-2217:02arch_792003491_1_3.arc
- -rw-r-----1oracleoinstall66K2012-08-2217:04arch_792003491_1_4.arc
- sys@SYBO2SZ>insertintodeptselect60,'HR','SHANGHAI'fromdual;
- sys@SYBO2SZ>insertintodeptselect70,'INFRA','HONGKONG'fromdual;
- sys@SYBO2SZ>commit;
- Commitcomplete.
- sys@SYBO2SZ>altersystemcheckpoint;-->切换日志
- Systemaltered.
- sys@SYBO2SZ>altersystemarchivelogcurrent;
- Systemaltered.
- sys@SYBO2SZ>hols-hltr/u02/database/SYBO2SZ/archive
- total420K
- -rw-r-----1oracleoinstall340K2012-08-2217:01arch_792003491_1_1.arc
- -rw-r-----1oracleoinstall2.0K2012-08-2217:01arch_792003491_1_2.arc
- -rw-r-----1oracleoinstall1.0K2012-08-2217:02arch_792003491_1_3.arc
- -rw-r-----1oracleoinstall66K2012-08-2217:04arch_792003491_1_4.arc
- -rw-r-----1oracleoinstall2.5K2012-08-2217:07arch_792003491_1_5.arc
- sys@SYBO2SZ>insertintodeptselect80,'MARKET','BEIJING'fromdual;
- sys@SYBO2SZ>commit;
- Commitcomplete.
- sys@SYBO2SZ>altersystemarchivelogcurrent;
- Systemaltered.
- sys@SYBO2SZ>hols-hltr/u02/database/SYBO2SZ/archive-->系统又新增了几个归档日志
- total424K
- -rw-r-----1oracleoinstall340K2012-08-2217:01arch_792003491_1_1.arc
- -rw-r-----1oracleoinstall2.0K2012-08-2217:01arch_792003491_1_2.arc
- -rw-r-----1oracleoinstall1.0K2012-08-2217:02arch_792003491_1_3.arc
- -rw-r-----1oracleoinstall66K2012-08-2217:04arch_792003491_1_4.arc
- -rw-r-----1oracleoinstall2.5K2012-08-2217:07arch_792003491_1_5.arc
- -rw-r-----1oracleoinstall2.0K2012-08-2217:08arch_792003491_1_6.arc
- sys@SYBO2SZ>hostrings/u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc|grepHONGKONG-->新记录已存在于归档日志
- HONGKONG
- sys@SYBO2SZ>hostrings/u02/database/SYBO2SZ/archive/arch_792003491_1_6.arc|grepBEIJING
- BEIJING
- sys@SYBO2SZ>horm/u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc-->模拟部分归档日志丢失
- sys@SYBO2SZ>hols-hltr/u02/database/SYBO2SZ/archive
- total420K
- -rw-r-----1oracleoinstall340K2012-08-2217:01arch_792003491_1_1.arc
- -rw-r-----1oracleoinstall2.0K2012-08-2217:01arch_792003491_1_2.arc
- -rw-r-----1oracleoinstall1.0K2012-08-2217:02arch_792003491_1_3.arc
- -rw-r-----1oracleoinstall66K2012-08-2217:04arch_792003491_1_4.arc
- -rw-r-----1oracleoinstall2.0K2012-08-2217:08arch_792003491_1_6.arc
- sys@SYBO2SZ>shutdownimmediate;
- sys@SYBO2SZ>startupmount;
- ORACLEinstancestarted.
- TotalSystemGlobalArea599785472bytes
- FixedSize2074568bytes
- VariableSize243271736bytes
- DatabaseBuffers348127232bytes
- RedoBuffers6311936bytes
- Databasemounted.
- sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf/u02/database/SYBO2SZ/oradata/.-->还原数据库
- sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/sys*.dbf/u02/database/SYBO2SZ/oradata/.
- sys@SYBO2SZ>hocp/u02/database/SYBO2SZ/backup/hotbak/undotbs*/u02/database/SYBO2SZ/undo/.
- sys@SYBO2SZ>recoverdatabaseuntilcancel;-->基于cancel恢复数据库
- ORA-00279:change494124generatedat08/22/201217:02:30neededforthread1
- ORA-00289:suggestion:/u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc
- ORA-00280:change494124forthread1isinsequence#4
- Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
- /u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc-->恢复到尾数为4的归档日志
- ORA-00279:change494189generatedat08/22/201217:04:46neededforthread1
- ORA-00289:suggestion:/u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc
- ORA-00280:change494189forthread1isinsequence#5
- ORA-00278:logfile'/u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc'nolongerneededforthisrecovery
- Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
- cancel-->第5个日志文件丢失,输入cancel
- Mediarecoverycancelled.
- sys@SYBO2SZ>alterdatabaseopenresetlogs;-->resetlogs方式打开数据库
- Databasealtered.
- sys@SYBO2SZ>select*fromdept;-->由于归档日志5丢失,因此后续所有操作的数据丢失
- DEPTNODNAMELOC
- -------------------------------------
- 10ACCOUNTINGNEWYORK
- 20RESEARCHDALLAS
- 30SALESCHICAGO
- 40OPERATIONSBOSTON
- 50DEVSZ
- 5rowsselected.
三、更多参考
有关基于用户管理的备份和备份恢复的概念请参考
Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)
有关RMAN的备份恢复与管理请参考
RMAN备份路径困惑(使用plus archivelog时)
有关ORACLE体系结构请参考
本文深入探讨了Oracle数据恢复的两大类型——完全恢复与不完全恢复,详细解释了各自的特点、适用场景及操作步骤。不完全恢复在介质故障、用户操作失误或归档日志丢失等情况下的应用尤为关键,通过具体示例展示了如何进行基于用户管理的不完全恢复,包括恢复时间点、SCN或日志序号的选择及后续操作。
538

被折叠的 条评论
为什么被折叠?



