一,建立测试环境
01,一个oracle数据库环境
02,具体数据库实验环境配置
SQL> create user test1 identified by kingle; User created. SQL> grant dba to test1; Grant succeeded. SQL> create tablespace ttt1 datafile '/u01/app/oracle/oradata/oracle01/test101.dbf' size 10M; Tablespace created. SQL> alter user test1 default tablespace ttt1; User altered.
二,测试dump文件01
01,建立表数据
SQL> conn test/kingle Connected. SQL> create table t1(id int,name varchar2(100)); Table created. SQL> insert into t1 values(1,'AAAAA'); 1 row created. SQL> commit; Commit complete. SQL> alter system checkpoint; --触发checkpoint操作,脏块写进磁盘 System altered.
02,查看相关dump 信息
SQL> select id,name,dbms_rowid.rowid_relative_fno(rowid)file#,dbms_rowid.rowid_block_number(rowid) block# from t1; ID ---------- NAME -------------------------------------------------------------------------------- FILE# BLOCK# ---------- ---------- 1 AAAAA 7 132 SQL> col NAME format a20; --oracle 输出格式化 SQL> select id,name,dbms_rowid.rowid_relative_fno(rowid)file#,dbms_rowid.rowid_block_number(rowid) block# from t1; ID NAME FILE# BLOCK# ---------- -------------------- ---------- ---------- 1 AAAAA 7 132 SQL> alter system dump datafile 7 block 132; --dump 数据块 System altered. SQL> select object_id from dba_objects where object_name='t1'; no rows selected SQL> select p.spid from v$session s,v$process p where s.paddr=p.addr and s.sid in (select userenv('sid') from dual); SPID ------------------------ 3986
03,查看dump文件
默认存放位置: 如果是DG的话可能位置sid会多一sid 找到TRACE 文件,打开。路径$ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace
[oracle@oracle01 trace]$ pwd /u01/app/oracle/diag/rdbms/oracle01_oracle01/oracle01/trace [oracle@oracle01 trace]$ ll -h |grep 9616 -rw-r----- 1 oracle oinstall 3.4K May 5 09:55 oracle01_ora_9616.trc -rw-r----- 1 oracle oinstall 63 May 5 09:55 oracle01_ora_9616.trm
[oracle@oracle01 trace]$ cat oracle01_ora_9616.trc Trace file /u01/app/oracle/diag/rdbms/oracle01_oracle01/oracle01/trace/oracle01_ora_9616.trc Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1 System name: Linux Node name: oracle01 Release: 3.10.0-693.el7.x86_64 Version: #1 SMP Tue Aug 22 21:09:27 UTC 2017 Machine: x86_64 VM name: VMWare Version: 6 Instance name: oracle01 Redo thread mounted by this instance: 1 Oracle process number: 36 Unix process pid: 9616, image: oracle@oracle01 (TNS V1-V3) *** 2019-05-05 09:55:08.835 *** SESSION ID:(26.8411) 2019-05-05 09:55:08.835 *** CLIENT ID:() 2019-05-05 09:55:08.835 *** SERVICE NAME:(SYS$USERS) 2019-05-05 09:55:08.835 *** MODULE NAME:(SQL*Plus) 2019-05-05 09:55:08.835 *** ACTION NAME:() 2019-05-05 09:55:08.835 Start dump data blocks tsn: 9 file#:7 minblk 132 maxblk 132 Block dump from cache: Dump of buffer cache at level 4 for tsn=9 rdba=29360260 BH (0x82ff4948) file#: 7 rdba: 0x01c00084 (7/132) class: 1 ba: 0x82ed6000 set: 6 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 32,28 dbwrid: 0 obj: 96892 objn: 96892 tsn: 9 afn: 7 hint: f hash: [0x7bfaaa98,0xf3ba92b0] lru: [0x82ff47c8,0x82ff4ca8] ckptq: [NULL] fileq: [NULL] objq: [0x82ff4310,0x82ff4cd0] objaq: [0x82ff4590,0x82ff4ce0] st: XCURRENT md: NULL fpin: 'ktspbwh2: ktspfmdb' tch: 3 flags: block_written_once redo_since_read LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1] Block dump from disk: --数据块头 buffer tsn: 9 rdba: 0x01c00084 (7/132) scn: 0x0000.009b87a7 seq: 0x01 flg: 0x06 tail: 0x87a70601 --(0x01 (新建块)0x2(数据块延迟清洗推进scn和seq) 0X04(设置校验和) 0x08(临时块)) frmt: 0x02 chkval: 0xbc1e type: 0x06=trans data Hex dump of block: st=0, typ_found=1 ####################################### rba是相对数据块地址(用4个字节32位来表示,前10位为相对数据文件号,后22位为块号。
01400010=0000 0001 0100 0000 0000 0000 0001 0000(二进制) 我们看到前10位转换成十进制就是5,后22位转换成十进制就是16。),
scn:scn号总共占用6个字节,前2个字节表示SCN Wrap,后4个字节表示SCN Base,seq:scn序列号,tail:维护数据一致性验证块在开始到结束是同一个版本(由scn的低二字节+块类型+scn序列号) frmt块的格式 chkval可选的检查值 如果db_block_checksum=true,type块类型 ####################################### Dump of memory from 0x00007EFD5A631200 to 0x00007EFD5A633200 7EFD5A631200 0000A206 01C00084 009B87A7 06010000 [................] 7EFD5A631210 0000BC1E 00000001 00017A7C 009B8797 [........|z......] 7EFD5A631220 00000000 0032F802 01C00080 00060008 [......2.........] 7EFD5A631230 00000EFE 00C0093B 000505F5 00002001 [....;........ ..] 7EFD5A631240 009B87A7 00000000 00000000 00000000 [................] 7EFD5A631250 00000000 00000000 00000000 00000000 [................] 7EFD5A631260 00000000 00010100 0014FFFF 1F781F8C [..............x.] 7EFD5A631270 00001F78 1F8C0001 00000000 00000000 [x...............] 7EFD5A631280 00000000 00000000 00000000 00000000 [................] Repeat 502 times 7EFD5A6331F0 0202012C 410502C1 41414141 87A70601 [,......AAAAA....] Block header dump: 0x01c00084 Object id on Block? Y seg/obj: 0x17a7c csc: 0x00.9b8797(块清除的时候的SCN) itc: 2 (ilt槽数) flg: E typ: 1 - DATA brn: 0 bdba: 0x1c00080 ver: 0x01 opc: 0 inc: 0 exflg: 0 Itl Xid Uba Flag Lck Scn/Fsc 0x01 0x0008.006.00000efe 0x00c0093b.05f5.05 --U- 1 fsc 0x0000.009b87a7 0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 ########################################## csc:块最后清除时的scn ,itc事务槽数,type 1是data 2是index,xid事务id(undoseg.slot.wrap),
uba undo地址(undodba.seqno,recordno) flag c=commit u=commit upper bound; t=active at csc lock被这个事务影响的行数,
scn/fsc scn=scn of commited tx fsc=free space credit select xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarec from v$transaction; 可以查这个来对比 Flag:事务标志位。这个标志位就记录了这个事务的操作状态,各个标志的含义分别是: C = transaction has been committed and locks cleaned out --事物已经提交,锁已经被清除 B = this undo record contains the undo for this ITL entry U = transaction committed (maybe long ago); SCN is an upper bound --事物已经提交,但是锁还没有清除 T = transaction was still active at block cleanout SCN --块清除的SCN被记录时,该事务仍然是活动的,块 上如果有已经提交的事务,那么在clean ount的时候,块会被进行清除,但是这个块里面的事务不会被清除。 Lck:表示这个事务所影响的行数。我们看到01号事物槽Lck为0,因为该事物槽中的事物Flag为C,证明该事物 已经提交,锁也被清楚掉了,该事物槽可以被重用了。02号事物槽Lck为1,是因为我对第一行做了一个更新, 并且没有提交,Flag为----说明该事物是活动的。 Scn/Fsc:Commit SCN或者快速提交(Fast Commit Fsc)的SCN。 每条记录中的行级锁对应Itl条目lb,对应于Itl列表中的序号,即那个事务在该记录上产生的锁。 对于Oracle来说,对于一个事务,可以是快速提交、也可以是延迟提交,目的都是为了提高提交的速度。提交以后,
oracle需要对ITL事务槽、每一行的锁定标记进行清除。如果是快速提交,那么在提交的时候,会将事务表和每一个数据块的ITL槽进行清除。
但是锁定标记可能没有清除,等下次用到的时候再进行清除。如果是延迟提交,那么在提交的时候,只是将事务表进行清除,
并没有对ITL事务槽进行清除,每一行的锁定标记也没有清除。因此C和U的情况特别多。块清除的过程并不包括每个行的锁定标记的清除,
主要指的是ITL的清除。 注意: 1、事务槽中首先记录的是Xid和Uba,只有在提交以后,当对这个数据块进行cleanout的时候,才会更新Flag和Scn。
因此Oracle总是以事务表中对这个数据块的Scn以及Flag为准。 2、一个事务开始以后,在一个数据块上得到一个事务槽,那么在这个事务提交以前,这个事务槽会一直占用,
直到这个事务提交释放这个事务槽。 3、只有在已经提交以后,这个itl事务槽中的scn才会有数值。 4、事务是否已经提交、事务对应的SCN,这些信息都是以回滚段事务表中的为主,事务槽中的不准确 5、事务槽中的事务id和uba地址是准确的 6、事务槽1中的事务id和回滚段中的事务id肯定不是一样的,不同回滚段中的事务id也一定不一样。 ##########################################
bdba: 0x01c00084
data_block_dump,data header at 0x7efd5a631264 =============== tsiz: 0x1f98 hsiz: 0x14 pbl: 0x7efd5a631264 76543210 flag=-------- ntab=1 nrow=1 frre=-1 fsbo=0x14 fseo=0x1f8c avsp=0x1f78 tosp=0x1f78 0xe:pti[0] nrow=1 offs=0 0x12:pri[0] offs=0x1f8c block_row_dump: tab 0, row 0, @0x1f8c tl: 12 fb: --H-FL-- lb: 0x1 cc: 2 col 0: [ 2] c1 02 col 1: [ 5] 41 41 41 41 41 end_of_block_dump End dump data blocks tsn: 9 file#: 7 minblk 132 maxblk 132 ########################################
bdba: 0x01c00084-- 数据块的地址:16进制转成2进制取前10位二进制为文件号0000 0001 1100 ..... 0000000110=7号文件,
后面剩于的部分表示块号,0X84转成10进制为132号块 tsiz:数据区总大小 hsiz数据头大小 pbl指向持有该块的buffer指针 bdba数据块的相对地址 flag n=pctfree hit;
f=不放到空闲列表上,k=可刷新簇键 ntab表行数 nrow行数量,frre第一个索引的条目,如果是-1说明需要创建索引,
fsbo开始偏移的自由空间,fseo结束便宜的自由空间。avsp块中可用空间。tosp 当tx提交后总的可用空间 nrow第一个表行数。 lb锁字节 cc在这个行片中的列数,fb flag byte,t1行大小,col column数据。
hsiz: 0x14 --Data header size 数据头大小即20个字节
pbl: 0x7efd5a631264 76543210 --Pointer to buffer holding the block
76543210
flag=-------- N=pcrfree hit(clusters);F=do not put on free list;K=flushable cluster keys
ntab=1 --叫表数:表示这个块的数据在一个表(如果是聚簇表就有可能是2或2以上)
nrow=1 --叫行数:表示这个表有一行数据
frre=-1 -- The first free row entry in the row directory=you have to add one
fsbo=0x14 -- Free space begin offset 叫起始空间:可以存放数据空间的起始位置(即定义了数据层中空闲空间的起始offset)
fseo=0x1f8c -- Free space end offset 叫结束空间:可以存放数据空间的结束位置(即定义了数据层中空闲空间的结束offset)
avsp=0x1f78 --Available space for new entries 叫空闲空间:定义了数据层中空闲空间的字节数
tosp=0x1f78 --Total space 叫最终空闲空间:定义了ITL中事务提交后,数据层中空闲空间的字节数
0xe:pti[0] nrow=1 offs=0 --Table directory,整个表的开始,共一行数据 ,定义了该表在行索引中使用的插槽数
0x12:pri[0] offs=0x1f8c --Row index,叫行索引,定义了该块中包含的所有行数据的位置
tab 0, row 0, @0x1f8c --第一个表第一行的位置 ,定义了该表在行索引中的起始插槽号
tl: 12 fb: --H-FL-- lb: 0x1 cc: 2 --行头,tl: 12行长度12个字节,
fb: (Flag byte)--H-FL指H(Head piece of row)F(First data piece) L(Last data piece)
lb: 0x1 --Lock byte和上面的ITL的lck相对应,表示这行是否被lock了
cc: 2 --表示有两列,即这个表有两个字段
col 0: [ 2] c1 02 --第一行的第一个字段长度和值
col 1: [ 5] 41 41 41 41 41 --第一行的第二个字段长度和值
数据块的最后四字节tail: 0xa3eb0601=scn BASE+flg+seq ########################################
二,测试dump文件02
01,建立表数据
create table t2(id int,name varchar2(10))segment creation SQL> create table t2(id int,name varchar2(10))segment creation immediate; Table created. immediate; SQL> select extent_id,file_id,block_id from dba_extents where segment_name='T2'; EXTENT_ID FILE_ID BLOCK_ID ---------- ---------- ---------- 0 7 136 SQL> alter system dump datafile 7 block 136; System altered.
02,查看dump文件,
发现新增的数据,再文件 的最后
Start dump data blocks tsn: 9 file#:7 minblk 136 maxblk 136 *** 2019-05-05 10:37:30.903 Block dump from cache: Dump of buffer cache at level 4 for tsn=9 rdba=29360264 BH (0x83f93b08) file#: 7 rdba: 0x01c00088 (7/136) class: 8 ba: 0x834e6000 set: 5 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 44,28 dbwrid: 0 obj: 96895 objn: 96895 tsn: 9 afn: 7 hint: f hash: [0x7cf9e2b8,0xf35ca2b0] lru: [0x83f93e68,0x83f93988] obj-flags: object_ckpt_list ckptq: [0x83f93898,0x83f93d78] fileq: [0xf2147838,0x83f93d88] objq: [0x83f93e90,0xe73b4ae0] objaq: [0x83f93ea0,0xe73b4ac0] st: XCURRENT md: NULL fpin: 'kcbwh6: kcbnew' tch: 1 flags: buffer_dirty redo_since_read LRBA: [0x7db.206.0] LSCN: [0x0.9ba0f2] HSCN: [0x0.9ba0f2] HSUB: [6] Block dump from disk: buffer tsn: 9 rdba: 0x00000088 (0/136) scn: 0x0000.00000000 seq: 0x01 flg: 0x05 tail: 0x00000001 frmt: 0x02 chkval: 0xa788 type: 0x00=unknown Hex dump of corrupt header 4 = CORRUPT Dump of memory from 0x00007EFD5A631200 to 0x00007EFD5A631214 7EFD5A631200 0000A200 00000088 00000000 05010000 [................] 7EFD5A631210 0000A788 [....] Hex dump of block: st=4, typ_found=0 Dump of memory from 0x00007EFD5A631200 to 0x00007EFD5A633200 7EFD5A631200 0000A200 00000088 00000000 05010000 [................] 7EFD5A631210 0000A788 00000000 00000000 00000000 [................] 7EFD5A631220 00000000 00000000 00000000 00000000 [................] Repeat 508 times 7EFD5A6331F0 00000000 00000000 00000000 00000001 [................] End dump data blocks tsn: 9 file#: 7 minblk 136 maxblk 136
发现改变了flg-->0X05是0X01和0X04的集合,0X01表示新建的块,0X04表示设置校验。chkval: 0xa88就是校验和。