oracle 重做日志内容,Oracle重做日志文件基础
本文以下所述內容是根據對"Oracle Database Administrator's Guide 11g Release 2 (11.2)" -- " 管理redo log "章節學習整理而來。
一、重做日志概述
重做日志對于Oracle數據庫的恢復來說是十分關鍵的,redo log包含兩個或更多的被預先分配的文件,在文件當中記錄著數據庫內發生的所有改變。每一個數據庫的實例都與其redo log相關聯,目的是保證在實例失敗時以保護數據庫中數據的安全。(維護數據的一致性,完整性)
1、重做線程
在多實例環境中,每個實例的重做日志也被稱為重做線程(redo thread)。在傳統的單實例環境中,僅有一個實例訪問數據庫,所以只有一個重做線程,在Oracle的RAC集群環境中,兩個或更多的實例同時訪問一個數據庫,每個實例都有它自己的重做線程,其目的為,每個實例分別使用自己的重做線程以避免對一個單一的重做日志文件的爭用,從而得以排除在這方面的潛在的性能瓶頸。
2、重做日志文件的內容
重做日志文件中包含的是重做記錄(redo record),也被稱為重做條目,重做記錄是由一組改變向量(change vector)構成,每一個改變向量描述了數據庫中每一個數據塊(oracle data block)的變化,通過使用重做記錄,能夠恢復數據庫產生的所有變化,包括回滾段,因此,重做日志也需要保護回滾數據。當使用重做日志文件恢復數據庫時,數據庫讀取重做日志中的改變向量并應用到與之相關的數據塊上。例如:修改雇員表中的薪水字段,在redo log中將會產生一條重做記錄,該重做記錄描述了表段中數據塊的變化。其包含如下change vector:undo redo --> undo --> redo --> do.
重做記錄被緩存在SGA的redo log buffer緩沖區中,這個緩沖區是可循環寫入的,緩沖區中的內容通過LGWR進程寫入重做日志文件中。每當一個事務提交時,LGWR將該事物產生的redo records從redo log buffer寫入重做日志文件,并且分配SCN(system change number)用以標識每次提交的redo records,僅當該事務的所有redo records都被安全的寫入了磁盤文件中后,才會出現事務已被提交的提示信息;重做記錄也可以在事務提交之前寫入重做日志文件,如果重做日志緩沖區已滿或者由于其他的事務提交,LGWR將重做日志緩沖區中的重做記錄寫入重做日志文件,盡管其中一些重做記錄沒有被提交,在必要的時候,數據庫會回滾這些變化。
3、重做記錄如何被寫入重做日志文件
在一個Oracle數據庫中最少需要兩個重做日志文件,以保證在其中一個日志歸檔時(archivelog mode),另一個日志是可以被寫入的。LGWR以一種循環的方式交替的使用重做日志文件。當前的重做日志文件被寫滿時,LGWR開始寫另一個可用的重做日志文件,當最后一個重做日志文件被寫滿時,LGWR又會反過來寫第一個重做日志文件。重做日志文件是否可被LGWR立即重用取決于數據庫是否啟用了歸檔模式:
a、在非歸檔模式中,在日志切換之前,日志中記錄的數據變化被同步到數據文件之后,LGWR將可以重用該重做日志文件。
b、在歸檔模式中,在日志切換之前,必須保證數據的變化被同步到數據文件且該日志已經完成歸檔之后,LGWR才可以重用該重做日志文件。
4、ACTIVE和INACTIVE狀態的區別
ACTIVE:以ACTIVE標識的重做日志文件對于實例恢復來說是必須的
INACTIVE:以INACTIVE標識的重做日志文件對于實例恢復來說不是必須的
5、日志切換和日志序列號
日志切換是指LGWR停止對一個日志文件的寫入操作并開始對另一個日志文件執行寫入操作。日志切換通常發生在當前日志已被寫滿的情況下。但是,并不是只有在當前日志被寫滿時才會發生日志切換,可以配置日志切換發生的頻率,而不管日志文件是否被寫滿,另外還可以手動執行強制的日志切換操作。
在發生日志切換時,Oracle為每一個重做日志文件分配日志序列號,在歸檔模式下,歸檔日志也使用該序列號。每一個在線或歸檔重做日志文件都通過這個序列號來唯一標識。在崩潰、實例、介質修復期間,數據庫將正確的,以日志序列號(log sequence)的遞增順序應用這些在線重做日志或歸檔重做日志。
二、規劃重做日志
1、多路復用重做日志文件
為了防止故障波及重做日志本身,Oracle允許使用多路復用重做日志,這意味著兩個或兩個以上相同的重做日志的副本可以保存在單獨的位置,即使重做日志的副本都在同一磁盤上,冗也余可以幫助防止I/O錯誤,文件損壞等等情況的出現。當重做日志文件被設置為多路復用時,LGWR同時寫入相同的信息到多個重做日志文件的副本,從而消除由于單點失敗引起的故障。
重做日志的多路復用是通過創建日志文件組的方式來實現的,一個日志文件組包含一個日志文件盒它的多個副本,日志組中的每一個日志成員都是完全相同的,日志文件組被一個數字標識,例如group 1,group 2,group 3,等等。在日志切換之后,當前日志組中的成員同時成為active狀態,也就是說,它們將被LGWR進程同時寫入,并被分配了一個相同的日志序列號
2、重做日志發生故障時數據庫的反應
場景
LGWR進程行為
LGWR成功的寫入了日志組中的一個成員
LGWR將重做記錄信息寫入可用的日志成員,將忽略不可用的日志成員
LGWR無法訪問以一個日志組,因為該日志組必須完成歸檔
數據庫操作將展示停止,知道該日志組可用或該日志組中的日志完成歸檔
由于介質損壞,下一個日志組的中所有成員均無法訪問
數據庫將返回一個錯誤,數據庫實例將被關閉,這時可能需要執行介質恢復,如果數據庫檢查點已經超過該日志文件,則不需要執行介質恢復,只需要刪除損壞日志文件組即可
當前日志文件組中的所有成員突然都不可用
數據庫將返回一個錯誤,數據庫實例將立即被關閉,這時可能需要執行介質恢復。如果介質上包含的文件并沒有丟失,而只是因為其他原因以外被關閉,那么可能不需要介質恢復,在其恢復后進行實例修復即可。
3、合法的和非法的配置重做日志
在大多是情況下,多路復用的重做日志文件都是對稱的:所有的日志文件組擁有相同的成員數量,然后Oracle并沒有硬性的規定所有日志文件組的成員數量必須一致。例如:group 1有兩個成員,group 2僅僅只有一個成員,這樣是合法的,實例對重做日志文件的唯一要求就是必須至少保證其有兩個組。
4、日志成員應被置于不同的磁盤上
這和控制文件有些類似,好處也不用多說,就不進行過多說明了。
5、規劃重做日志文件的大小
同意組中的成員必須擁有相同的文件大小,不同組中的重做日志文件大小不必一致。但是不推薦這樣做,這樣做導致的問題我們都可以估計到,那就是日志切換的時間不統一。總體來說,規劃重做日志文件的尺寸應兼顧性能與效率,同時還要結合數據庫的繁忙程度來考慮。重做日志文件的尺寸最少為4MB。
6、控制歸檔延遲
使用初始化參數archive_lag_target控制歸檔延遲。
三、管理重做日志組及其成員
1、創建日志文件組
方法一:
SQL> alter database add logfile ('/u01/app/oracle/oradata/redo04.log') size 51200k;
Database altered.
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 /u01/app/oracle/oradata/prac/redo03.log
2 /u01/app/oracle/oradata/prac/redo02.log
1 /u01/app/oracle/oradata/prac/redo01.log
4 /u01/app/oracle/oradata/redo04.log
方法二:
SQL> alter database add logfile group 5 ('/u01/app/oracle/oradata/redo05a.log') size 51200k;
Database altered.
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 /u01/app/oracle/oradata/prac/redo03.log
2 /u01/app/oracle/oradata/prac/redo02.log
1 /u01/app/oracle/oradata/prac/redo01.log
4 /u01/app/oracle/oradata/redo04.log
4 /u01/app/oracle/oradata/redo04-b.log
4 /u01/app/oracle/oradata/redo04-c.log
5 /u01/app/oracle/oradata/redo05a.log
7 rows selected.
2、為日志文件組添加成員
方法一:
SQL> alter database add logfile member '/u01/app/oracle/oradata/redo04-b.log' to group 4; ? ? ? //這里就不用指定成員的大小了,因為組內成員大小必須一致。
Database altered.
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 /u01/app/oracle/oradata/prac/redo03.log
2 /u01/app/oracle/oradata/prac/redo02.log
1 /u01/app/oracle/oradata/prac/redo01.log
4 /u01/app/oracle/oradata/redo04.log
4 /u01/app/oracle/oradata/redo04-b.log
方法二:
SQL> alter database add logfile member '/u01/app/oracle/oradata/redo04-c.log' to ('/u01/app/oracle/oradata/redo04.log','/u01/app/oracle/oradata/redo04-b.log');
Database altered.
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 /u01/app/oracle/oradata/prac/redo03.log
2 /u01/app/oracle/oradata/prac/redo02.log
1 /u01/app/oracle/oradata/prac/redo01.log
4 /u01/app/oracle/oradata/redo04.log
4 /u01/app/oracle/oradata/redo04-b.log
4 /u01/app/oracle/oradata/redo04-c.log
3、改變存儲位置和重命名
step 1、關閉數據庫,shutdown immediate
step 2、拷貝文件到新的存儲位置,cp、mv等命令
step 3、啟動數據庫到mount狀態,執行alter database rename file '成員1源路徑','成員2源路徑' to'成員1新路徑','成員2新路徑';step 4、打開數據庫,alter database open;
4、刪除日志文件組及其成員
刪除日志文件組時要考慮如下限制條件:
a、Oracle實例要求一個數據庫中必須至少保留兩組日志文件。
b、只能刪除inactive狀態的日志文件組,如果必須刪除active狀態的組,那么需要先執行日志切換。
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 UNUSED
3 UNUSED
4 UNUSED
SQL> alter database drop logfile group 1;
alter database drop logfile group 1
*
ERROR at line 1:
ORA-01623: log 1 is current log for instance prac (thread 1) - cannot drop
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/prac/redo01.log'
c、確保日志文件組被刪除前已經完成了歸檔。
SQL> alter database drop logfile group 5;
Database altered.
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
3 /u01/app/oracle/oradata/prac/redo03.log
2 /u01/app/oracle/oradata/prac/redo02.log
1 /u01/app/oracle/oradata/prac/redo01.log
4 /u01/app/oracle/oradata/redo04.log
4 /u01/app/oracle/oradata/redo04-b.log
4 /u01/app/oracle/oradata/redo04-c.log
6 rows selected.
5、刪除日志成員
在刪除日志成員時應考慮如下限制條件:
a、無法刪除當前組的成員。
SQL> alter database drop logfile '/u01/app/oracle/oradata/prac/redo01.log';
alter database drop logfile '/u01/app/oracle/oradata/prac/redo01.log'
*
ERROR at line 1:
ORA-01623: log 1 is current log for instance prac (thread 1) - cannot drop
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/prac/redo01.log'
b、當組中僅剩唯一成員時,無法刪除該成員,如確實需刪除,可以直接刪除組。
SQL> alter database drop logfile member '/u01/app/oracle/oradata/redo05a.log';
alter database drop logfile member '/u01/app/oracle/oradata/redo05a.log'
*
ERROR at line 1:
ORA-00361: cannot remove last log member /u01/app/oracle/oradata/redo05a.log for group 5
c、從一個重做日志組中刪除日志成員后,操作系統并不會刪除磁盤文件,在確保重做日志文件刪除成功后,然后使用操作系統命令來刪除掉重做日志文件。
總結
以上是生活随笔為你收集整理的oracle 重做日志内容,Oracle重做日志文件基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【投基方法论】泰达宏利基金张勋:看好依靠
- 下一篇: oracle define (hex