Oracle——不完全恢复

本文详细介绍了Oracle数据库的不完全恢复,包括时间恢复、取消恢复、基于SCN的恢复等,通过实例演示了恢复过程,如恢复到特定时间点、处理丢失的日志文件,并涉及RMAN的不完全恢复操作。

 不完全恢复分为用户不完全恢复和RMAN不完全恢复。若联机重做日志文件或者归档日志文件有丢失,则只能进行不完全恢复。


一.不完全恢复的分类


1.time recover选项,指定恢复到某个时间点,常用。


2.cancel recover选项,停止在某个日志切换序列号处,通常只在归档日志文件受损或丢失的情况下使用,从而无法进一步恢复。


3.change-base recover选项,指定到某个SCN号。


4.在所有情况下都将恢复到恰好在请求的停止点之前的变更向量,比如将不会应用到指定的SCN



二.执行不完全恢复的步骤


1.关闭和备份数据库或者某些数据文件;

2.加载数据库。

3.还原数据文件(必要时还原控制文件);

4.将数据库恢复到某个时间点;

5.使用重置日志(resetlog)打开数据库。


三.基于时间的恢复


     指定到某个时间点,但是要注意其时间的格式是不允许改变的,无论在SQL*PLUS会话中如何设置它的NLS_DATE_FORMAT ,日期必须是yyyy-mm-dd:hh24:mi:ss


1.在用户Dave下创建个表sunny,插入数据,


SQL> create table sunny  (id int,name char(10))  tablespace  app1;

Table created.


SQL> insert into sunny values(0,'baby');

1 row created.


SQL> commit;

Commit complete.


手动发生检查点,

SQL> alter system checkpoint;

System altered.

这样数据写进了数据文件app1_01.dbf


2.关闭数据库,对app1_01.dbf数据文件做个备份,插入新的数据


备份数据文件,

[oracle@oracle11g wilson]$ cp   app1_01.dbf     /u01/ubackup/cold


打开数据库,插入新数据

SQL> insert into sunny values(1,'Jasper');

1 row created.


SQL> commit;

Commit complete.


查看当前时间,

SQL> select to_char(sysdate,'DD-MON-YYYY HH24:MI:SS')  from dual;

