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)数据库,并产生一个新的incarnation       检查数据库是否恢复到正确的时间点,也就是能否找到所需的数据,如果恢复的时间点有误,需要重置数据库incarnation进行再次恢复

      本文中的示例为便于演示,没有在恢复前备份故障数据,也没有在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 恢复(基于放弃的恢复)

--> Author: Robinson Cheng --> Blog: http://blog.csdn.net/robinson_0612 
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: {<RET>=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: {<RET>=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.        

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DeveWork

Mac OS X巧用AppleScript 制作网络位置切换自动化脚本(自动配置PAC 文件)

事情是这样的,自带的Macbook Air 在实习单位入的是办公网,办公网走自动代理(需要配置PAC 文件)。同时回来宿舍或家里需要民用的宽带网络。切换的时候出...

5445
来自专栏社区的朋友们

Node 架构从三层到 N 层,实现代码重用和解耦

三层架构通常意义上是将整个业务应用划分为:控制层、业务逻辑层以及数据访问层,三层架构在 Java Web 项目中很常见,那么这种架构能否运用在 Node 项目中...

2.2K2
来自专栏24K纯开源

Mac OS X平台下QuickLook开发教程

一、引言       Quick Look技术是Apple在Mac OS X 10.5中引入的一种用于快速查看文件内容的技术。用户只需要选中文件单击空格键即可快...

3038
来自专栏大内老A

Windows安全认证是如何进行的?[Kerberos篇]

最近一段时间都在折腾安全(Security)方面的东西,比如Windows认证、非对称加密、数字证书、数字签名、TLS/SSL、WS-Security等。如果时...

2347
来自专栏程序员互动联盟

【专业知识】Android中的磁盘缓存

前言: 在上一篇文章中介绍了内存缓存,内存缓存的优点就是很快,但是它又有缺点: 空间小,内存缓存不可能很大; 内存紧张时可能被清除; 在应用退出时就会消失,做不...

3669
来自专栏hbbliyong

WPF刷新界面之坎坷路

   项目需要一个硬件检测功能,需要用到界面刷新,刚开始想用个定时器,对检测过的硬设定时添加后刷新界面。 但是很遗憾,定时器并不能进行刷新。后台检测List数据...

3967
来自专栏全栈架构

Elasticsearch Java API 搜索之Scrolls(四)

首先需要阅读 [scroll documentation](https://www.elastic.co/guide/en/elasticsearch/refe...

4914
来自专栏我的博客

【算法】猴子大王

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到...

37113
来自专栏Jerry的SAP技术分享

通过一个实际例子理解Kubernetes里pod的自动scale - 水平自动伸缩

kubectl scale命令用于程序在负载加重或缩小时进行pod扩容或缩小,我们通过一些实际例子来观察scale命令到底能达到什么效果。

1473
来自专栏Kubernetes

Kubernetes如何通过Devi

Device Plugins Device Pulgins在Kubernetes 1.10中是beta特性,开始于Kubernetes 1.8,用来给第三方设备...

5238

扫码关注云+社区

领取腾讯云代金券