记一次current online redo log缺失后的恢复-转

记一次current online redo log缺失后的恢复

| 1 Comment | No TrackBacks

有一位MSN上的朋友今天问我了一个关于ORA-600[4000]错误的恢复,他是这么做的:

1、  插入了2000条记录,但不commit

2、  马上shutdown abort

3、  接着rm掉所有的redo log

他尝试过一些恢复手段后,碰到了ORA-600[4000]错误。

此时他陷入了一种两难的境地:如果他不用_corrupted_rollback_segments,则上述ORA-600[4000]无法解决;如果他用了_corrupted_rollback_segments,则oracle报错:

ORA-00704: bootstrap process failure

ORA-00604: error occurred at recursive SQL level 2

ORA-01555: snapshot too old: rollback segment number  with name "" too small

 

我看了他发过来的trace文件和操作步骤,里面还是有一些不必要的操作。

 

这样吧,我在这里就把他做过的事情再做一遍,然后我会尝试恢复上述数据库,希望如下的过程能对朋友们有所帮助

 

首先我插入2000条记录但不commit

SQL_testdb>conn scott/tiger@testdb;

Connected.

SQL_testdb>create table testtb (type number,ts timestamp);

 

Table created.

 

SQL_testdb>begin

  2  for i in 1..2000 loop

  3  insert into testtb values (i,sysdate);

  4  end loop;

  5  end;

  6  /

 

PL/SQL procedure successfully completed.

 

然后起另外一个session,执行shutdown abort

SQL_testdb>shutdown abort

ORACLE instance shut down.

 

最后我把所有的redo logrm掉:

$ ls -l

total 2543072

-rw-r-----   1 oracle   dba         1531904 Dec 23 18:59 control01.ctl

-rw-r-----   1 oracle   dba         1531904 Dec 23 18:59 control02.ctl

-rw-r-----   1 oracle   dba         1531904 Dec 23 18:59 control03.ctl

-rw-r--r--   1 oracle   dba        20979712 Dec 23 18:27 cwmlite01.dbf

-rw-r--r--   1 oracle   dba        20979712 Dec 23 18:27 drsys01.dbf

-rw-r--r--   1 oracle   dba       144842752 Dec 23 18:27 example01.dbf

-rw-r--r--   1 oracle   dba        26222592 Dec 23 18:27 indx01.dbf

-rw-r--r--   1 oracle   dba              18 Dec 23 18:47 login.sql

-rw-r--r--   1 oracle   dba        20979712 Dec 23 18:27 odm01.dbf

-rw-r-----   1 oracle   dba       104858112 Dec 23 18:27 redo01.log

-rw-r-----   1 oracle   dba       104858112 Dec 23 18:27 redo02.log

-rw-r-----   1 oracle   dba       104858112 Dec 23 18:59 redo03.log

-rw-r--r--   1 oracle   dba       419438592 Dec 23 18:58 system01.dbf

-rw-r--r--   1 oracle   dba        42999808 Dec 23 18:17 temp01.dbf

-rw-r--r--   1 oracle   dba        10493952 Dec 23 18:27 tools01.dbf

-rw-r--r--   1 oracle   dba       209723392 Dec 23 18:59 undotbs01.dbf

-rw-r--r--   1 oracle   dba        26222592 Dec 23 18:27 users01.dbf

-rw-r--r--   1 oracle   dba        39985152 Dec 23 18:27 xdb01.dbf

$ rm redo*.log

$ ls -l

total 1928648

-rw-r-----   1 oracle   dba         1531904 Dec 23 18:59 control01.ctl

-rw-r-----   1 oracle   dba         1531904 Dec 23 18:59 control02.ctl

-rw-r-----   1 oracle   dba         1531904 Dec 23 18:59 control03.ctl

-rw-r--r--   1 oracle   dba        20979712 Dec 23 18:27 cwmlite01.dbf

-rw-r--r--   1 oracle   dba        20979712 Dec 23 18:27 drsys01.dbf

-rw-r--r--   1 oracle   dba       144842752 Dec 23 18:27 example01.dbf

-rw-r--r--   1 oracle   dba        26222592 Dec 23 18:27 indx01.dbf

-rw-r--r--   1 oracle   dba              18 Dec 23 18:47 login.sql

-rw-r--r--   1 oracle   dba        20979712 Dec 23 18:27 odm01.dbf

-rw-r--r--   1 oracle   dba       419438592 Dec 23 18:58 system01.dbf

