天天看點

Redo的管理與優化

一、什麼是REDO LOG

REDOLOG檔案是十分重要的檔案,它記錄了Oracle的所有變化,是資料庫執行個體恢複機制中最為關鍵的組成部分。

sys@OCM> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME           
1          1         49   52428800        512          1 YES INACTIVE               2701394 09-3ÔÂ -13   2711001 09-3ÔÂ -13
     2          1         50   52428800        512          1 YES INACTIVE               2711001 09-3ÔÂ -13   2732482 10-3ÔÂ -13
     3          1         51   52428800        512          1 NO  CURRENT              2732482 10-3ÔÂ -13       2.8147E+14


           

sys@OCM> col member for a50

sys@OCM> select * from v$logfile;

GROUP# STATUS  TYPE    MEMBER                                             IS_           
3         ONLINE  /u01/app/oracle/oradata/ocm/redo03.log             NO
     2         ONLINE  /u01/app/oracle/oradata/ocm/redo02.log             NO
     1         ONLINE  /u01/app/oracle/oradata/ocm/redo01.log             NO

           

二、REDO LOG的作用

1、記錄ORACLE資料庫的變化

2、可以避免資料送出後直接寫入資料檔案

3、執行個體恢複和媒體恢複

三、REDO LOG的塊

1、塊的大小

(1)dbfsize redo01.log

(2)SELECT DISTINCT BLOCK_SIZE FROM V$ARCHIVED_LOG;

(3)SELECT MAX(LEBSZ) FROM X$KCCLE;

 (4)日志檔案頭的内容

 ALTER SESSION SET EVENTS 'immediate trace name redohdr level 10';

2、REDO的内容

 (1)改變矢量(Change Vector)

(2)重做記錄(Redo Record)

 (3)一條插入的産生的日志

create table t5(id int,name varchar2(100));

select max(ktuxescnw * power(2,32)+ktuxescnb) from x$ktuxe;--[K]ernel [T]ransaction [U]ndo Transa[x]tion Entry

insert into t5 values(1,'AAAAAA');

commit;

select max(ktuxescnw * power(2,32)+ktuxescnb) from x$ktuxe;

alter system dump logfile '/u01/app/oracle/oradata/ocp/redo02.log' scn min 1694394 scn max 1693357;

四、和REDO LOG性能相關的元件

1、記錄執行個體中的資料庫變化
           

2、順序存取

3、環狀的緩沖區

4、LOG_BUFFER定義了緩沖區的大小           

   (1)9i以前,一般是3M

   (2)在10g中ORACLE會自動調整它的值,他遵循這樣一個原則,'Fixed SGA Size'+ 'Redo Buffers'是granule size 的整數倍

select * from v$sgainfo where name in ('Fixed SGA Size','Redo Buffers','Granule Size');

--在10.2.0.3 中Log Buffer 預設值是14M,在10.2.0.4中,預設值是15M

select * from v$version where rownum<2;

5、LGWR

(1)、LGWR寫的具體過程:

   ①先嘗試擷取redo writing latch,確定其他process不會繼續觸發lgwr(這裡可能會産生log file sync等待事件)

  ②擷取redo allocation latch(public redo allocation latch),防止有新的change vector繼續寫入log buffer,造成LGWR無法确定應該寫多少redo

  ③LGWR确定寫的範圍(從上次lgwr啟動所寫的最後一個日志塊到這個時間點時的最後一個被使用的所有寫滿or未寫滿的日志塊)此時前台process仍可以向這個範圍内的redo block(buffer)寫内容(從PGA寫)是以lgwr不阻礙其它程序獲得redo copy latch(即:不阻止其它程序向log buffer 中可用塊中寫change vector)

  ④确定redo block(buffer)後生成新SCN号

  ⑤LGWR釋放redo allocation latch與redo writing latch

  ⑥LGWR需要等待 其它程序對要寫入日志檔案的block的更新操作完成(pga-log buffer的操作),通過判斷日志block(buffer)上的redo copy latch是否都釋放

  ⑦将第4步scn号copy到要寫入logfile的log buffer的塊頭裡,然後觸發實體的寫操作,将這些待寫日志塊寫入redo file

(2)LGWR觸發寫日志的條件:

①LGWR每3秒鐘
           

  ② commit;

③LOG_BUFFER寫入的數量超過LOG BUFFER的1/3

 ④LOG BUFFER中有超過1M的資料

 ⑤DBWR寫入資料檔案之前,DBWR需要寫入的資料的SCN大于LGWR記錄的SCN,DBWR觸LGWR寫入(日志優先)

           

6、REDO LOG組

(1)Oracle循環使用REDO LOG組

(2)REDO LOG組的數量對資料庫的影響

①日志切換等待

 ②系統由于等待日志切換而HANG住
           

(3)REDO LOG組的數量

①預設3組(10g)

  ②根據實際需要設定

  ③增加日志組的數量對資料庫性能無直接影響

  ④可線上添加日志組           

alter database add logfile group 4 '/opt/oracle/oradata/dbtest/redo04_1.log' SIZE 100M

