[20140516]取出回滾段資訊.txt

lfree發表於2021-08-27

[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有點繁瑣,但是準確。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2789249/,如需轉載,請註明出處,否則將追究法律責任。

相關文章