oracle中a40啥意思,oracle 详细分析redo(4)

oracle中a40啥意思,oracle 详细分析redo(4)关于redo结构:SQLconnxh/a831115;已连接

关于redo 结构:

SQL> conn xh/a831115;

已连接。

SQL> select * from test;

A

———-

a

SQL> select group#,status from v$log;

GROUP# STATUS

———- —————-

1 INACTIVE

2 INACTIVE

3 CURRENT

SQL> col member format a40

SQL> select group#,member from v$logfile;

GROUP# MEMBER

———- —————————————-

3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO03.LOG

2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO02.LOG

1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO01.LOG

SQL> update test set a=’b’;

已更新 1 行。~~~~~~~~~~~~~~~~~~~~~~~~~~~~未commit

SQL>

SQL> select xidusn ,ubafil,UBABLK from v$transaction;

XIDUSN     UBAFIL     UBABLK

———- ———- ———-

3          2       2194

可以看到这个事务使用的 undo block 是 file 2,block 2194

SQL> select * from v$rollname where usn=3;

USN NAME

———- ——————————

3 _SYSSMU3$

SQL> select header_block,header_file from dba_segments where segment_name=’_SYSS

MU3$’;

HEADER_BLOCK HEADER_FILE

———— ———–

41           2

SQL> select object_id from user_objects where object_name=’TEST’;

OBJECT_ID

———-

54147

SQL> alter system dump logfile ‘F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\REDO03.L

og’;

系统已更改。

根据 object_id找到 相关信息

可以看到这个redo record中 有 3个 change vector(比如CHANGE #1)

REDO RECORD – Thread:1 RBA: 0x000003.00000beb.0010 LEN: 0x01c0 VLD: 0x0d

SCN: 0x0000.0045246b SUBSCN:  1 10/21/2009 09:23:22

CHANGE #1 TYP:0 CLS: 1 AFN:4 DBA:0x010001c4 OBJ:54147 SCN:0x0000.00445bbf SEQ:  1 OP:11.19

KTB Redo

op: 0x01  ver: 0x01

op: F  xid:  0x0003.021.00000542    uba: 0x00800892.0281.18

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 2 ckix: 7

ncol: 1 nnew: 1 size: 0

KDO Op code:  21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010001c4  hdba: 0x010001c3

itli: 2  ispac: 0  maxfr: 4858

vect = 0

col  0: [ 1]  62

CHANGE #2 TYP:0 CLS:21 AFN:2 DBA:0x00800029 OBJ:4294967295 SCN:0x0000.00452413 SEQ:  1 OP:5.2

ktudh redo: slt: 0x0021 sqn: 0x00000542 flg: 0x0012 siz: 152 fbi: 0

uba: 0x00800892.0281.18    pxid:  0x0000.000.00000000

CHANGE #3 TYP:0 CLS:22 AFN:2 DBA:0x00800892 OBJ:4294967295 SCN:0x0000.00452412 SEQ:  2 OP:5.1

ktudb redo: siz: 152 spc: 4888 flg: 0x0012 seq: 0x0281 rec: 0x18

xid:  0x0003.021.00000542

ktubl redo: slt: 33 rci: 0 opc: 11.1 objn: 54147 objd: 54147 tsn: 4

Undo type:  Regular undo        Begin trans    Last buffer split:  No

Temp Object:  No

Tablespace Undo:  No

0x00000000  prev ctl uba: 0x00800892.0281.16

prev ctl max cmt scn:  0x0000.00451e95  prev tx cmt scn:  0x0000.00451e9b

txn start scn:  0x0000.004523eb  logon user: 61  prev brb: 0  prev bcl: 0 KDO undo record:

KTB Redo

op: 0x03  ver: 0x01

op: Z

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 7

ncol: 1 nnew: 1 size: 0

KDO Op code:  21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010001c4  hdba: 0x010001c3

itli: 2  ispac: 0  maxfr: 4858

vect = 0

col  0: [ 1]  61

分析 可以  从 AFN:看出是 对 那个文件的修改,AFN 绝对文件号

所以change#1 记录对datafile 4的 修改,dba是 对应的 块

DBA:0x010001c4

SQL> variable file# number;

SQL> variable blk# number;

SQL> execute :file#:=dbms_utility.data_block_address_file(to_number(‘0001c4’,’xx

xxxxx’));

PL/SQL 过程已成功完成。

