技术活动
CUUG学员就业信息
学员感言、就业资讯
报名热线
文档
当前您的位置:首页 > 技术活动 > 技术中心 > 文档
Oracle 基于用户管理的不完全恢复-CUUG

  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、until time 恢复(恢复到指定时间点)

  sys@SYBO2SZ> conn / as sysdba

  Connected.

  sys@SYBO2SZ> archive log list; -->当前数据库处于归档模式

  Database log mode Archive Mode

  Automatic archival Enabled

  Archive destination /u02/database/SYBO2SZ/archive/

  Oldest online log sequence 0

  Next log sequence to archive 1

  Current log sequence 1

  sys@SYBO2SZ> @db_hot_bak -->对数据库进行热备份

  ho cp /u02/database/SYBO2SZ/oradata/sysSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak

  ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak

  ho cp /u02/database/SYBO2SZ/oradata/sysauxSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak

  ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ2.dbf /u02/database/SYBO2SZ/backup/hotbak

  ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_system_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak

  ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_account_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak

  ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak

  ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_l_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak

  sys@SYBO2SZ> set time on;

  12:40:07 sys@SYBO2SZ> create table dept as select * from scott.dept;

  12:40:31 sys@SYBO2SZ> create table emp as select * from scott.emp;

  12:40:41 sys@SYBO2SZ>

  12:40:55 sys@SYBO2SZ> truncate table emp; -->对表emp进行truncate

  Table truncated.

  12:41:02 sys@SYBO2SZ> insert into dept select 50,'DEV','SZ' from dual; -->为表dept新增两条记录并提交

  12:41:14 sys@SYBO2SZ> insert into dept select 60,'HR','GZ' from dual;

  12:41:19 sys@SYBO2SZ> commit;

  Commit complete.

  12:41:22 sys@SYBO2SZ> alter system checkpoint; -->执行检查点进程以写入日志

  System altered.

  12:41:31 sys@SYBO2SZ> shutdown immediate; -->关闭数据库

  12:42:25 sys@SYBO2SZ> startup mount; -->启动数据库到mount状态

  ORACLE instance started.

  Total System Global Area 599785472 bytes

  Fixed Size 2074568 bytes

  Variable Size 213911608 bytes

  Database Buffers 377487360 bytes

  Redo Buffers 6311936 bytes

  Database mounted. -->下面将备份的数据进行还原,由于并非所有数据文件位于相同路径,因此进行多次cp

  12:42:36 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/.

  12:42:57 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.

  12:43:24 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.

  12:43:50 sys@SYBO2SZ> recover database until time '2012-08-22:12:40:55'; -->使用 until time 恢复到指定时间点

  Media recovery complete.

  12:44:07 sys@SYBO2SZ> alter database open resetlogs; -->介质分恢复成功之后,resetlog方式打开数据库

  Database altered.

  12:44:20 sys@SYBO2SZ> select count(*) from emp; -->emp表被成功恢复

  COUNT(*)

  ----------

  14

  12:44:28 sys@SYBO2SZ> select * from dept; -->由于恢复时间点在插入新记录之前,因此新记录丢失

  DEPTNO DNAME LOC

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

  10 ACCOUNTING NEW YORK

  20 RESEARCH DALLAS

  30 SALES CHICAGO

  40 OPERATIONS BOSTON

  4 rows selected.

  --2、unitl scn 恢复(基于系统改变号的恢复)

  sys@SYBO2SZ> @db_hot_bak -->热备数据库

  sys@SYBO2SZ> select * from dept;

  DEPTNO DNAME LOC

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

  10 ACCOUNTING NEW YORK

  20 RESEARCH DALLAS

  30 SALES CHICAGO

  40 OPERATIONS BOSTON

  4 rows selected.

  sys@SYBO2SZ> insert into dept select 50,'DEV','SZ' from dual; -->为表dept新增记录

  1 row created.

  sys@SYBO2SZ> commit;

  Commit complete.

  sys@SYBO2SZ> select current_scn from v$database; -->查看当前SCN以便后续恢复使用

  CURRENT_SCN

  -----------

  471613

  sys@SYBO2SZ> insert into dept select 60,'HR','GZ' from dual; -->再次为表dept新增记录,以便查看恢复后是否丢失

  sys@SYBO2SZ> commit;

  Commit complete.

  sys@SYBO2SZ> delete from emp where deptno=10; -->删除表emp上deptno=10的记录

  3 rows deleted.

  sys@SYBO2SZ> commit;

  Commit complete.

  sys@SYBO2SZ> alter system checkpoint; -->执行检查点进程

  System altered.

  sys@SYBO2SZ> shutdown immediate;

  sys@SYBO2SZ> startup mount;

  ORACLE instance started.

  Total System Global Area 599785472 bytes

  Fixed Size 2074568 bytes

  Variable Size 218105912 bytes

  Database Buffers 373293056 bytes

  Redo Buffers 6311936 bytes

  Database mounted.

  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/. -->还原数据库

  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.

  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.

  sys@SYBO2SZ> recover database until change 471613 -->基于 SCN 恢复数据库

  Media recovery complete.

  sys@SYBO2SZ> alter database open resetlogs; -->使用resetlog方式打开数据库

  Database altered.

  sys@SYBO2SZ> select * from dept; -->SCN之后的操作丢失

  DEPTNO DNAME LOC

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

  10 ACCOUNTING NEW YORK

  20 RESEARCH DALLAS

  30 SALES CHICAGO

  40 OPERATIONS BOSTON

  50 DEV SZ

  5 rows selected.

  --3、until cancel 恢复(基于放弃的恢复)

  sys@SYBO2SZ> @db_hot_bak -->热备数据库

  sys@SYBO2SZ> select * from dept;

  DEPTNO DNAME LOC

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

  10 ACCOUNTING NEW YORK

  20 RESEARCH DALLAS

  30 SALES CHICAGO

  40 OPERATIONS BOSTON

  50 DEV SZ

  sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive -->当前已经存在的归档日志

  total 348K

  -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc

  -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc

  -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc

  sys@SYBO2SZ> alter system switch logfile; -->切换日志

  System altered.

  sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive -->可以看到新增了arch_792003491_1_4.arc

  total 416K

  -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc

  -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc

  -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc

  -rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc

  sys@SYBO2SZ> insert into dept select 60,'HR','SHANGHAI' from dual;

  sys@SYBO2SZ> insert into dept select 70,'INFRA','HONGKONG' from dual;

  sys@SYBO2SZ> commit;

  Commit complete.

  sys@SYBO2SZ> alter system checkpoint; -->切换日志

  System altered.

  sys@SYBO2SZ> alter system archive log current;

  System altered.

  sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive

  total 420K

  -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc

  -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc

  -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc

  -rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc

  -rw-r----- 1 oracle oinstall 2.5K 2012-08-22 17:07 arch_792003491_1_5.arc

  sys@SYBO2SZ> insert into dept select 80,'MARKET','BEIJING' from dual;

  sys@SYBO2SZ> commit;

  Commit complete.

  sys@SYBO2SZ> alter system archive log current;

  System altered.

  sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive -->系统又新增了几个归档日志

  total 424K

  -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc

  -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc

  -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc

  -rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc

  -rw-r----- 1 oracle oinstall 2.5K 2012-08-22 17:07 arch_792003491_1_5.arc

  -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:08 arch_792003491_1_6.arc

  sys@SYBO2SZ> ho strings /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc | grep HONGKONG -->新记录已存在于归档日志

  HONGKONG

  sys@SYBO2SZ> ho strings /u02/database/SYBO2SZ/archive/arch_792003491_1_6.arc | grep BEIJING

  BEIJING

  sys@SYBO2SZ> ho rm /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc -->模拟部分归档日志丢失

  sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive

  total 420K

  -rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc

  -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc

  -rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc

  -rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc

  -rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:08 arch_792003491_1_6.arc

  sys@SYBO2SZ> shutdown immediate;

  sys@SYBO2SZ> startup mount;

  ORACLE instance started.

  Total System Global Area 599785472 bytes

  Fixed Size 2074568 bytes

  Variable Size 243271736 bytes

  Database Buffers 348127232 bytes

  Redo Buffers 6311936 bytes

  Database mounted.

  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/. -->还原数据库

  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.

  sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.

  sys@SYBO2SZ> recover database until cancel; --> 基于 cancel 恢复数据库

  ORA-00279: change 494124 generated at 08/22/2012 17:02:30 needed for thread 1

  ORA-00289: suggestion : /u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc

  ORA-00280: change 494124 for thread 1 is in sequence #4

  Specify log: {=suggested | filename | AUTO | CANCEL}

  /u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc -->恢复到尾数为4的归档日志

  ORA-00279: change 494189 generated at 08/22/2012 17:04:46 needed for thread 1

  ORA-00289: suggestion : /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc

  ORA-00280: change 494189 for thread 1 is in sequence #5

  ORA-00278: log file '/u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc' no longer needed for this recovery

  Specify log: {=suggested | filename | AUTO | CANCEL}

  cancel -->第5个日志文件丢失,输入cancel

  Media recovery cancelled.

  sys@SYBO2SZ> alter database open resetlogs; --> resetlogs 方式打开数据库

  Database altered.

  sys@SYBO2SZ> select * from dept; -->由于归档日志5丢失,因此后续所有操作的数据丢失

  DEPTNO DNAME LOC

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

  10 ACCOUNTING NEW YORK

  20 RESEARCH DALLAS

  30 SALES CHICAGO

  40 OPERATIONS BOSTON

  50 DEV SZ

  5 rows selected.