龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

RESETLOGS后没有备份情况下的数据恢复(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
(7)记录当前时刻为B'点。 SQL select to_char(sysdate,'DD-MONTH-YYYY HH24:MI:SS') "DATE" from dual; DATE -------------------------- 04-OCTOBER -2002 09:21:13 (8)以SYSDBA身份查看归档日
(7)记录当前时刻为B'点。

SQL> select to_char(sysdate,'DD-MONTH-YYYY HH24:MI:SS') "DATE" from dual;
DATE
--------------------------
04-OCTOBER -2002 09:21:13


(8)以SYSDBA身份查看归档日志并关闭数据库。

SQL> archive log list
Database log mode    Archive Mode
Automatic archival Enabled
Archive destination   f:\test
Oldest online log sequence 27
Next log sequence to archive  28
Current log sequence  28
SQL> shutdown


(9)模拟丢失所有当前(B'点)数据文件和控制文件。首先保存归档日志文,再把点A的数据文件和控制文件恢复到在线数据文件的目录。

del   f:\test\*.dbf
copy  f:\test\*.arc f:\cool\archa_b
copy  f:\cool\coola\*.dbf f:\test
copy  f:\cool\ctl_a\ctl.ctl f:\test1
copy  f:\cool\ctl_a\ctl.ctl f:\test2
copy  f:\cool\ctl_a\ctl.ctl f:\test3


(10)以SYSDBA身份登录,执行从时刻A到时刻B的基于时间点的不完全媒体恢复,因为媒体恢复过程使用时刻A的控制文件,所以要加上using backup controlfile子句。

conn /@test as sysdba
startup mount
SQL> recover database until time '2002-10-04:09:18:52' using backup controlfile;
ORA-00279: change 690619 generated at 10/04/2002 08:56:01 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH19.ARC
ORA-00280: change 690619 for thread 1 is in sequence #19

Specify log: {<RET&gt;=suggested | filename | AUTO | CANCEL}
f:\cool\archa_b\arch19.arc
ORA-00279: change 690763 generated at 10/04/2002 09:18:21 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH20.ARC
ORA-00280: change 690763 for thread 1 is in sequence #20
ORA-00278: log file 'f:\cool\archa_b\arch19.arc' no longer needed for this
recovery

…… ……


接下来顺序应用归档日志文件直到日志序列号为22的日志文件f:\cool\archa_b\arch22.arc,注意归档日志文件的目录为f:\cool\archa_b。
(11)以SYSDBA身份打开数据库,因为是不完全媒体恢复,所以要使用RESETLOGS选项。查看表demo.a,证实时刻B之前插入的数据已被恢复。

SQL> alter database open resetlogs;
SQL> select * from demo.a;
 I
----------
 1
 2
 3


(12)以demo用户登录数据库,接着向表a插入数据。

insert into a values(7);
commit;
alter system switch logfile;
insert into a values(8);
commit; alter system switch logfile;
insert into a values(9);
commit;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;


(13)记录当前时刻为C点。

SQL> select to_char(sysdate,'DD-MONTH-YYYY HH24:MI:SS') "DATE" from dual;
DATE
--------------------------
04-OCTOBER -2002 10:04:46


(14)以SYSDBA身份查看归档日志并关闭数据库。

SQL> conn /@test as sysdba
Connected.
SQL> archive log list
Database log mode  Archive Mode
Automatic archival Enabled
Archive destination   f:\test
Oldest online log sequence 6
Next log sequence to archive  7
Current log sequence  7
SQL> shutdown


由此可见,RESETLOGS后日志序列号从1重新开始。
(15)不备份C点的数据文件,但要备份C点的控制文件和时刻B和时刻C之间的归档日志。删除当前(时刻C)数据文件,从A点复制数据文件和控制文件到当前位置。

del f:\test\*.dbf
copy f:\test\*.arc f:\cool\archb_c
copy f:\test1\ctl.ctl f:\cool\ctl_c
copy f:\cool\coola\*.dbf f:\test
copy f:\cool\ctl_a\ctl.ctl f:\test1
copy f:\cool\ctl_a\ctl.ctl f:\test2
copy f:\cool\ctl_a\ctl.ctl f:\test3


(16)以SYSDBA身份登录,执行从时刻A到时刻B的基于时间点的不完全媒体恢复,因为媒体恢复过程使用时刻A的控制文件,所以要加上using backup controlfile子句。该步骤类似于步骤(10)。

conn /@test as sysdba
startup mount
recover database until time '2002-10-04:09:18:52' using backup controlfile;


(17)该步骤最为关键!!不要打开数据库。首先关闭数据库,然后把C点的控制文件恢复到在线控制文件的位置,然后用C点的控制文件恢复步骤(16)结束之后的数据文件,恢复进程会自动应用时刻B和时刻C之间的归档日志文件,从序列号为1的归档日志arch1.arc开始。注意:本例执行的是完全媒体恢复,必须在不丢失联机重做日志文件的情况下。否则,要恢复联机重做日志文件。当然,也可执行不完全媒体恢复,恢复到时刻B和时刻C之间的任一时刻。本步骤的关键技术在于要备份时刻C的控制文件,并用它实现跨越时刻B的媒体恢复。

SQL> shutdown
copy f:\cool\ctl_c\ctl.ctl f:\test1
copy f:\cool\ctl_c\ctl.ctl f:\test2
copy f:\cool\ctl_c\ctl.ctl f:\test3 SQL&gt;
conn /@test as sysdba Connected to an idle instance.
SQL&gt; startup mount
SQL&gt; recover database;
ORA-00279: change 690773 generated at 10/04/2002 09:59:31 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH1.ARC
ORA-00280: change 690773 for thread 1 is in sequence #1

Specify log: {&lt;RET&gt;=suggested | filename | AUTO | CANCEL}
f:\cool\archb_c\arch1.arc
ORA-00279: change 690989 generated at 10/04/2002 10:04:11 needed for thread 1
ORA-00289: suggestion : F:\TEST\ARCH2.ARC
ORA-00280: change 690989 for thread 1 is in sequence #2
ORA-00278: log file 'f:\cool\archb_c\arch1.arc' no longer needed for this
recovery
…… ……
Log applied.
Media recovery complete.


(18)打开数据库,查看表demo.a,结果显示没有丢失时刻B和时刻C之间插入的数据7、8、9。

SQL> alter database open;
Database altered. SQL> select * from demo.a;
 I
----------
 1
 2
 3 
 7
 8
 9
 
6rows selected.


(19)马上做数据库的一致备份(冷备份或热备份)。
附加说明

另外要指出,如果忘记或不能提供时刻B的准确时间,可以查看报警日志文件,搜索"change",找到系统更改号(SCN),也可在步骤(10)和步骤(16)中指定基于改变的恢复。命令格式如下:

recover database until change integer_scn [using backup controlfile]


注:integer_scn要用整数SCN替换。
本例中,数据库TEST的报警日志文件为f:\test\bdump\testALRT.log,在其中找到以下片段:

Fri Oct 04 09:57:15 2002
ALTER DATABASE RECOVER LOGFILE ' f:\cool\archa_b\arch22.arc'
Media Recovery Log f:\cool\archa_b\arch22.arc
Incomplete recovery done UNTIL CHANGE 690772
Media Recovery Complete
Completed: ALTER DATABASE RECOVER LOGFILE 'f:\cool\archa_b
Fri Oct 04 09:59:31 2002
alter database open resetlogs

Fri Oct 04 09:59:31 2002
RESETLOGS after incomplete recovery UNTIL CHANGE 690772
Resetting resetlogs activation ID 1770840999 (0x698ce3a7)


由此可发现恢复到时刻B(2002-10-04:09:18:52)的SCN为690772,可以在不完全恢复中指定恢复到更改号690772,如下语句所示:

recover database until change 690773 using backup controlfile;


数据库执行过不完全恢复后,并在以RESETLOGS选项打开之前,SCN已经记录在报警日志文件中,也可以通过查询

select RESETLOGS_CHANGE#-1 from v$database;

找到SCN,这个结果与报警日志中的SCN相同,这样就可以恢复到该SCN。


精彩图集

赞助商链接