SQL> execute :blk#:=dbms_utility.data_block_address_block(to_number(‘0001c4’,’xx

xxxx’));

PL/SQL 过程已成功完成。

SQL> print file#

FILE#

———-

4

SQL> print blk#

BLK#

———-

452

SQL> select file#,block# from (select dbms_rowid.rowid_relative_fno(rowid) file#

,dbms_rowid.rowid_block_number(rowid) block# from xh.test);

FILE#     BLOCK#

———- ———-

4        452

可以看出 这个 change vector记录的是 修改datafile 4,block 452的 记录  正是,修改test 表的记录

uba: 0x00800892.0281.18

0281是序号,18是条目号

uba 是 记录了 这个块修改后的 undo记录 放在undo 那个块中

SQL> variable file# number;

SQL> variable blk# number;

SQL> execute :file#:=dbms_utility.data_block_address_file(to_number(‘00892’,’xxx

xxxx’));

PL/SQL 过程已成功完成。

SQL> execute :blk#:=dbms_utility.data_block_address_block(to_number(‘00892’,’xxx

xxx’));

PL/SQL 过程已成功完成。

SQL> print file#

FILE#

———-

2

SQL> print blk#

BLK#

———-

2194

可以看到 修改test后 的旧值(a)  放在undo file 2 ,block 2194中

col  0: [ 1]  62   就是 undo记录中 ,记录 修改后的 值(upate test set a=’b’)

SQL> select chr(to_number(62,’xx’)) from dual;

CH

b

KDO Op code:  21  d代表 事务进行操作的类型代码 21 代表 update

xid:  0x0003.021.00000542 对应着

SQL> select to_number(’21’,’xxxxxx’) from dual;

TO_NUMBER(’21’,’XXXXXX’)

————————

33

SQL> select to_number(‘542′,’xxxxxx’) from dual;

TO_NUMBER(‘542′,’XXXXXX’)

————————-

1346

SQL>

SQL> select XIDUSN,XIDSLOT,XIDSQN  from v$transaction;(user xh session执行)

XIDUSN    XIDSLOT     XIDSQN

———- ———- ———-

3         33       1346

XIDUSN NUMBER Undo segment number

XIDSLOT NUMBER Slot number

XIDSQN NUMBER Sequence number

Array Update of 1 rows:  也显示了 update  1 rows

bdba: 0x010001c4 :也表示修改的 test的数据块 与dba一样(data block address)

是 file 4,block 452

hdba: 0x010001c3:表示的是test表的 segment header block

SQL> variable file# number;

SQL> variable blk# number;

SQL> execute :file#:=dbms_utility.data_block_address_file(to_number(‘1c3’,’xxxxx

xx’));

PL/SQL 过程已成功完成。

SQL> execute :blk#:=dbms_utility.data_block_address_block(to_number(‘1c3’,’xxxxx

x’));

PL/SQL 过程已成功完成。

SQL> print file#

FILE#

———-

4

SQL> print blk#

BLK#

———-

451

SQL> select header_file,header_block from dba_segments where segment_name=’TEST’

;

HEADER_FILE HEADER_BLOCK

———– ————

4          451

基本change #1的 重要信息 了解完了,可以清楚的看到redo中都记录了些什么

CHANGE #2  AFN:2可以看到是对 undo 的 修改的记录

DBA:0x00800029 OBJ:4294967295

SQL> variable file# number;

SQL> variable blk# number;

SQL> execute :file#:=dbms_utility.data_block_address_file(to_number(‘800029’,’xx

xxxxx’));

PL/SQL 过程已成功完成。

SQL> execute :blk#:=dbms_utility.data_block_address_block(to_number(‘800029’,’xx

xxxx’));

PL/SQL 过程已成功完成。

SQL> print file#

FILE#

———-

2

SQL> print blk#

BLK#

———-

41

这正是对undo segment header的修改,要修改事务表(存undo segment header)

uba: 0x00800892.0281.18  :记录了放 test旧值的undo block 所在地址,与change#1中的一样

change#3:

CHANGE #3 TYP:0 CLS:22 AFN:2 DBA:0x00800892

anf 表示这个还是记录的undo file的信息 ,DBA表示的 是哪个undo 块

SQL> variable file# number;

SQL> variable blk# number;

SQL> execute :file#:=dbms_utility.data_block_address_file(to_number(‘800892’,’xx

xxxxx’));

PL/SQL 过程已成功完成。

