redo的內容
Oracle通過redo來實同快速提交,一方面是因為redo log file可以連續,順序地快速寫出,另外一個方面
也和redo記錄的精簡內容有關.
為了瞭解redo的內容,先需要瞭解兩個概念:改變向量和重做記錄
改變向量(change vector)
改變向量表示對資料庫內某一個資料區塊所做的一次變更.改變向量(change vector)中包含了變更的資料
塊的版本號碼,事務作業碼,變更從屬資料區塊的地址(DBA)以及更新後的資料.例如,一個update事務包含
一系列的改變向量,對於資料區塊的修改是一個向量,對於復原段的修改又是一處向量.
重做記錄(redo record)
重做記錄通常由一組改變向量組成,是一個改變向量的集合,代表一個資料庫的變更(insert,update,delete
等操作),構成資料庫變更的最小恢複單位.例如,一個update的重做記錄包括相應的復原段的改變向量和相應
的資料區塊的改變向量等.
假定發出了一個更新語句;
update scott.emp set sal=4000 where empno=7788;
看一下這個語句是怎麼執行的
1.檢查empno=7788記錄在buffer cache中是否存在,如果不存在則讀取到buffer cache中.
2.在復原資料表空間的相應復原段事務表上分配事務槽,這個操作需要記錄redo資訊.
3.從復原段讀入或者在buffer cache中建立sal=3000的前鏡像,這需要產生redo資訊並記入redo log buffer
4.修改sal=4000,這是update的資料變更,需要記入redo log buffer
5.當使用者提交時,會在redo log buffer記錄提交資訊,並在復原區段標記該事務為非啟用(Inactive)
下面通過珍上具體的實驗來再現這個過程.
1.先通過switch logfile切換日誌,使用sys使用者進行日誌切換,使得接下來的更新可以使用新的日誌.
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ------------
1 1 14 52428800 1 NO ACTIVE
801067 03-JAN-14
2 1 15 52428800 1 NO CURRENT
813289 04-JAN-13
3 1 13 52428800 1 NO INACTIVE
764715 30-DEC-13
2.更新並提交事務
SQL> select * from scott.emp a where a.empno=7788;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- ------------ ---------- ----------
DEPTNO
----------
7788 SCOTT ANALYST 7566 19-APR-87 3000
20
SQL> update scott.emp set sal=4000 where empno=7788;
1 row updated.
SQL> commit;
Commit complete.
3.使用sys使用者在另外的session轉儲記錄檔:
SQL> alter system dump logfile '/u01/app/oracle/product/10.2.0/oradata/jingyong/redo02.log';
System altered.
SQL> select
2 d.value||'/'||lower(rtrim(i.instance,
3 chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
4 from ( select p.spid
5 from sys.v$mystat m,
6 sys.v$session s,sys.v$process p
7 where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
8 ( select t.instance from sys.v$thread t,sys.v$parameter v
9 where v.name = 'thread' and
10 (v.value = 0 or t.thread# = to_number(v.value))) i,
11 ( select value from sys.v$parameter
12 where name = 'user_dump_dest') d
13 /
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/admin/jingyong/udump/jingyong_ora_3969.trc