TO_CHAR(SYSDATE,'DD-MON-YYYYH

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

04-SEP-2013 12:52:34


3.删除表,再恢复回来,

SQL> drop table sunny;

Table dropped.


关闭数据库,删除数据文件,再还原备份的数据文件(这个文件中不含有新的数据),

[oracle@oracle11g wilson]$ rm -f app1_01.dbf 


还原数据文件,

[oracle@oracle11g backup]$ cp   /u01/backup/app1_01.dbf  /u01/oradata/wilson/


4.将数据库置于mount状态,恢复表

SQL> recover database until time '2013-09-04:12:52:22';

Media recovery complete.


指定时间点,打开数据库,

SQL> alter database  open resetlogs;

即可。


四.基于cancel的恢复


1.关闭数据库,备份数据库,命令如下,

[root@oracle11g wilson]# cp /u01/oradata/wilson/*  /u01/ubackup/cold/


2.打开数据库,在表Dave.sunny中插入数据,


SQL> insert into sunny values(3,'memory');

1 row created.


SQL> commit;——————数据存于联机重做日志中

Commit complete.


SQL> alter system checkpoint;——————数据存于数据文件中

System altered.


SQL> alter system  archive log current;——————数据存于归档日志中

System altered.


可以看到记录(3,‘memory’)存于数据文件,联机重做日志文件和归档日志文件中。


3.插入新数据,不放在归档日志中


SQL> insert into sunny values(4,'king');

1 row created.


SQL> commit;——————数据存于联机重做日志中

Commit complete.


SQL> alter system checkpoint;——————数据存于数据文件中

System altered.


4.先备份控制文件

SQL> alter database backup controlfile to trace as '/tmp/wilson.sql';

Database altered.


然后除了归档日志文件,把其它文件都删除了,关闭数据库,把备份的数据文件还原(没有控制文件和联机重做日志文件),

[root@oracle11g wilson]# cp   /u01/ubackup/cold/*.dbf   /u01/oradata/wilson/


5.修改备份的控制文件脚本


  如果不用脚本创建,可以复制个二进制的控制文件,复制过去即可;


在脚本中有两组恢复方法:a.在联机重做日志正常的情况下,

                        b.在联机重做日志不正常的情况下,


a方法在用户管理的恢复(三)中使用了,请参照:Oracle—用户管理的完全恢复(三)


这里使用b方法,打开脚本修改一下,


STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "WILSON" RESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 '/u01/oradata/wilson/redo01.log'  SIZE 50M BLOCKSIZE 512,

  GROUP 2 '/u01/oradata/wilson/redo02.log'  SIZE 50M BLOCKSIZE 512,

  GROUP 3 '/u01/oradata/wilson/redo03.log'  SIZE 50M BLOCKSIZE 512

DATAFILE

  '/u01/oradata/wilson/system01.dbf',

  '/u01/oradata/wilson/sysaux01.dbf',

  '/u01/oradata/wilson/undotbs01.dbf',

  '/u01/oradata/wilson/users01.dbf',

  '/u01/oradata/wilson/example01.dbf',

  '/u01/oradata/wilson/app1_01.dbf',

  '/u01/oradata/wilson/smallundo1.dbf'

CHARACTER SET AL32UTF8

;


注意上面语句之间能有空格行,

中间略..........


下面语句是脚本中的,也删除了,可以手工执行,

RECOVER DATABASE USING BACKUP CONTROLFILE

ALTER DATABASE OPEN RESETLOGS;

ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/wilson/temp01.dbf'

     SIZE 30408704  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER TABLESPACE MYTEMP ADD TEMPFILE '/u01/oradata/wilson/mytemp01.dbf'

     SIZE 104857600  REUSE AUTOEXTEND OFF;


执行脚本,

SQL> @/tmp/wilson.sql



执行下面语句,因为联机重做日志丢失,所以恢复到某个日志切换序列号处,

SQL> recover database using backup controlfile until  cancel;


提示,输入cancel


打开数据库,

SQL> alter database open resetlogs;


然后执行恢复临时表空间,

ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/wilson/temp01.dbf'

     SIZE 30408704  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

ALTER TABLESPACE MYTEMP ADD TEMPFILE '/u01/oradata/wilson/mytemp01.dbf'

     SIZE 104857600  REUSE AUTOEXTEND OFF;

是脚本中的语句。


为什么删除脚本最后的四条语句?   因为没有了联机重做日志文件,所以脚本中RECOVER DATABASE USING BACKUP CONTROLFILE命令会出错,必须要使用until cancel进行人工干预。



6.查看表Dave.sunny


SQL> select * from sunny;

        ID NAME

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

         3 memory

         0 baby

         1 Jasper


可以看到没有了记录(4’king’),这是因为记录(3’memory’)被存放到了归档日志文件中,而记录4没有,所以只能是不完全的恢复。


五.基于系统更改号的恢复

找到需要指定恢复的SCN号,然后使用命令recover database until change 号即可;

方法和上面说明的差不多。



六.RMAN的不完全恢复

它和用户管理的不完全恢复差不多,只是是使用RMAN来进行的,下面来举个例子来说明一下,


1.Dave用户下,创建表和插入数据,

SQL> create table test (id int,name char(10));

Table created.


SQL> insert  into test values(0,'heihei');

1 row created.


SQL> commit;


写到数据文件中

SQL> alter system  checkpoint;

System altered.


2.RMAN连接上数据库,备份数据文件

RMAN> backup   database  format    '/u01/backup/rman_hot_%U';


3.记录时间和删除表

SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;

TO_CHAR(SYSDATE,'YY

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

2013-09-06:00:53:43


SQL> drop  table test;

Table dropped.

现在怎么恢复表? 在10g版本引用了闪回技术,可以使不完全恢复更方便。


4.在这里数据库进入mount状态,RMAN连接数据执行脚本


RMAN> run{

2> allocate channel c1 type disk;

3> allocate channel c2 type disk;

4> allocate channel c3 type disk;

5> set until time  “2013-09-06:00:53:43';

6> restore  database;

7> recover  database;

8> alter database open resetlogs;}

即可。


RMAN的不完全恢复还可以指定日志文件的sequence号,命令如下,

Set  until sequence 120  thread 1;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值