SQL> execute :blk#:=dbms_utility.data_block_address_block(to_number(‘800892’,’xx

xxxx’));

PL/SQL 过程已成功完成。

SQL> print file#

FILE#

———-

2

SQL> print blk#

BLK#

———-

2194

可以看到这个块 就是记录test 旧值得块,chang#3 记录了对这个undo 块的 修改,所以redo是保护undo的

ktubl redo: slt: 33 rci: 0 opc: 11.1 objn: 54147 objd: 54147 tsn: 4

OBJD可以看到是记录的对象是xh.test

slt: 33=XIDSLOT NUMBER Slot number

logon user: 61  登陆操作的user id

SQL> select username from dba_users where user_id=61;

USERNAME

——————————

XH

KDO Op code:  21:表示还是一个update操作

bdba: 0x010001c4  hdba: 0x010001c3

BDBA:记录的是fil 4 block 452 表示是test表的数据块地址,hdba 是file 4,block 451 表示是test segment header block

col  0: [ 1]  61:表示修改前的值

SQL> select chr(to_number(61,’xx’)) from dual;

CH

a

SQL> alter system dump  datafile 2 block 2194;

系统已更改。

根据object_id找

dump log file中  change#1中uba: 0x00800892.0281.18,change#3中dba 可以现在dump datablock trace中 rec 0x18 为uba中18 表示slot号

* Rec #0x18  slt: 0x21  objn: 54147(0x0000d383)  objd: 54147  tblspc: 4(0x00000004)

*       Layer:  11 (Row)   opc: 1   rci 0x00

Undo type:  Regular undo    Begin trans    Last buffer split:  No

Temp Object:  No

Tablespace Undo:  No

rdba: 0x00000000

*—————————–

uba: 0x00800892.0281.16 ctl max scn: 0x0000.00451e95 prv tx scn: 0x0000.00451e9b

txn start scn: scn: 0x0000.004523eb logon user: 61

prev brb: 0 prev bcl: 0

KDO undo record:

KTB Redo

op: 0x03  ver: 0x01

op: Z

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 7

ncol: 1 nnew: 1 size: 0

KDO Op code:  21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010001c4  hdba: 0x010001c3

itli: 2  ispac: 0  maxfr: 4858

vect = 0

col  0: [ 1]  61~~~~~~~~~~~~~~~~~~~~~~~记录旧得值  a

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

关于redo 结构补充 (用户commit 时间)

1.update 后 马上commit

SQL> conn xh/a831115;

已连接。

SQL> select * from test;

A

———-

b

SQL>  select group#,status from v$log;

GROUP# STATUS

———- —————-

1 INACTIVE

2 CURRENT

3 INACTIVE

SQL> col member format a40

SQL> select group#,member from v$logfile;

GROUP# MEMBER

———- —————————————-

3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO03.LOG

2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO02.LOG

1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO01.LOG

SQL> update test set a=’e’;

已更新 1 行。

SQL> commit;~~~~~~~~~~~~如果update 后 ,紧接着 commit

SQL> alter system dump logfile ‘F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\REDO01.L

og’;

系统已更改。

SQL> select object_id from user_objects where object_name=’TEST’;

OBJECT_ID

———-

54147

SCN: 0x0000.0047ea28 SUBSCN:  8 10/22/2009 13:24:26

CHANGE #1 TYP:2 CLS: 1 AFN:4 DBA:0x010001c4 OBJ:54147 SCN:0x0000.0047e97c SEQ:  2 OP:11.19

KTB Redo

op: 0x11  ver: 0x01

op: F  xid:  0x0002.010.00000572    uba: 0x008006cc.04e3.1a

Block cleanout record, scn:  0x0000.0047ea22 ver: 0x01 opt: 0x02, entries follow…

itli: 2  flg: 2  scn: 0x0000.0047e97c

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 1 ckix: 8

ncol: 1 nnew: 1 size: 0

KDO Op code:  21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010001c4  hdba: 0x010001c3

itli: 1  ispac: 0  maxfr: 4858

vect = 0

col  0: [ 1]  65~~~~~新值

CHANGE #2 TYP:0 CLS:19 AFN:2 DBA:0x00800019 OBJ:4294967295 SCN:0x0000.0047e9e1 SEQ:  2 OP:5.2

ktudh redo: slt: 0x0010 sqn: 0x00000572 flg: 0x0012 siz: 176 fbi: 0