-rw-r--r--   1 oracle   dba        42999808 Dec 23 18:17 temp01.dbf

-rw-r--r--   1 oracle   dba        10493952 Dec 23 18:27 tools01.dbf

-rw-r--r--   1 oracle   dba       209723392 Dec 23 18:59 undotbs01.dbf

-rw-r--r--   1 oracle   dba        26222592 Dec 23 18:27 users01.dbf

-rw-r--r--   1 oracle   dba        39985152 Dec 23 18:27 xdb01.dbf

 

好了,现在我们来开始恢复。

现在直接open resetlog肯定是打不开的:

SQL_testdb>startup mount

ORACLE instance started.

 

Total System Global Area  505382744 bytes

Fixed Size                   743256 bytes

Variable Size             285212672 bytes

Database Buffers          218103808 bytes

Redo Buffers                1323008 bytes

Database mounted.

 

SQL_testdb>recover database until cancel;

ORA-00279: change 188425 generated at 12/23/2009 18:27:25 needed for thread 1

ORA-00289: suggestion : /cadrasu01/app/oracle/product/9.2.0/dbs/arch1_1.dbf

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

 

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

cancel

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/dras21/testdb/system01.dbf' 

 

ORA-01112: media recovery not started

 

SQL_testdb>alter database open resetlogs;

alter database open resetlogs

*

ERROR at line 1:

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/dras21/testdb/system01.dbf' 

 

我们来创建pfile

SQL_testdb>create pfile='/dras21/testdb/inittestdb.ora' from spfile;

 

File created.

 

然后我们在pfile中加入*._allow_resetlogs_corruption=TRUE后再次open resetlog

SQL_testdb>startup mount pfile='/dras21/testdb/inittestdb.ora';

ORACLE instance started.

 

Total System Global Area  505382744 bytes

Fixed Size                   743256 bytes

Variable Size             285212672 bytes

Database Buffers          218103808 bytes

Redo Buffers                1323008 bytes

Database mounted.

 

SQL_testdb>alter database open resetlogs;

alter database open resetlogs

*

ERROR at line 1:

ORA-01092: ORACLE instance terminated. Disconnection forced

 

此时的alert log里会记录:

Errors in file /cadrasu01/app/oracle/admin/testdb/udump/testdb_ora_7090390.trc:

ORA-00704: bootstrap process failure

ORA-00604: error occurred at recursive SQL level 2

ORA-01555: snapshot too old: rollback segment number  with name "" too small

Wed Dec 23 19:20:51 2009

Error 704 happened during db open, shutting down database

USER: terminating instance due to error 704

Instance terminated by USER, pid = 7090390

ORA-1092 signalled during: alter database open resetlogs...

这里我们重现了那位朋友提到的错误。

 

上述trace文件(即/cadrasu01/app/oracle/admin/testdb/udump/testdb_ora_7090390.trc)不具备参考价值,我们来做一个10046,步骤为:

SQL_testdb>startup mount pfile='/dras21/testdb/inittestdb.ora';

ORACLE instance started.

 

Total System Global Area  505382744 bytes

Fixed Size                   743256 bytes

Variable Size             285212672 bytes

Database Buffers          218103808 bytes

Redo Buffers                1323008 bytes

Database mounted.

 

SQL_testdb>oradebug setmypid

Statement processed.

 

SQL_testdb>oradebug unlimit

Statement processed.

 

SQL_testdb>oradebug event 10046 trace name context forever,level 12

Statement processed.

 

SQL_testdb>recover database until cancel;

ORA-00279: change 208432 generated at 12/23/2009 19:45:06 needed for thread 1

ORA-00289: suggestion : /cadrasu01/app/oracle/product/9.2.0/dbs/arch1_1.dbf

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

 

 

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

cancel

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/dras21/testdb/system01.dbf'

 

 

ORA-01112: media recovery not started

 

SQL_testdb>alter database open resetlogs;

alter database open resetlogs

*

ERROR at line 1:

ORA-01092: ORACLE instance terminated. Disconnection forced

 

此时,我们再去分析上述10046产生的trace文件,直接看上述trace文件的最末尾,我们发现有这样的内容:

EXEC #10:c=0,e=236,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,tim=1232000925678362

WAIT #10: nam='db file sequential read' ela= 176 p1=1 p2=202 p3=1

WAIT #10: nam='db file sequential read' ela= 183 p1=1 p2=106 p3=1

FETCH #10:c=0,e=454,p=2,cr=2,cu=0,mis=0,r=0,dep=2,og=4,tim=1232000925678842

