Redo Log概念數據庫
規劃Redo Log緩存
建立Redo Log組和成員bash
從新分配、命名Redo Log成員oracle
刪除Redo Log組和成員ide
強制切換日誌this
驗證Redo Log文件塊spa
清理Redo Log 文件線程
Redo Log字典視圖日誌
Redo Log 概念code
Redo Threads
redo log相對於每個數據庫實例都有一個redo線程。典型配置中,僅一個數據庫實例訪問數據庫,因此僅出現一個redo 線程。但在RAC環境中,兩個或更多的實例並行訪問一個數據庫,每個實例都擁有它本身的redo 線程。分離的redo線程爲避免在一個redo log file集上產生競爭,所以這種預估的潛在的瓶頸致使咱們須要瞭解如何對redo log進程配置和管理。
Redo Log Contents
redo records(redo記錄)被寫入至redo log file中,一條redo記錄,一般也稱爲redo entry,是由一組change vectors組成,每一組改變扇區描述數據庫的單個塊的改動狀況。好比,你改變employee表中的一條salary的值,這個改變就包含了改變扇區,其中描述了表的數據段的塊、undo段的數據塊、和事務表的undo段。
Redo條目記錄數據能夠用來重構全部數據庫的改變,包括undo段。所以,redo log也用於保護回滾數據。當咱們經過redo 數據恢復數據庫時,數據庫讀redo記錄中的改變扇區以及應用與這些改變相關的塊。
Redo記錄的緩衝位於SGA的一個循環刷新區成爲redo log buffer,這些緩存被LGWR進程寫到redo log file中,無論事務什麼時候提交,LGWR都將redo 記錄的事務寫入到redo log file中。並分配一個SCN(系統改變號)做爲每一條已提交事務的redo記錄點。
Redo記錄也能夠在相應事務提交前寫入redo log file中,若是redo log buffer已滿,或其餘事務提交,LGWR將buffer全部的redo log條目刷到redo log file中。即便一些redo記錄沒及時提交。若是有必要,數據庫能夠回滾這些改變。
Oracle數據庫怎樣寫Redo log
數據庫中的redo log一般由一或多個的文件組成。數據庫至少保證兩個文件中一個老是能夠寫的,另外一個用於歸檔(當數據庫處於歸檔模式)。
LGWR進程循環刷寫redo log文件,當某一個正在使用的redo log寫滿後,進程會切換到下一個可用的redo log文件中。當最後一個redo log 文件寫滿後,會切換回第一個redo log 文件進行記錄。以下圖所示:
若是在NOARCHIVELOG模式,一個滿載的redo log須要等到其中的改變記錄均被寫入到數據文件中後才能夠重用。
若是在ARCHIVELOG模式,則須要等待改變記錄被寫到數據文件並歸檔後纔可重用。
redo log的活動(當前)和非活動狀態
LGWR正在寫的redo log文件的狀態顯示爲current,redo log 文件可用於實例恢復的被稱爲active狀態。若是不在須要被用於實例恢復的則爲inactive狀態。
若是在ARCHIVELOG模式下,直到歸檔進程(ARCn)完成歸檔前數據庫都不能對該redo log文件重用或覆蓋。而在NOARCHIVELOG模式下,LGWR則會等到redo log處於inactive狀態時重寫該redo log。
log switch和log sequence number
日誌切換指出數據庫中止和開始寫的redo log文件。一般,日誌切換髮送在正在使用的redo log被寫滿,必須切換到下一個redo log文件。固然也能夠配置日誌切換的間隔。還能夠經過手動進行日誌切換。
oracle分配給每一個日誌文件一個序列號,每當發送切換時LGWR進程就安裝順序寫這些日誌文件,當歸檔日誌產生時,澤瀉歸檔獲取該日誌序列號。
規劃Redo log
多Redo Log 文件
放置Redo Log成員至不一樣磁盤
規劃Redo Log文件大小
規劃Redo Log文件的塊大小
選擇Redo Log文件的數量
控制歸檔延遲
多Redo Log 文件
多日誌文件用於保護redo log自身,至關於爲本身增長了一份拷貝。oracle能夠自動分開維護這些日誌文件。最好的習慣是,將日誌拷貝放在不一樣的磁盤中。即便主日誌和拷貝日誌放在同一磁盤中,拷貝日誌也能起到保護I/O錯誤,預防主日誌文件損壞等問題,當一組日誌存在多個成員時,LGWR將相同的Redo Log信息並行的寫入這些成員中。以防止單點故障。
上圖中A_LOG1和B_LOG1日誌爲group1的成員,A_LOG2和B_LOG2日誌爲group2的成員,一個組的成員必須是同大小的。且每個組的成員狀態也是一致的,即LGWR在寫group1是,不會出現A_LOG1和A_LOG2同時被寫的狀況。
若是LGWR不能將信息寫入某個組的成員。那麼數據庫會將該成員標記爲INVALID,並將報錯信息記錄到關於LGWR進程的跟蹤文件和告警日誌中。如下列表列出了繼紅不可寫入的狀況:
條件 | 動做 |
LGWR能夠將信息至少寫入日誌組中的一個成員 | 寫進程正常,LGWR寫可用該日誌成員忽略不可用的成員。 |
當發生日誌切換時,由於下一個日誌組正在歸檔致使LGWR不能寫該日誌組 | 數據庫操做進程臨時掛起直到該組可用或該組歸檔完畢。 |
由於介質失效致使日誌切換時LGWR不能訪問下一個組的全部成員 | 數據庫返回錯誤,並關閉實例。這種狀況須要從丟失的redo log 文件中進行介質恢復。 若是數據庫的checkpoint值超過了丟失redo log,不在須要介質恢復,由於redo中的數據記錄已被寫入到數據文件中。你只須要刪除不可訪問的日誌組,若是數據庫沒有多這個故障日誌進行歸檔,刪除前使用ALTER DATABASE CLEAR LOGFILE UNARCHIVED來關閉對該日誌組的歸檔。 |
全部組中的成員均不可訪問 | 數據庫返回錯誤,並關閉實例。這種狀況下,若是媒介包含的日誌實際上未丟失,須要進行介質恢復。 |
合法和非法的配置
一般狀況下,一個組能夠有多個成員,且每一個組成員數對稱。但數據庫也容許不對稱的狀況,即group1只有一個成員,但group2能夠有多個成員。以上狀況都屬於合法的配置,而數據庫要求至少有兩個組,不然不合法。
放置Redo Log成員至不一樣磁盤
規劃Redo Log文件大小
Redo Log最小文件大小爲4MB
規劃Redo Log文件的塊大小
與數據塊不一樣,日誌塊的大小老是固定等於物理扇區的大小512B,一些高級的磁盤驅動提供4K的扇區用於增長ECC能力和改進格式效率。大多數數據庫平臺均可以根據這類磁盤驅動將日誌的單個塊增大到4K。
雖則單個塊的增大。也存在redo浪費的狀況。事實上,4K的塊相對於512B塊的redo浪費更值得關注。redo wastage的信息被記錄在V$SESSTAT和V$SYSSTAT視圖中。
SELECT NAME,VALUE FROM V$SYSSTAT WHERE NAME='REDO WASTAGE';
能夠在CREATE DATABASE,ALTER DATABASE和CREATE CONTROLFILE語句中指定BLOCKSIZE關鍵字來指定日誌塊的大小,容許的大小爲5十二、1024和4096
ALTER DATABASE orcl ADD LOGFILE GROUP 4('/u01/oracle/orcl/redo04a.log','/u01/logs/orcl/redo04b.log') SIZE 100M BLOCKSIZE 512 REUSE;
要確認日誌的塊大小用如下語句
SQL> SELECT BLOCKSIZE FROM V$LOG;
選擇Redo Log文件的數量
在CREATE DATABASE語句中使用MAXLOGFILES參數來決定建立幾個redo log組。組的取值範圍是1到MAXLOGFILES,也能夠根據需求超過MAXLOGFILES的限制
在CREATE DATABASE語句中使用MAXLOGMEMBERS參數來決定組中的最大成員數,要超過MAXLOGMEMBERS上限的惟一方法是重建數據庫或控制文件,所以在建立數據庫前,須要考慮清楚。
控制歸檔延遲
能夠強制全部可用的日誌線程有規律的切換,在一個主備庫的配置中,這種改變對備庫是可用的,主庫經過歸檔日誌傳輸到備庫進行應用。這種狀況存在必定的滯後。由於備庫必須等待主庫歸檔並傳輸歸檔日誌到備庫。延遲能夠經過設置ARCHIVE_LAG_TARGET初始化參數來限定,單位爲秒。
ARCHIVE_LAG_TARGET的時間取決於當前日誌建立和歸檔當前日誌消耗時間的合計。
影響ARCHIVE_LAG_TARGET因素
日誌切換的最長時間
日誌切換會發生頻率
備庫可以容忍的日誌丟失數
建立日誌組和成員
建立組的方式1:
SQL> ALTER DATABASE ADD LOGFILE ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M;
建立組的方式2:
SQL> ALTER DATABASE ADD LOGFILE GROUP 10 ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M BLOCKSIZE 512;
爲組增長成員:
SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2b.rdo' TO GROUP 2;
方法2:
SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2c.rdo' TO ('/oracle/dbs/log2a.rdo', '/oracle/dbs/log2b.rdo');
重定位和命名日誌成員
SQL> SHUTDOWN IMMEDIATE mv /diska/logs/log1a.rdo /diskc/logs/log1c.rdo mv /diska/logs/log2a.rdo /diskc/logs/log2c.rdo SQL> CONNECT / as SYSDBA SQL> STARTUP MOUNT SQL> ALTER DATABASE RENAME FILE '/diska/logs/log1a.rdo', '/diska/logs/log2a.rdo' TO '/diskc/logs/log1c.rdo', '/diskc/logs/log2c.rdo'; SQL> ALTER DATABASE OPEN;
刪除Redo Log組和成員
SQL> SELECT GROUP#, ARCHIVED, STATUS FROM V$LOG; SQL> ALTER DATABASE DROP LOGFILE GROUP 3; SQL> ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo';
強制日誌切換
ALTER SYSTEM SWITCH LOGFILE;
驗證日誌的塊
在ALTER SYSTEM語句中使用DB_BLOCK_CHECKSUM參數
清理日誌文件
ALTER DATABASE CLEAR LOGFILE GROUP 3;
對未歸檔日誌清理
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;
日誌數據字典視圖
The following views provide information on redo logs.
View | Description |
---|---|
V$LOG |
顯示從控制文件中獲取的日誌信息 |
V$LOGFILE |
驗證日誌組、成員和成員狀態 |
V$LOG_HISTORY |
包含日誌歷史信息 |
SQL> col group# for 999999 SQL> col next_change# for 9999999999999999 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME ------- ---------- ---------- ---------- ---------- ---------- --- ---------- ------------- --------- ----------------- --------- 1 1 2429 52428800 512 2 YES INACTIVE 5523932 21-JUL-15 5525184 21-JUL-15 2 1 2431 52428800 512 2 NO CURRENT 5526351 21-JUL-15 281474976710655 3 1 2430 52428800 512 2 YES INACTIVE 5525184 21-JUL-15 5526351 21-JUL-15
SQL> col member for a30 SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER IS_ ------- ---------- ------- ------------------------------ --- 2 ONLINE /u01/oradata/sss/redo02.log NO 1 ONLINE /u01/oradata/sss/redo01.log NO 2 ONLINE /u01/oradata/sss/redo03.log NO 1 ONLINE /u01/oradata/sss/redo04.log NO 3 ONLINE /u01/oradata/sss/redo05.log NO 3 ONLINE /u01/oradata/sss/redo06.log NO
參考:http://docs.oracle.com/database/121/ADMIN/onlineredo.htm