uba: 0x008006cc.04e3.1a    pxid:  0x0000.000.00000000

CHANGE #3 TYP:0 CLS:19 AFN:2 DBA:0x00800019 OBJ:4294967295 SCN:0x0000.0047ea28 SEQ:  1 OP:5.4

ktucm redo: slt: 0x0010 sqn: 0x00000572 srt: 0 sta: 9 flg: 0x2

ktucf redo: uba: 0x008006cc.04e3.1a ext: 2 spc: 4558 fbi: 0

CHANGE #4 TYP:0 CLS:20 AFN:2 DBA:0x008006cc OBJ:4294967295 SCN:0x0000.0047e9e1 SEQ:  3 OP:5.1

ktudb redo: siz: 176 spc: 4736 flg: 0x0012 seq: 0x04e3 rec: 0x1a

xid:  0x0002.010.00000572

ktubl redo: slt: 16 rci: 0 opc: 11.1 objn: 54147 objd: 54147 tsn: 4

Undo type:  Regular undo        Begin trans    Last buffer split:  No

Temp Object:  No

Tablespace Undo:  No

0x00000000  prev ctl uba: 0x008006cc.04e3.17

prev ctl max cmt scn:  0x0000.0047e4f2  prev tx cmt scn:  0x0000.0047e52f

txn start scn:  0x0000.00000000  logon user: 61  prev brb: 8390340  prev bcl: 0 KDO undo record:

KTB Redo

op: 0x04  ver: 0x01

op: L  itl: xid:  0x000a.014.00000453 uba: 0x00800bc0.037a.2a

flg: C—    lkc:  0     scn: 0x0000.0047e8e8

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 8

ncol: 1 nnew: 1 size: 0

KDO Op code:  21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010001c4  hdba: 0x010001c3

itli: 1  ispac: 0  maxfr: 4858

vect = 0

col  0: [ 1]  64~~~~~~~~~=旧值

具体内容就不 解释了,可以看到 这个redo record 产生了 4个 change vector,其中 change#2 ,chang#3都是修改 undo segment header 产生的 change vector

可以清楚的看到change#3是commit后的记录( sta: 9  提交标记 为9 代表已经提交)

2.实验 update后 过一会commit

SQL> select group#,status from v$log;

GROUP# STATUS

———- —————-

1 UNUSED~~~~~~~~~~~~~~做了clear

2 CURRENT

3 UNUSED~~~~~~~~~~~~~~做了clear

SQL> alter system switch logfile;

系统已更改。

SQL> alter  system checkpoint;

系统已更改。

SQL> select group#,status from v$log;

GROUP# STATUS

———- —————-

1 CURRENT

2 INACTIVE

3 UNUSED

SQL> col member format a40

SQL> select group#,member from v$logfile;

GROUP# MEMBER

———- —————————————-

3 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO03.LOG

2 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO02.LOG

1 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\

REDO01.LOG

SQL> update test set a=’bbb’;

已更新 1 行。

SQL> select object_id from user_objects where object_name=’TEST’;

OBJECT_ID

———-

54147

SQL> select xidusn ,ubafil,UBABLK from v$transaction;

XIDUSN     UBAFIL     UBABLK

———- ———- ———-

9          2        523

SQL> select * from v$rollname where usn=9;

USN NAME

———- ——————————

9 _SYSSMU9$

SQL> select header_block,header_file from dba_segments where segment_name=’_SYSS

MU9$’;

HEADER_BLOCK HEADER_FILE

———— ———–

137           2

事务表存储在 undo segment header file 2,block 137

SQL> alter system dump logfile ‘F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\REDO01.L

og’;

系统已更改。

REDO RECORD – Thread:1 RBA: 0x00003e.00000019.0010 LEN: 0x01d0 VLD: 0x0d

SCN: 0x0000.0047effc SUBSCN: 13 10/22/2009 14:05:25

CHANGE #1 TYP:2 CLS: 1 AFN:4 DBA:0x010001c4 OBJ:54147 SCN:0x0000.0047efa0 SEQ:  1 OP:11.5

KTB Redo

op: 0x11  ver: 0x01

op: F  xid:  0x0009.005.0000058e    uba: 0x0080020b.0209.26

Block cleanout record, scn:  0x0000.0047efe2 ver: 0x01 opt: 0x02, entries follow…

itli: 2  flg: 2  scn: 0x0000.0047efa0

KDO Op code: URP row dependencies Disabled

