redo中的update,redoupdate

來源:互聯網
上載者:User

redo中的update,redoupdate
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
http://docs.oracle.com/cd/E11882_01/server.112/e25494/onlineredo.htm#ADMIN11302官方文檔redo的管理介紹。
首先我們建立一個表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等,

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.