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等,