xtype: XA flags: 0x00000000  bdba: 0x010001c4  hdba: 0x010001c3

itli: 1  ispac: 0  maxfr: 4858

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 1 ckix: 8

ncol: 1 nnew: 1 size: 1

col  0: [ 3]  62 62 62

CHANGE #2 TYP:0 CLS:33 AFN:2 DBA:0x00800089 OBJ:4294967295 SCN:0x0000.0047efb5 SEQ:  2 OP:5.2

ktudh redo: slt: 0x0005 sqn: 0x0000058e flg: 0x0012 siz: 152 fbi: 0

uba: 0x0080020b.0209.26    pxid:  0x0000.000.00000000

CHANGE #3 TYP:0 CLS:34 AFN:2 DBA:0x0080020b OBJ:4294967295 SCN:0x0000.0047efb5 SEQ: 28 OP:5.1

ktudb redo: siz: 152 spc: 3380 flg: 0x0012 seq: 0x0209 rec: 0x26

xid:  0x0009.005.0000058e

ktubl redo: slt: 5 rci: 0 opc: 11.1 objn: 54147 objd: 54147 tsn: 4

Undo type:  Regular undo        Begin trans    Last buffer split:  No

Temp Object:  No

Tablespace Undo:  No

0x00000000  prev ctl uba: 0x0080020b.0209.0a

prev ctl max cmt scn:  0x0000.0047e801  prev tx cmt scn:  0x0000.0047e80c

txn start scn:  0x0000.0047ee52  logon user: 61  prev brb: 8388965  prev bcl: 0 KDO undo record:

KTB Redo

op: 0x04  ver: 0x01

op: L  itl: xid:  0x0002.010.00000572 uba: 0x008006cc.04e3.1a

flg: C—    lkc:  0     scn: 0x0000.0047ea28

KDO Op code: URP row dependencies Disabled

xtype: XA flags: 0x00000000  bdba: 0x010001c4  hdba: 0x010001c3

itli: 1  ispac: 0  maxfr: 4858

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 8

ncol: 1 nnew: 1 size: -1

col  0: [ 2]  62 62

此时 commit

SQL> alter system dump logfile ‘F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\REDO01.L

og’;

系统已更改。

SQL> commit;

查看dump 多了一个  record

REDO RECORD – Thread:1 RBA: 0x00003e.000001c5.0010 LEN: 0x008c VLD: 0x05

SCN: 0x0000.0047f11a SUBSCN:  1 10/22/2009 14:06:59

CHANGE #1 TYP:0 CLS:33 AFN:2 DBA:0x00800089 OBJ:4294967295 SCN:0x0000.0047effc SEQ:  1 OP:5.4

ktucm redo: slt: 0x0005 sqn: 0x0000058e srt: 0 sta: 9 flg: 0x2

ktucf redo: uba: 0x0080020b.0209.26 ext: 2 spc: 3226 fbi: 0

这个 record 只有一个change vector 是 针对undo segment header的 当commit时记录事务表tnb中 sta:9 表示提交

SQL> variable file# number;

SQL> variable blk# number;

SQL> execute :file#:=dbms_utility.data_block_address_file(to_number(‘800089’,’xx

xxxx’));

PL/SQL 过程已成功完成。

SQL>  execute :blk#:=dbms_utility.data_block_address_block(to_number(‘800089’,’x

xxxxxxx’));

PL/SQL 过程已成功完成。

SQL> print file#

FILE#

———-

2

SQL> print block#

SP2-0552: 未声明绑定变量 “BLOCK#”。

SQL> print blk#

BLK#

———-

137

如果要再进一步深入 可以 dump下 undo segment header 查看下 事务表

state 9代表 提交 ,10代表active

index就是 slot号码

dba :对应的undo block address

TRN TBL::

index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt

————————————————————————————————

0x00    9    0x00  0x058e  0x0017  0x0000.0047ef60  0x0080020b  0x0000.000.00000000  0x00000001   0x00000000  1256191265

0x01    9    0x00  0x058e  0x0020  0x0000.0047ecce  0x00800166  0x0000.000.00000000  0x00000001   0x00000000  1256190197

……………………………………………………………………………………………………………..

0x2f    9    0x00  0x058d  0x000d  0x0000.0047ef0d  0x00800168  0x0000.000.00000000  0x00000002   0x00000000  1256191257

今天的文章oracle中a40啥意思,oracle 详细分析redo(4)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/60937.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注