码迷,mamicode.com
首页 > 其他好文 > 详细

redo中的update

时间:2015-06-23 21:41:03      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
SQL> !uname -a
Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Mon Mar 29 20:06:41 EDT 2010 i686 i686 i386 GNU/Linux
首先我们创建一个表tt,并插入数据:

SQL> select * from tt;

       ID
----------
         0
         2
         3
         4
         5
         6
         7
         8
         9
        10


已选择10行。

为了便于后面的研究,可以强制切换日志:
alter  system switch logfile;
SQL> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS          FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
NEXT_CHANGE# NEXT_TIME
------------ --------------
         1          1        592   52428800        512          1 YES INACTIVE              10459317 23-6月 -15
    10460687 23-6月 -15


         2          1        593   52428800        512          1 YES INACTIVE              10460687 23-6月 -15
    10460698 23-6月 -15


         3          1        594   52428800        512          1 NO  CURRENT               10460698 23-6月 -15
  2.8147E+14




SQL> select * from v$logfile;


    GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
------------------------------------------------------------------------------------------------------------------------
IS_
---
         3         ONLINE
/u01/app/oracle/oradata/orcl3939/redo03.log
NO


         2         ONLINE
/u01/app/oracle/oradata/orcl3939/redo02.log
NO


         1         ONLINE
/u01/app/oracle/oradata/orcl3939/redo01.log
NO


SQL> select sid,serial#,username from v$session where username=‘HR‘;


       SID    SERIAL# USERNAME
---------- ---------- ------------------------------
       147         38 HR
SQL> update tt set id=1 where id=0;


已更新1行。


SQL> commit;


提交完成。



SQL> alter system dump logfile ‘/u01/app/oracle/oradata/orcl3939/redo03.log‘;


系统已更改。


SQL> select value from v$diag_info where name=‘Default Trace File‘;


VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl3939/orcl3939/trace/orcl3939_ora_7209.trc


介绍下面内容之前,谈两个概念:
重做记录(redo record):重做记录通常由一组改变向量组成,是一个改变向量的集合,代表一个数据库的变更,如dml操作等,构成数据库变更的最小恢复最小单位。本例就是update的重做记录包括了相应的回滚段的改变向量和相应的数据块的改变向量。
改变向量(change vector):改变向量表示对数据库内某一个数据块所做的一次变更。改变向量总包括了变更的数据块的版本号,事务操作代码,变更从属数据块的地址(DBA)以及变更后的数据。本例就是一个update事务包含了一系列的变更向量,对于数据块的修改就是一个向量,对于回滚段的修改又是一个向量。


下面摘自日志文件的trace文件:


REDO RECORD - Thread:1 RBA: 0x000252.00000004.0010 LEN: 0x0214 VLD: 0x0d
SCN: 0x0000.009f9e26 SUBSCN:  1 06/23/2015 19:33:04
改变向量1:

CHANGE #1 TYP:2 CLS:1 AFN:4 DBA:0x0100008f OBJ:79489 SCN:0x0000.009f9a3d SEQ:1 OP:11.5 ENC:0 RBL:0
KTB Redo 
op: 0x11  ver: 0x01  
compat bit: 4 (post-11) padding: 1
op: F  xid:  0x0009.006.00001023    uba: 0x00c00988.051b.39
Block cleanout record, scn:  0x0000.009f9e23 ver: 0x01 opt: 0x02, entries follow...
  itli: 2  flg: 2  scn: 0x0000.009f9a3d
KDO Op code: URP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x0100008f  hdba: 0x0100008a
itli: 1  ispac: 0  maxfr: 4858
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 1 ckix: 191
ncol: 1 nnew: 1 size: 1
col  0: [ 2]  c1 02   修改后的col 0,数值为1,c1是符号位(十六进制数),02是数值位
CHANGE #2 TYP:0 CLS:33 AFN:3 DBA:0x00c00100 OBJ:4294967295 SCN:0x0000.009f9df2 SEQ:2 OP:5.2 ENC:0 RBL:0
ktudh redo: slt: 0x0006 sqn: 0x00001023 flg: 0x0012 siz: 160 fbi: 0
            uba: 0x00c00988.051b.39    pxid:  0x0000.000.00000000
CHANGE #3 TYP:0 CLS:33 AFN:3 DBA:0x00c00100 OBJ:4294967295 SCN:0x0000.009f9e26 SEQ:1 OP:5.4 ENC:0 RBL:0
ktucm redo: slt: 0x0006 sqn: 0x00001023 srt: 0 sta: 9 flg: 0x0 
CHANGE #4 TYP:0 CLS:34 AFN:3 DBA:0x00c00988 OBJ:4294967295 SCN:0x0000.009f9df2 SEQ:3 OP:5.1 ENC:0 RBL:0
ktudb redo: siz: 160 spc: 522 flg: 0x0012 seq: 0x051b rec: 0x39
            xid:  0x0009.006.00001023  
ktubl redo: slt: 6 rci: 0 opc: 11.1 [objn: 77450 objd: 79489 tsn: 4]
Undo type:  Regular undo        Begin trans    Last buffer split:  No 
Temp Object:  No 
Tablespace Undo:  No 
             0x00000000  prev ctl uba: 0x00c00988.051b.36 
prev ctl max cmt scn:  0x0000.009f99e1  prev tx cmt scn:  0x0000.009f99e9 
txn start scn:  0x0000.009f9e05  logon user: 106  prev brb: 12585348  prev bcl: 0 BuExt idx: 0 flg2: 0
KDO undo record:
KTB Redo 
op: 0x04  ver: 0x01  
compat bit: 4 (post-11) padding: 1
op: L  itl: xid:  0x0004.019.00000c0b uba: 0x00c01397.030b.38
                      flg: C---    lkc:  0     scn: 0x0000.009f926c
KDO Op code: URP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x0100008f  hdba: 0x0100008a
itli: 1  ispac: 0  maxfr: 4858
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 191
ncol: 1 nnew: 1 size: -1
col  0: [ 1]  80   修改前的col 0:数值是0,80是符号位(十六进制数)
 上面只是简单的介绍update时,日志文件里记录的内容,感兴趣可以研究delete,insert等,

redo中的update

标签:

原文地址:http://blog.csdn.net/bat_os/article/details/46609937

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!