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