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

[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有点繁琐,但是准确。

时间: 2024-09-20 22:28:33

[20140516]取出回滚段信息.txt的相关文章

[20160304]奇怪的回滚段2.txt

[20160304]奇怪的回滚段2.txt --链接: http://blog.itpub.net/267265/viewspace-2022969/ $ locate Seed_Database.dfb /u01/app/oracle/product/11.2.0.4/dbhome_1/assistants/dbca/templates/Seed_Database.dfb --安装的数据文件应该是从这个文件取出的. $ strings /u01/app/oracle/product/11.2.

[20170518]不同事务能使用相同回滚段吗.txt

[20170518]不同事务能使用相同回滚段吗.txt --//昨天别人问的问题,不同事务能使用相同回滚段吗?按照道理oracle会均匀分配事务到不同的回滚段,如果事务很多,oracle会自动建立 --//新的回滚段.正常的测试应该模拟建立多个事务,不提交看看是否存在回滚段是相同的. --//oracle还可以通过alter system set "_smu_debug_mode" = 45;加上set transaction use rollback segment "_S

[20160304]奇怪的回滚段3.txt

[20160304]奇怪的回滚段3.txt --相关链接: http://blog.itpub.net/267265/viewspace-2036568/ http://blog.itpub.net/267265/viewspace-2022969/ --自己将其中2个offline的回滚段online看看: 1.环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER -------------

[20160302]奇怪的回滚段.txt

[20160302]奇怪的回滚段.txt --昨天在探究oracle的启动时,无意中发现我安装这个版本,在安装的测试样例表空间example出现回滚段. --自己今天仔细看看: 1.环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ----------------------------------

oracle中系统回滚段坏块恢复记录

数据库启动报错  代码如下 复制代码 SQL> startup mount pfile='c:\pfile.txt' ORACLE 例程已经启动.    代码如下 复制代码 Total System Global Area  452984832 bytes Fixed Size                  1291120 bytes Variable Size             201329808 bytes Database Buffers          243269632 b

ORACLE回滚段的概念,用法和规划及问题的解决

oracle|概念|规划|解决|问题      回滚段管理一直是ORACLE数据库管理的一个难题,本文通过实例介绍ORACLE回滚段的概念,用法和规划及问题的解决. 回滚段概述 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息. 回滚段的作用 事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBAC

ORACLE回滚段管理(下)

oracle 创建回滚段 语法: CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment [TABLESPACE tablespace] [STORAGE ([INITIAL integer[K|M]] [NEXT integer[K|M]] [MINEXTENTS integer] [MAXTENTS {integer|UNLIMITED}] [OPTIMAL {integer[K|M]|NULL}]) ] 注: 回滚段可以在创建时指明PRIVATE

ORACLE回滚段管理

oracle 回滚段管理一直是ORACLE数据库管理的一个难题,本文通过实例介绍ORACLE回滚段的概念,用法和规划及问题的解决. 回滚段概述 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息. 回滚段的作用 事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段

ORACLE回滚段管理(上)

oracle 回滚段管理一直是ORACLE数据库管理的一个难题,本文通过实例介绍ORACLE回滚段的概念, 用法和规划及问题的解决. 回滚段概述 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正 在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚 段可以存放多个事务的回滚信息. 回滚段的作用 事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用 户回滚事务(ROLLBACK)时,ORACLE将会利