alter database drop logfile group 1;

alter system siwtch logfile;

7、REDO LOG組的鏡像

(1)REDO LOG鏡像的主要目的是加強REDO LOG的安全性

(2)鏡像設定的原則

①同一個資料庫中設定鏡像的規則應該一緻 --不同的日志組設相同的成員


 ②多個鏡像檔案應該存放在不同的VG或者檔案系統上 --壞一個vg不影響資料庫

 ③不同鏡像最好能夠分布在不同的磁盤上  --IO

 ④鏡像的數量以一個為宜                --IO
           

(3)鏡像對資料庫性能的影響

①REDO LOG鏡像會消耗較多的IO資源

 ②IO性能不佳的系統慎用

 ③小型寫性能不佳的系統慎用           

alter database add logfile member '/opt/oracle/oradata/dbtest/redo04_3.log' to group 4

alter database drop logfile member '/u01/app/oracle/oradata/ocp/redo01_2.log';

8、日志切換

(1)日志切換的場景

 ①目前日志檔案滿後

 ②ALTER SYSTEM SWITCH LOGFILE;

 ③ALTER SYSTEM ARCHIVE LOG CURRENT;--所有執行個體的目前日志

(2)日志切換的過程

 ①讀控制檔案,選擇下一個日志檔案,并清除控制檔案中的相關記錄。如果DBW程序正在進行日志切換檢查點,或者ARCHn程序正在歸檔日志内容,那麼LGWR會等待這些操作完成才進行日志切換工作。

 ②把目前沒有存盤的所有LOG BUFFER都寫入磁盤,然後把最後一個REDO記錄的SCN寫入LOG檔案的頭塊中。完成這些操作後,LGWR關閉目前的日志檔案。

 ③進行第二次讀控制檔案,把下一個日志檔案的狀态設定為CURRENT,老的日志檔案修改為ACTIVE。當DBW完成日志切換檢查點和歸檔操作後,這個日志檔案的狀态會被改為INACTIVE。

 ④打開新日志檔案的所有成員(如果組中有超過1個成員),并在檔案頭中寫入一個新的日志序列号和low SCN。然後修改SGA控制變量,允許生成REDO資訊。要注意的是,因為寫入檔案頭的資訊包括檔案編号,是以寫檔案頭的操作不是并行操作,對于同組的不同成員,寫入的資料不是完全一緻的。

五、性能相關

1、REDO LOG檔案的大小與日志切換

(1)日志切換對系統性能的影響

①日志檔案切換時,系統将處于完全的等待狀态

  ②日志檔案切換過于頻繁,會影響系統的性能

  ③日志檔案切換時間過長,會嚴重影響系統的性能
           

(2)日志切換與日志檔案的大小

①日志檔案越小,日志切換越頻繁

  ②日志檔案越大,每個日志檔案中包含的變化越多

  ③日志檔案切換以10-30分鐘為宜

  ④日志檔案大小一般在100M-2000M之間
           

(3)問題場景

Thread 1 cannot allocate new log,sequence 69
   Checkpoint not complete
   current log#2 seq# 68 mem# 0:/oradata/bxdb/redo02.log
   等待事件:
   log file switch(checkpoint incomplete)
   log file switch(archiving needed)

           

2、等待事件:log file sync

(1)問題場景
   發出commit:
    開始commit-->logfile sync等待開始--->lgwr開始-->lgwr完成(IO)-->logfile sync等待結束--commit完成

 (2)解決方法:
   ①IO性能來解決這個問題:RAID 5--->RAID 1+0

   ②加大LOG BUFFER

   ③減少送出的次數

   ④把部分經常送出的事務設定為異步送出:ALTER SESSION SET COMMIT_WRITE = NOWAIT;
     

           

(3)nologging使用

表空間:1.nologgin,2.force logging
alter tablespace test3 nologging;
create table a(id int) tablespace test3; //test3-->nologging
alter tablespace test3 no force logging;
表:1.no force logging start  2.表本身no logging(alter table a nologging;)  3.使用append插入
insert /*+ append */ into test3 select * from t3;
*************supplemental
select supplemental_log_data_min,supplemental_log_data_pk from v$databae;
alter database add supplemental log data; --rowid
alter database add supplemental log data(primary key) columns; --primary

           

六、開啟歸檔模式

SELECT log_mode FROM v$database;

ARCHIVE LOG LIST;

alter system set log_archive_dest_1 = 'LOCATION=/u01/app/oracle/archivelog3';

shutdown immediate;

startup mount;

alter database archivelog;

select dest_name,status,archiver,destination,log_sequence,reopen_secs,transmit_mode,process

from v$archive_dest; --歸檔路徑及狀态

select name,sequence#,registrar,standby_dest,archived,status from v$archived_log;--從控制檔案中獲得歸檔的相關資訊

v$log_history --控制檔案中日志的曆史資訊

v$archive_processes --歸檔相關的背景程序資訊

select member,bytes/1024/1024 from v$log a,v$logfile b where a.group#=b.group#;