Oracle 基于用户管理的不完全恢复


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. --1、until time 恢复(恢复到指定时间点)   
  2.   
  3. sys@SYBO2SZ> conn / as sysdba  
  4. Connected.  
  5. sys@SYBO2SZ> archive log list;  -->当前数据库处于归档模式   
  6. Database log mode              Archive Mode  
  7. Automatic archival             Enabled  
  8. Archive destination            /u02/database/SYBO2SZ/archive/  
  9. Oldest online log sequence     0  
  10. Next log sequence to archive   1  
  11. Current log sequence           1  
  12.   
  13. sys@SYBO2SZ> @db_hot_bak       -->对数据库进行热备份   
  14. ho cp /u02/database/SYBO2SZ/oradata/sysSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak  
  15. ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak  
  16. ho cp /u02/database/SYBO2SZ/oradata/sysauxSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak  
  17. ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ2.dbf /u02/database/SYBO2SZ/backup/hotbak  
  18. ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_system_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak  
  19. ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_account_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak  
  20. ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak  
  21. ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_l_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak  
  22.   
  23. sys@SYBO2SZ> set time on;  
  24. 12:40:07 sys@SYBO2SZ> create table dept as select * from scott.dept;  
  25.   
  26. 12:40:31 sys@SYBO2SZ> create table emp as select * from scott.emp;  
  27.   
  28. 12:40:41 sys@SYBO2SZ>     
  29. 12:40:55 sys@SYBO2SZ> truncate table emp;    -->对表emp进行truncate   
  30.   
  31. Table truncated.  
  32.   
  33. 12:41:02 sys@SYBO2SZ> insert into dept select 50,'DEV','SZ' from dual;  -->为表dept新增两条记录并提交   
  34.   
  35. 12:41:14 sys@SYBO2SZ> insert into dept select 60,'HR','GZ' from dual;  
  36.   
  37. 12:41:19 sys@SYBO2SZ> commit;  
  38.   
  39. Commit complete.  
  40.   
  41. 12:41:22 sys@SYBO2SZ> alter system checkpoint;   -->执行检查点进程以写入日志   
  42.   
  43. System altered.  
  44.   
  45. 12:41:31 sys@SYBO2SZ> shutdown immediate;        -->关闭数据库   
  46.   
  47. 12:42:25 sys@SYBO2SZ> startup mount;             -->启动数据库到mount状态    
  48. ORACLE instance started.  
  49.   
  50. Total System Global Area  599785472 bytes  
  51. Fixed Size                  2074568 bytes  
  52. Variable Size             213911608 bytes  
  53. Database Buffers          377487360 bytes  
  54. Redo Buffers                6311936 bytes  
  55. Database mounted.                          -->下面将备份的数据进行还原,由于并非所有数据文件位于相同路径,因此进行多次cp       
  56. 12:42:36 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/.  
  57.   
  58. 12:42:57 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.  
  59.   
  60. 12:43:24 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.  
  61.   
  62. 12:43:50 sys@SYBO2SZ> recover database until time '2012-08-22:12:40:55';   -->使用 until time 恢复到指定时间点   
  63. Media recovery complete.  
  64. 12:44:07 sys@SYBO2SZ> alter database open resetlogs;                       -->介质分恢复成功之后,resetlog方式打开数据库    
  65.   
  66. Database altered.  
  67.   
  68. 12:44:20 sys@SYBO2SZ> select count(*) from emp;                            -->emp表被成功恢复       
  69.   
  70.   COUNT(*)  
  71. ----------   
  72.         14  
  73.   
  74. 12:44:28 sys@SYBO2SZ> select * from dept;                                  -->由于恢复时间点在插入新记录之前,因此新记录丢失   
  75.   
  76.     DEPTNO DNAME          LOC  
  77. ---------- -------------- -------------   
  78.         10 ACCOUNTING     NEW YORK  
  79.         20 RESEARCH       DALLAS  
  80.         30 SALES          CHICAGO  
  81.         40 OPERATIONS     BOSTON  
  82.   
  83. rows selected.  
  84.   
  85. --2、unitl scn 恢复(基于系统改变号的恢复)   
  86.   
  87. sys@SYBO2SZ> @db_hot_bak              -->热备数据库   
  88.   
  89. sys@SYBO2SZ> select * from dept;  
  90.   
  91.     DEPTNO DNAME          LOC  
  92. ---------- -------------- -------------   
  93.         10 ACCOUNTING     NEW YORK  
  94.         20 RESEARCH       DALLAS  
  95.         30 SALES          CHICAGO  
  96.         40 OPERATIONS     BOSTON  
  97.   
  98. rows selected.  
  99.   
  100. sys@SYBO2SZ> insert into dept select 50,'DEV','SZ' from dual;   -->为表dept新增记录   
  101.   
  102. 1 row created.  
  103.   
  104. sys@SYBO2SZ> commit;  
  105.   
  106. Commit complete.  
  107.   
  108. sys@SYBO2SZ> select current_scn from v$database;   -->查看当前SCN以便后续恢复使用   
  109.   
  110. CURRENT_SCN  
  111. -----------   
  112.      471613  
  113.   
  114. sys@SYBO2SZ> insert into dept select 60,'HR','GZ' from dual;   -->再次为表dept新增记录,以便查看恢复后是否丢失   
  115.   
  116. sys@SYBO2SZ> commit;  
  117.   
  118. Commit complete.  
  119.   
  120. sys@SYBO2SZ> delete from emp where deptno=10;      -->删除表emp上deptno=10的记录   
  121.   
  122. rows deleted.  
  123.   
  124. sys@SYBO2SZ> commit;  
  125.   
  126. Commit complete.  
  127.   
  128. sys@SYBO2SZ> alter system checkpoint;             -->执行检查点进程   
  129.   
  130. System altered.  
  131.   
  132. sys@SYBO2SZ> shutdown immediate;  
  133.   
  134. sys@SYBO2SZ> startup mount;  
  135. ORACLE instance started.  
  136.   
  137. Total System Global Area  599785472 bytes  
  138. Fixed Size                  2074568 bytes  
  139. Variable Size             218105912 bytes  
  140. Database Buffers          373293056 bytes  
  141. Redo Buffers                6311936 bytes  
  142. Database mounted.  
  143.   
  144. sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/.   -->还原数据库   
  145.   
  146. sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.  
  147.   
  148. sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.  
  149.   
  150. sys@SYBO2SZ> recover database until change 471613     -->基于 SCN 恢复数据库   
  151. Media recovery complete.  
  152. sys@SYBO2SZ> alter database open resetlogs;           -->使用resetlog方式打开数据库   
  153.   
  154. Database altered.  
  155.   
  156. sys@SYBO2SZ> select * from dept;                      -->SCN之后的操作丢失   
  157.   
  158.     DEPTNO DNAME          LOC  
  159. ---------- -------------- -------------   
  160.         10 ACCOUNTING     NEW YORK  
  161.         20 RESEARCH       DALLAS  
  162.         30 SALES          CHICAGO  
  163.         40 OPERATIONS     BOSTON  
  164.         50 DEV            SZ  
  165.   
  166. rows selected.  
  167.   
  168. --3、until cancel 恢复(基于放弃的恢复)   
  169.   
  170. --> Author: Robinson Cheng --> Blog: http://blog.csdn.net/robinson_0612    
  171. sys@SYBO2SZ> @db_hot_bak           -->热备数据库   
  172. sys@SYBO2SZ> select * from dept;  
  173.   
  174.     DEPTNO DNAME          LOC  
  175. ---------- -------------- -------------   
  176.         10 ACCOUNTING     NEW YORK  
  177.         20 RESEARCH       DALLAS  
  178.         30 SALES          CHICAGO  
  179.         40 OPERATIONS     BOSTON  
  180.         50 DEV            SZ  
  181.   
  182. sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive    -->当前已经存在的归档日志   
  183. total 348K  
  184. -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc   
  185. -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc   
  186. -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc   
  187.   
  188. sys@SYBO2SZ> alter system switch logfile;                -->切换日志   
  189.   
  190. System altered.  
  191.   
  192. sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive   -->可以看到新增了arch_792003491_1_4.arc   
  193. total 416K  
  194. -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc   
  195. -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc   
  196. -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc   
  197. -rw-r----- 1 oracle oinstall  66K 2012-08-22 17:04 arch_792003491_1_4.arc   
  198.   
  199. sys@SYBO2SZ> insert into dept select 60,'HR','SHANGHAI' from dual;  
  200.   
  201. sys@SYBO2SZ> insert into dept select 70,'INFRA','HONGKONG' from dual;  
  202.   
  203. sys@SYBO2SZ> commit;  
  204.   
  205. Commit complete.  
  206.   
  207. sys@SYBO2SZ> alter system checkpoint;    -->切换日志   
  208.   
  209. System altered.  
  210.   
  211. sys@SYBO2SZ> alter system archive log current;  
  212.   
  213. System altered.  
  214.   
  215. sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive  
  216. total 420K  
  217. -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc   
  218. -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc   
  219. -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc   
  220. -rw-r----- 1 oracle oinstall  66K 2012-08-22 17:04 arch_792003491_1_4.arc   
  221. -rw-r----- 1 oracle oinstall 2.5K 2012-08-22 17:07 arch_792003491_1_5.arc   
  222.   
  223. sys@SYBO2SZ> insert into dept select 80,'MARKET','BEIJING' from dual;  
  224.   
  225. sys@SYBO2SZ> commit;  
  226.   
  227. Commit complete.  
  228.   
  229. sys@SYBO2SZ> alter system archive log current;  
  230.   
  231. System altered.  
  232.   
  233. sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive   -->系统又新增了几个归档日志   
  234. total 424K  
  235. -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc   
  236. -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc   
  237. -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc   
  238. -rw-r----- 1 oracle oinstall  66K 2012-08-22 17:04 arch_792003491_1_4.arc   
  239. -rw-r----- 1 oracle oinstall 2.5K 2012-08-22 17:07 arch_792003491_1_5.arc   
  240. -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:08 arch_792003491_1_6.arc   
  241.   
  242. sys@SYBO2SZ> ho strings /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc | grep HONGKONG  -->新记录已存在于归档日志   
  243. HONGKONG  
  244.   
  245. sys@SYBO2SZ> ho strings /u02/database/SYBO2SZ/archive/arch_792003491_1_6.arc | grep BEIJING  
  246. BEIJING  
  247.   
  248. sys@SYBO2SZ> ho rm /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc     -->模拟部分归档日志丢失   
  249.   
  250. sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive  
  251. total 420K  
  252. -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc   
  253. -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc   
  254. -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc   
  255. -rw-r----- 1 oracle oinstall  66K 2012-08-22 17:04 arch_792003491_1_4.arc   
  256. -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:08 arch_792003491_1_6.arc   
  257.   
  258. sys@SYBO2SZ> shutdown immediate;  
  259.   
  260. sys@SYBO2SZ> startup mount;  
  261. ORACLE instance started.  
  262.   
  263. Total System Global Area  599785472 bytes  
  264. Fixed Size                  2074568 bytes  
  265. Variable Size             243271736 bytes  
  266. Database Buffers          348127232 bytes  
  267. Redo Buffers                6311936 bytes  
  268. Database mounted.  
  269. sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/.  -->还原数据库   
  270.   
  271. sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.  
  272.   
  273. sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.  
  274.   
  275. sys@SYBO2SZ> recover database until cancel;     --> 基于 cancel 恢复数据库   
  276. ORA-00279: change 494124 generated at 08/22/2012 17:02:30 needed for thread 1  
  277. ORA-00289: suggestion : /u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc  
  278. ORA-00280: change 494124 for thread 1 is in sequence #4  
  279.   
  280. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}  
  281. /u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc     -->恢复到尾数为4的归档日志   
  282. ORA-00279: change 494189 generated at 08/22/2012 17:04:46 needed for thread 1  
  283. ORA-00289: suggestion : /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc  
  284. ORA-00280: change 494189 for thread 1 is in sequence #5  
  285. ORA-00278: log file '/u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc' no longer needed for this recovery  
  286.   
  287. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}  
  288. cancel                                                 -->第5个日志文件丢失,输入cancel   
  289. Media recovery cancelled.  
  290. sys@SYBO2SZ> alter database open resetlogs;            --> resetlogs 方式打开数据库   
  291.   
  292. Database altered.  
  293.   
  294. sys@SYBO2SZ> select * from dept;                      -->由于归档日志5丢失,因此后续所有操作的数据丢失   
  295.   
  296.     DEPTNO DNAME          LOC  
  297. ---------- -------------- -------------   
  298.         10 ACCOUNTING     NEW YORK  
  299.         20 RESEARCH       DALLAS  
  300.         30 SALES          CHICAGO  
  301.         40 OPERATIONS     BOSTON  
  302.         50 DEV            SZ  
  303.   
  304. rows selected.    

相关内容