[20140516]取出回滚段信息.txt

来源:这里教程网 时间:2026-03-03 16:53:46 作者:

[20140516]取出回滚段信息.txt --//后记:以前写的,原始链接找不到了.感觉2014年的blog丢失很多. --如果数据库存在问题,无法启动,需要利用隐含参数_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  <=检索_SYSSMU 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$............!-L<.....+;..<D..,......_SYSS 001C2180  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:注该数据库数据块大小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有点繁琐,但是准确。

相关推荐