[20140516]取出回滚段信息.txt
--如果数据库存在问题,无法启动,需要利用隐含参数_offline_rollback_segments=(_SYSSMUx$)和_corrupted_rollback_segments=(_SYSSMUx$)
--来屏蔽,可以通过一些隐含信息启动数据库。在数据库不能启动的情况下如何取出这些信息呢?
--如果数据库正常启动,可以通过访问基表sys.undo$获得这些信息。
SYS@test> select * from sys.undo$ order by 1;
US# NAME USER# FILE# BLOCK# SCNBAS SCNWRP XACTSQN UNDOSQN INST# STATUS$ TS#
--- --------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
0 SYSTEM 0 1 128 0 0 0 0 0 3 0
1 _SYSSMU1_559505304$ 1 3 128 3270709108 0 15022 6352 0 3 2
2 _SYSSMU2_3752879465$ 1 3 144 3270709112 0 15446 6843 0 3 2
3 _SYSSMU3_2763804800$ 1 3 160 3270709127 0 16739 6684 0 3 2
4 _SYSSMU4_1665036189$ 1 3 176 3270709122 0 16687 6909 0 3 2
5 _SYSSMU5_2973757209$ 1 3 192 3270709126 0 24183 8273 0 3 2
6 _SYSSMU6_3709901187$ 1 3 208 3270709121 0 18062 6880 0 3 2
7 _SYSSMU7_3362111860$ 1 3 224 3270709105 0 15377 6669 0 3 2
8 _SYSSMU8_819560936$ 1 3 240 3270709124 0 16486 6332 0 3 2
...
105 _SYSSMU105_1591595922$ 1 10 72 3241444483 0 16 20 0 2 5 2
106 _SYSSMU106_3193623361$ 1 10 88 3241444824 0 31 22 0 2 5 2
107 _SYSSMU107_642542572$ 1 10 104 3241444482 0 20 16 0 1 5 2
108 _SYSSMU108_2543094915$ 1 11 240 3179752411 0 2 1 0 1 5 2
109 _SYSSMU109_1591452632$ 1 11 256 3179752471 0 2 1 0 1 5 2
110 _SYSSMU110_673028096$ 1 11 272 3179752449 0 2 1 0 1 5 2
111 rows selected.
--我们可以看到,在访问回滚段4的时候报错了,但是无法获得回滚段的时间戳。Oracle 11g中的回滚段名称的格式如下: _SYSSMUx_时间戳.
-- alter system set "_allow_resetlogs_corruption"=true scope=spfile ;
-- alter system set "_allow_error_simulation"=true scope=spfile ;
-- alter session set "_smu_debug_mode" = 4;
-- alter rollback segment "_SYSSMU1_559505304$" offline;
-- drop rollback segment "_SYSSMU1_559505304$" ;
SYS@test> select distinct substr(rowid,1,15)||'AAA' from sys.undo$ ;
SUBSTR(ROWID,1,15)
------------------------------
AAAAAPAABAAAADiAAA
AAAAAPAABAAAADhAAA
SYS@test> @lookup_rowid AAAAAPAABAAAADiAAA
OBJECT FILE BLOCK ROW DBA TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
15 1 226 0 1,226 alter system dump datafile 1 block 226 ;
SYS@test> @lookup_rowid AAAAAPAABAAAADhAAA
OBJECT FILE BLOCK ROW DBA TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
15 1 225 0 1,225 alter system dump datafile 1 block 225 ;
--可以发现这些信息存在在file#=1的225,226块中。如果能启动的情况下,找到这些信息是很容易的。
--如果无法启动,如果确定这些信息,实际上可以使用bbed或者bvi之类的工具确定。我自己也做一些测试:
1.因为这些信息一般在数据文件file#=1的靠前位置,可以取前面10M,这样信息基本可以确定。(假设数据块大小=8K)
-- 10*1024*1024=10485760 10485760/8192 =1280
$ cd /u01/app/oracle11g/oradata/test
$ bvi -b 0 -s 10485760 system01.dbf
001C2100 6E 0C 2B 0C E8 0B A5 0B 63 0B 20 0B E0 0A 9D 0A 5A 0A 17 0A D5 09 93 09 50 09 0D 09 CB 08 88 08 46 08 04 08 C2 07 80 07 3D 07 FB 06 B8 06 77 06 35 06 F2 05 B0 05 6C 05 27 05 E3 04 9F 04 5A 04 n.+.....c. .....Z.......P.......F.......=.....w.5.....l.......Z.
001C2140 C1 07 14 5F 53 59 53 53 4D 55 36 5F 33 37 30 39 39 30 31 31 38 37 24 02 C1 02 02 C1 04 03 C2 03 09 05 C5 21 2D 4C 3C 01 80 04 C3 02 2B 3B 03 C2 3C 44 01 80 2C 00 11 02 C1 03 14 5F 53 59 53 53 ..._SYSSMU6_3709901187$............!-L001C2180 4D 55 32 5F 33 37 35 32 38 37 39 34 36 35 24 02 C1 02 02 C1 04 03 C2 02 2D 06 C5 21 47 47 5C 0D 01 80 04 C3 02 37 2F 03 C2 45 2C 01 80 02 C1 04 02 C1 03 FF FF FF FF 02 C1 03 2C 00 11 02 C1 03 MU2_3752879465$.........-..!GG\......7/..E,...............,.....
001C21C0 14 5F 53 59 53 53 4D 55 32 5F 33 37 35 32 38 37 39 34 36 35 24 02 C1 02 02 C1 04 03 C2 02 2D 06 C5 21 47 36 28 25 01 80 03 C3 02 37 03 C2 45 20 01 80 02 C1 04 02 C1 03 FF FF FF FF 02 C1 03 2C ._SYSSMU2_3752879465$.........-..!G6.%.....7..E ...............,
001C2200 00 11 02 C1 05 14 5F 53 59 53 53 4D 55 34 5F 31 36 36 35 30 33 36 31 38 39 24 02 C1 02 02 C1 04 03 C2 02 4D 06 C5 21 47 47 5C 17 01 80 04 C3 02 43 58 03 C2 46 0A 01 80 02 C1 04 02 C1 03 FF FF ......_SYSSMU4_1665036189$.........M..!GG\......CX..F...........
001C2240 FF FF 02 C1 03 2C 00 11 02 C1 05 14 5F 53 59 53 53 4D 55 34 5F 31 36 36 35 30 33 36 31 38 39 24 02 C1 02 02 C1 04 03 C2 02 4D 05 C5 21 47 35 34 01 80 04 C3 02 43 0E 03 C2 45 60 01 80 02 C1 04 .....,......_SYSSMU4_1665036189$.........M...G54.....C...E......
-- 注意: 我看统计,undo$的平均记录行长=61,前面也出现类似的字符,但是明显行长相差太大,我看了一下是system的回滚段信息。
SYS@testdg> @16to10 001C2100
16 to 10 DEC
------------
1843456
SYS@testdg> select 1843456/8192 from dual ;
1843456/8192
------------
225.03125
--基本可以确定在225块。另外生产系统应该占用许多块,至少从这个位置取下面的连续8块。
--我找另外1个11G数据库,发现信息都是从225开始。
--10g的数据库 106开始。不知道这些是否相对固定。(也有1个例外在54)
--补充:54 的数据块块大小是 16K,这样讲实际上还是相对固定的。
2.使用bbed查看:
BBED> set dba 1,225
DBA 0x004000e1 (4194529 1,225)
BBED> p kdbr
sb2 kdbr[0] @110 8054
sb2 kdbr[1] @112 7985
sb2 kdbr[2] @114 280
...
sb2 kdbr[100] @310 1388
sb2 kdbr[101] @312 1319
sb2 kdbr[102] @314 1251
sb2 kdbr[103] @316 1183
sb2 kdbr[104] @318 1114
--编辑文件cmd.par
set count 8192
set width 210
set dba 1,225
p *kdbr[0]
x /rnc
p *kdbr[1]
x /rnc
...
p *kdbr[104]
x /rnc
$ cat bbedreadonly.par
blocksize=8192
listfile=/home/oracle11g/bbed/filelist.txt
mode=browse
PASSWORD=blockedit
spool=yes
$ rlwrap -s 9999 -c -r -i -f /usr/local/share/rlwrap/bbed /u01/app/oracle11g/product/11.2.0/db_2/bin/bbed parfile=bbed.par cmdfile=cmd.par
$ grep "_SYSSMU" log.bbd
col 1[19] @8083: _SYSSMU1_559505304$
col 1[20] @378: _SYSSMU2_3752879465$
col 1[20] @8013: _SYSSMU3_2763804800$
col 1[20] @517: _SYSSMU4_1665036189$
......
col 1[21] @1350: _SYSSMU102_486721026$
col 1[21] @1282: _SYSSMU103_918506300$
col 1[22] @1213: _SYSSMU104_1265387071$
--如法炮制,取出226块的信息,就可以取出回滚段信息。
3.使用dd命令:
$ dd if=/u01/app/oracle11g/oradata/test/system01.dbf of=/tmp/225.dd skip=225 count=8 bs=8192
--注意方向不要搞错!!!!
$ strings /tmp/225.dd | grep -i syssmu | sort -t'_' -k1.8,1.11 -n -t'_'| uniq
_SYSSMU1_559505304$
_SYSSMU2_3752879465$
_SYSSMU3_2763804800$
_SYSSMU4_1665036189$
_SYSSMU5_2973757209$
_SYSSMU6_3709901187$
_SYSSMU7_3362111860$
_SYSSMU8_819560936$
...
_SYSSMU105_1591595922$
_SYSSMU105_1756905781$
_SYSSMU106_3193623361$
_SYSSMU106_972178833$
_SYSSMU107_642542572$
_SYSSMU108_2543094915$
_SYSSMU109_1591452632$
_SYSSMU110_673028096$
$ strings /tmp/225.dd | grep -i syssmu | sort -t'_' -k1.8,1.11 -n -t'_'| uniq |wc
113 113 2456
--前面记录数110(不包括system回滚段)。存在重复。
--我看了一下也不能以时间戳来确定。回滚段105在使用的是_SYSSMU105_1591595922(时间戳小的)。
总结:
1.dd+strings简单,快速,但是不准确。
2.使用bbed有点繁琐,但是准确。