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