[20150619]undo文件损坏或者丢失的恢复3.txt
--实际上前面的测试是非常理想情况下的测试,真实的情况肯定比上面介绍的复杂。
--一般情况下,数据库异常关机,最容易出现的是在线redo损坏,一般通过隐含参数_allow_resetlogs_corruption跳过。
SYS@test> @ &r/hide _allow_resetlogs_corruption
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
---------------------------- ------------------------------------------------- -------------- -------------- -------------
_allow_resetlogs_corruption allow resetlogs even if it will cause corruption TRUE FALSE FALSE
--如果在出现回滚段错误,通过修改参数_corrupted_rollback_segments,_offline_rollback_segments跳过一些回滚段。
--10g下一般很好确定,命名格式是:
像_SYSSMU1$ 格式 _SYSSMU$.
--而11g下加入了时间戳,在无法打开数据库的情况下,可以通过bvi或者bbed来确定。
--另外一般位置相对固定,只要找一个数据块大小一样的数据块查询sys.undo$(数据库版本要一致)的rowid基本可以是那些。
--
SCOTT@test> @ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.3.0 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
SCOTT@test> select rowid,us#,name from sys.undo$ where rownumROWID US# NAME
------------------ ---------- ----------------------------------------
AAAAAPAABAAAADhAAA 0 SYSTEM
SCOTT@test> @ lookup_rowid AAAAAPAABAAAADhAAA
OBJECT FILE BLOCK ROW DBA TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
15 1 225 0 1,225 alter system dump datafile 1 block 225 ;
BBED> set dba 1,225
DBA 0x004000e1 (4194529 1,225)
BBED> x /2rncnnnnnnnnnnnnnnnnncct rowdata
rowdata[0] @862
----------
flag@862: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@863: 0x00
cols@864: 17
col 0[2] @865: 4
col 1[20] @868: _SYSSMU4_1665036189$
col 2[2] @889: 1
col 3[2] @892: 3
col 4[3] @895: 176
col 5[6] @899: 4103678170
col 6[2] @906: 2
col 7[4] @909: 34048
col 8[4] @914: 10126
col 9[1] @919: 0
col 10[2] @921: 3
col 11[2] @924: 2
col 12[0] @927: *NULL*
col 13[0] @928: *NULL*
col 14[0] @929: *NULL*
col 15[0] @930: *NULL*
col 16[2] @931: 2
rowdata[72] @934
-----------
flag@934: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@935: 0x00
cols@936: 17
col 0[3] @937: 104
col 1[21] @941: _SYSSMU104_777408806$
col 2[2] @963: 1
col 3[2] @966: 10
col 4[3] @969: 176
col 5[6] @973: 3414864939
col 6[2] @980: 2
col 7[3] @983: 1024
col 8[3] @987: 657
col 9[1] @991: 0
col 10[2] @993: 2
col 11[2] @996: 5
col 12[0] @999: *NULL*
col 13[0] @1000: *NULL*
col 14[0] @1001: *NULL*
col 15[0] @1002: *NULL*
col 16[2] @1003: 2
....
--也可以使用bbvi编辑:
SCOTT@test> @bbvi 1 225
BVI_COMMAND
------------------------------------------------------------------------------------------
bvi -b 1843200 -s 8192 /u01/app/oracle11g/oradata/test/system01.dbf
--执行如下:
$ touch aa.txt
$ bvi -b 1843200 -s 81920 /u01/app/oracle11g/oradata/test/system01.dbf
:w aa.txt
--说明-s 长度加大一些,因为可能在许多数据块中。
$ strings aa.txt | grep SYSSMU | uniq |head -10
_SYSSMU9_3043963034$
_SYSSMU3_2763804800$
_SYSSMU4_1665036189$
_SYSSMU104_777408806$
_SYSSMU103_9611014$
_SYSSMU102_1057122756$
_SYSSMU101_445156792$
_SYSSMU100_3478039479$
_SYSSMU99_2737214818$
_SYSSMU98_2332908142$
SYS@test> select rowid,us#,name from sys.undo$ where us#=3;
ROWID US# NAME
------------------ ---------- --------------------
AAAAAPAABAAAADhAAD 3 _SYSSMU3_2763804800$
SYS@test> select rowid,us#,name from sys.undo$ where us#=9;
ROWID US# NAME
------------------ ---------- --------------------
AAAAAPAABAAAADhAAJ 9 _SYSSMU9_3043963034$
--还是对上的。可以参考我以前写的:
http://blog.itpub.net/267265/viewspace-1162543/