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