FETCH #4:c=0,e=1713,p=3,cr=5,cu=0,mis=0,r=0,dep=1,og=4,tim=1232000925678907

ORA-00704: bootstrap process failure

ORA-00604: error occurred at recursive SQL level 2

ORA-01555: snapshot too old: rollback segment number  with name "" too small

EXEC #1:c=200000,e=5922169,p=75,cr=705,cu=1,mis=0,r=0,dep=0,og=4,tim=1232000925679637

ERROR #1:err=1092 tim=1602843205

也就是说oracle在读file 1block 202file 1block 106的时候可能出了问题。

我用BBED看了上述block,没发现有什么异常,也就是说这条路已经走不下去了。

 

好了,我们来换一条路,直接open

SQL_testdb>alter database open;

alter database open

*

ERROR at line 1:

ORA-00607: Internal error occurred while making a change to a data block

ORA-00600: internal error code, arguments: [4193], [0], [57], [], [], [], [], []

呵呵,见到4193了,那这个库肯定可以打开了。

 

我们把*._corrupted_rollback_segments=(_SYSSMU1$, _SYSSMU2$, _SYSSMU3$, _SYSSMU4$, _SYSSMU5$, _SYSSMU6$, _SYSSMU7$, _SYSSMU8$, _SYSSMU9$, _SYSSMU10$)加到上述pfile里再次open

SQL_testdb>startup mount pfile='/dras21/testdb/inittestdb.ora';

ORACLE instance started.

 

Total System Global Area  505382744 bytes

Fixed Size                   743256 bytes

Variable Size             285212672 bytes

Database Buffers          218103808 bytes

Redo Buffers                1323008 bytes

Database mounted.

 

SQL_testdb>alter database open;

 

Database altered.

 

好了,现在我们已经成功把上述数据库给打开了,接下来的收尾工作就是要切换undo tablespace,重建spfile,这个大家肯定都知道,我这里无需再赘述。

 

最后我们来看一下那2000条数据还在不在:

SQL_testdb>conn scott/tiger@testdb;

Connected.

 

SQL_testdb>select count(*) from testtb;

select count(*) from testtb

                     *

ERROR at line 1:

ORA-00942: table or view does not exist

 

正如kamus所说,online redo log缺失通常意味着必然会有数据的丢失

No TrackBacks

TrackBack URL: http://dbsnake.com/cgi-bin/mt/mt-tb.cgi/98

1 Comment

我又做了一次,新建了个库(原来那个库没了)

建库后
session 1
SQL> create tablespace zxm datafile '/zxm/testzxm1/zxm.dbf' size 100m
2 ;

Tablespace created.

SQL> create user zxm identified by zxm default tablespace zxm;

User created.

SQL> grant connect,resource to zxm;

Grant succeeded.

SQL> alter system archive log current;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> conn zxm/zxm
Connected.
SQL> create table a (id number,name varchar2(200));

Table created.

SQL> declare
2 i number;
3 begin
4 i:=1;
5 while i 6 loop
7 insert into a values (i,'asfdasfasfd'||i);
8 i:=i+1;
9 end loop;
10 end;
11 /

PL/SQL procedure successfully completed.

session 2
SQL> shutdown abort;
ORACLE instance shut down.

rm *.log


然后开始测试

SQL> startup mount;

SQL> recover database until cancel;
ORA-00279: change 179545 generated at 12/24/2009 09:17:16 needed for thread 1
ORA-00289: suggestion : /zxm/testzxm1/1_10_706437772.dbf
ORA-00280: change 179545 for thread 1 is in sequence #10


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

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/zxm/testzxm1/testzxm1/system01.dbf'


ORA-01112: media recovery not started


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/zxm/testzxm1/testzxm1/system01.dbf'


SQL> create pfile='/zxm/inita.ora' from spfile;

File created.

添加 _resetlogs....参数
SQL> startup pfile='/zxm/inita.ora' mount;
ORACLE instance started.

Total System Global Area 209715200 bytes
Fixed Size 2019608 bytes
Variable Size 79695592 bytes
Database Buffers 121634816 bytes
Redo Buffers 6365184 bytes
Database mounted.
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01248: file 5 was created in the future of incomplete recovery
ORA-01110: data file 5: '/zxm/testzxm1/zxm.dbf'

SQL> alter database datafile 5 offline drop;

Database altered.

SQL> alter database open resetlogs;

Database altered.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27681/viewspace-627483/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27681/viewspace-627483/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值