Oracle UNDO块
副标题[/!--empirenews.page--]
?1)首先更新几条数据,但是不进行commit如下: [email?protected] prod>select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30 [email?protected] prod>update scott.emp set sal=2000 where empno=‘7369‘; 1 row updated. [email?protected] prod>update scott.emp set sal=2001 where empno=‘7499‘; 1 row updated. [email?protected] prod>update scott.emp set sal=2002 where empno=‘7521‘; 1 row updated. [email?protected] prod>update scott.emp set sal=2003 where empno=‘7566‘; 1 row updated. ?2)v$transaction列出活动事务相关信息 [email?protected] prod>select xidusn,xidslot,ubafil,ubablk from v$transaction; XIDUSN XIDSLOT UBAFIL UBABLK ---------- ---------- ---------- ---------- 11 25 6 12 XIDUSN:Undo segment number 3)V$ROLLNAME列出所有在线回滚段。只能在数据库打开时访问。 [email?protected] prod>select * from v$rollname where usn=11; USN NAME ---------- ------------------------------ 11 _SYSSMU11_1796584641$? NAME:Rollback segment name 4)V$ROLLSTAT包含回滚段信息。 [email?protected] prod>select usn,status,curext,xacts from v$rollstat; USN STATUS CUREXT XACTS ---------- --------------- ---------- ---------- 0 ONLINE 1 0 11 ONLINE 0 1? USN:Rollback segment number 4)转储undo header [email?protected] prod>alter system dump undo header ‘_SYSSMU11_1796584641$‘; System altered.? 5)查看默认trace文件位置? [email?protected] prod>col value for a50 [email?protected] prod>select * from v$diag_info; INST_ID NAME VALUE ---------- ---------------------------------------------------------------- -------------------------------------------------- 1 Diag Enabled TRUE 1 ADR Base /u01 1 ADR Home /u01/diag/rdbms/prod/prod 1 Diag Trace /u01/diag/rdbms/prod/prod/trace 1 Diag Alert /u01/diag/rdbms/prod/prod/alert 1 Diag Incident /u01/diag/rdbms/prod/prod/incident 1 Diag Cdump /u01/diag/rdbms/prod/prod/cdump 1 Health Monitor /u01/diag/rdbms/prod/prod/hm 1 Default Trace File /u01/diag/rdbms/prod/prod/trace/prod_ora_2361.trc 1 Active Problem Count 0 1 Active Incident Count 0 11 rows selected.? 6)分析UDNO段头块的日志? more /u01/diag/rdbms/prod/prod/trace/prod_ora_2361.trc? ******************************************************************************** Undo Segment: _SYSSMU11_1796584641$ (11) ******************************************************************************** Extent Control Header ----------------------------------------------------------------- Extent Header:: spare1: 0 spare2: 0 #extents: 2 #blocks: 15 last map 0x00000000 #maps: 0 offset: 4080 Highwater:: 0x0180000e ext#: 0 blk#: 5 ext size: 7 #blocks in seg. hdr‘s freelists: 0 #blocks below: 0 mapblk 0x00000000 offset: 0 Unlocked Map Header:: next 0x00000000 #extents: 2 obj#: 0 flag: 0x40000000
7)通过dba_extents视图查出一共有两个区,共16个块? [email?protected] prod>select extent_id,file_id,block_id,blocks,bytes from dba_extents where segment_name=‘_SYSSMU11_1796584641$‘; EXTENT_ID FILE_ID BLOCK_ID BLOCKS BYTES ---------- ---------- ---------- ---------- ---------- 0 6 8 8 65536 1 6 16 8 65536 8)通过dba_segments视图查出UNDO段头块,即6号文件的8号块是UNDO段头块(所以#blocks:15) [email?protected] prod>select header_file,header_block from dba_segments where segment_name=‘_SYSSMU11_1796584641$‘; HEADER_FILE HEADER_BLOCK ----------- ------------ 6 8 ?9)继续向下 Extent Map ----------------------------------------------------------------- 0x01800009 length: 7 0x01800010 length: 8 ?区位图:第一个区是undo块的地址为0x0180009开始的前7个块+头块;第二个区是0x0180010开始的8-16块。 10)继续向下 Retention Table ----------------------------------------------------------- Extent Number:0 Commit Time: 1552092157 Extent Number:1 Commit Time: 1552092157? 区的提交时间戳,是从1970年1月1号零时开始计数(以秒为单位记录) 11)继续向下 TRN CTL:: seq: 0x0003 chd: 0x0020 ctl: 0x0000 inc: 0x00000000 nfb: 0x0001 mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe) uba: 0x0180000e.0003.0c scn: 0x0000.00104372? 事务控制: ?seq: 0x0003? 表示此事务修改前的值所在的UNDOBLOCK块被覆盖了3次,与第三行的uba:0x0180000f.0003.08中的0003对应。 ?chd:0x0020? 表示发生一个新的事务,此时会在下面的TRNTBL::(事务表)的index=0x00020槽中放入新事务信息,即事务表的链头或叫入口。 ?ctl: 0x0000? 表示事务表的链尾(实际上大家可以去TRN TBL::看index=0x0000,它对应的SCN=0x0000.00104485是本事务表中最大的SCN,即此事务槽最后才会被覆盖) ?nfb: 0x0001??表示UNDO块在空闲池的空闲块数,0x0000表示池中没有空闲UNDO块了,即FREE BLOCKPOOL::没空闲的块了。 ?flg: 0x0001??表示该块的用途,1=KTUUNDO HEADER(2=KTU UNDO BLOCK等等) ?uba:?0x0180000e.0003.0c 表示新事务的第一条UNDO记录(由三部分组成undo块的地址、UNDO块被重用的次数、在UNDO块的第几条记录)。
12)继续向下 FREE BLOCK POOL:: uba: 0x0180000e.0003.0e ext: 0x0 spc: 0x183a uba: 0x00000000.0003.19 ext: 0x0 spc: 0x10c0 uba: 0x00000000.0001.0e ext: 0x0 spc: 0x18a2 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0? UNDO块的空闲池,当事务做了提交会把此事务所在的UNDO块加入空闲池中。 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |