重做日誌文件(redo log file)

 目錄
       重做日誌文件相關。
       重做日誌文件簡介。
       查詢重做日誌文件的信息。
       日誌切換。
       管理日誌文件組
       增刪日誌文件組。
       增刪日誌文件成員。
       歸檔與非歸檔模式。




一.重做日誌文件相關。
    
    Oracle引入重做日誌的目的:數據庫的恢復。
    Oracle相關進程:重做日誌寫進程(LGWR)。
    重做日誌性質:聯機日誌文件,oracle服務器運行時需要管理它們。
    相關數據字典:v$log ; v$logfile。
    操作者權限:具有sys用戶或system用戶權限。

1.1重做日誌文件的規劃。
(於網絡上收集)
聯機日誌文件的規劃原則如下:
1:分散放開,多路複用。一般會將同一組的不同日誌成員文件放到不同的磁盤或不同的裸設備上。以提高安全性。
2:把重做日誌放在速度最快的硬盤上(即:日誌所在的磁盤應當具有較高的I/O),一般會將日誌文件放在裸設備上。
3:把重做日誌文件設爲合理大小:例如,增大日誌文件大小可以加快一些大型的INSERT、UPDATE、DELETE操作,也能降低日誌文件切換頻率。減少一些日誌等待事件。一般根據具體業務情況有所不同。一般日誌組大小應滿足自動切換間隔至少15-20分鐘左右業務需求
4:ORACLE推薦,同一個重做日值組下的所有重做日誌文件大小、成員個數一致.


二.重做日誌文件簡介。
      2.1重做日誌
      重做日誌文件又叫聯機日誌文件,記錄了對數據庫修改的信息,包括用戶對數據修改和數據庫管理員對數據庫結構的修改。

      2.2重做日誌的作用。
      它主要用於在oracle發生故障的時候和數據庫備份文件配合恢復數據庫。
      一般來說,數據庫故障丟失數據,有兩種情況。
      一是,因爲停電或死機,髒塊未寫入磁盤,造成該數據丟失。
      二是,磁盤損壞,數據全完蛋。
       對應第一種情況,oracle會使用實例恢復,使用重做日誌自動恢復數據,不需要用戶干預。沒錯,實例恢復,它是自動的。
       對應第二種情況,便需要DBA使用備份,重做日誌,歸檔日誌來恢復數據了。下面有講恢復的步驟。
       
       2.3重做日誌文件的組織概念。

        重做日誌是以組爲單位管理。每個數據庫至少有兩個日誌文件組,每組至少包含1個或者多個日誌文件成員,且日誌文件成員的內容大小一致。(多個成員,內容一致的原因是,在日誌文件損壞時,能及時提高備份恢復。)

----------------------------------------------------------------------------------------------------------------------------
注意!   組裏的日誌文件分別存儲在不同的分區上, 若有一個日誌文件出現問題時,並不會影響其他分區的日誌文件。
             oracle只對可用的日誌文件寫入數據,並將出問題的成員標記爲invalid,同時把錯誤信息記錄到控制文件和警告文件去。
             這樣對數據庫的運行沒有影響。        
----------------------------------------------------------------------------------------------------------------------------

      
        聯機重做日誌文件是循環使用的(見下圖)。當第一個日誌文件達到一定數量時,就會停止寫入,而轉向第二個日誌文件,第二個滿轉向第三個日誌文件.第三個滿就向第一個日誌文件寫入。
       而第一個日誌文件有沒有自動備份就涉及到歸檔或者不歸檔的問題.當數據庫自動對原來的日誌文件進行備份的話就叫歸檔模式,不需要對數據庫進行自動備份就叫非歸檔模式。



----------------------------------------------------------------------------------------------------------------------------
注意!   負責把日誌信息寫入日誌文件的進程,是LGWR    (日誌寫進程)。每次對數據的DML操作,都會生成日誌信息,
             存儲在log buffer(日誌緩存區) 裏,再由一些情況觸發LGWR進程把日誌信息寫入redo logfile。     
----------------------------------------------------------------------------------------------------------------------------

什麼情況會觸發LGWR    寫日誌呢?

◆ 當發出commit命令的時候
◆ 當log buffer的空間寫滿到1/3的時候或者當log buffer的空間寫滿1MB的記錄的時候
◆ 當每3秒鐘超時的時候    (週期性)
◆ 當DBWn需要寫入數據文件的操作之前的時候  (DBWn,負責把內存區中的數據寫入數據文件的進程。重要的一個進程)
◆ 當切換日誌文件的時候    


三.查詢重做日誌文件的信息。      

        相關數據字典:v$log ; v$logfile。

3.1 v$log     記錄數據庫中有多少個重做日誌組,每個組中有多少個成員、日誌大小及狀態。    

SQL> desc v$log
 Name                                  
 ----------------------------
 GROUP#                                   --日誌文件組號#        
 THREAD#                                  
 SEQUENCE#                              --序號       
 BYTES                                        --大小      
 BLOCKSIZE                                       
 MEMBERS                                  --組成員數量          
 ARCHIVED                                           
 STATUS                                     --狀態        
 FIRST_CHANGE#                                     
 FIRST_TIME                                         
 NEXT_CHANGE#                                     
 NEXT_TIME   

SQL> select group#,sequence#,bytes/1024/1024 sizeMB,members,status from v$log;

    GROUP#  SEQUENCE#     SIZEMB    MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
         1         28         50          1 INACTIVE
         2         29         50          1 CURRENT
         3         27         50          1 INACTIVE


status     -----狀態表示的含義。

         inactive:表示實例恢復已不再需要這組聯機重做日誌組了。
         active:表示該組是活動的但不是當前組,實例恢復時需要這組日誌。
         current:表示該組日誌是當前組,該聯機重做日誌組是活動的。
         unused:表示該日誌組從未寫過,是重做日誌剛剛添加到狀態。




3.2  v$logfile    如名,記錄着每個日誌組成員的屬性。路徑,文件名,狀態等。

SQL> desc v$logfile
 Name                                      
 ------------------------
 GROUP#                                 ----文件組      
 STATUS                                   ----狀態                      (與v$log不同)          
 TYPE                                        ---類型       
 MEMBER                                  ---成員數量           
 IS_RECOVERY_DEST_FILE                          

 
SQL> select group#,status,type,member from v$logfile;

    GROUP# STATUS  TYPE    MEMBER
---------- ------- ------- ---------------------------------------------
         3         ONLINE  /home/app/oracle/oradata/orcl/redo03.log
         2         ONLINE  /home/app/oracle/oradata/orcl/redo02.log
         1         ONLINE  /home/app/oracle/oradata/orcl/redo01.log

status     -----狀態表示的含義。

       空白:表示該文正在使用。
       stale:表示該文件中的內容是不完全的。
        invalid:表示該文件是不可以被訪問的。
       deleted:表示該文件已不再有用了。


四。日誌切換。

上面提到重做日誌是循環使用的,當一組聯機重做日誌文件被寫滿時,LGWR將開始寫下一組日誌文件,這被稱爲日誌切換。
你也可以任何時候,手動日誌切換。

強制重做日誌切換命令: alter system switch logfile;  

------------
實驗!
------------
1.當前的日誌組是3。
SQL> select group#,sequence#,bytes/1024/1024 MB,members,status,first_change# from v$log;
    GROUP#  SEQUENCE#         MB    MEMBERS STATUS           FIRST_CHANGE#
---------- ---------- ---------- ---------- ---------------- -------------
         1         28         50          1 INACTIVE               1164439
         2         29         50          1 INACTIVE               1188272
         3         30         50          1 CURRENT                1192137




2.alter system switch logfile 日誌切換後、(注意!日誌切換,SCN(system change number)會發生改變。)
SQL> select group#,sequence#,bytes/1024/1024 MB,members,status,first_change# from v$log;
    GROUP#  SEQUENCE#         MB    MEMBERS STATUS           FIRST_CHANGE#
---------- ---------- ---------- ---------- ---------------- -------------
         1         31         50          1 CURRENT                1193775
         2         29         50          1 INACTIVE               1188272
         3         30         50          1 ACTIVE                 1192137




五。管理日誌文件組。

5.1增加和刪除日誌組。

5.1.1增加一個日誌組。

新添加一個日誌組的語句:
    alter database add logfile group {組編號}      --不加group 參數,會默認依序編號. 
    ('路徑01.log','路徑02.log','路徑03.log')
    size 大小
 
下面是一個實例:
SQL> alter database add logfile group 4
  2  ('/oracle1/redo4_01.log','/oracle1/redo4_02.log')
  3  size 10m
  4  /
----添加了日誌組4,有兩個個成員,大小統一10m。

5.1.2刪除一個日誌組。

刪除日誌組的語句:
alter database drop logfile group [組號];

下面是一個實例:
SQL> alter database drop logfile group 4;
Database altered.

----------------------------------------------------------------------------------------------------------------------------
注意!   1.日誌組被刪除時,並同時刪除日誌文件,要手動在操作系統上刪除。不然,只會留下一堆垃圾文件佔用磁盤。
             2.CURRENT  狀態的日誌組不能被刪除,必須手動切換當前日誌組才能刪除。
             3.確保你的oracle上至少擁有兩組以上的日誌組。
             4.生產環境中,刪除日誌組時,確保你的日誌組先歸檔。
----------------------------------------------------------------------------------------------------------------------------


5.2增加和刪除和移動日誌成員。

5.2.1增加一個日誌成員。

語句:
alter database 
add logfile member '路徑.log'
to group {組號}


下面一個實列:
SQL> alter database
  2  add logfile member '/oracle1/redo4_o3.log'
  3  to group 3
  4  /

---給日誌組3,添加了一個日誌成員。不需要指定size,oracle會根據其他成員大小默認。


5.2.2刪除一個日誌成員。
語句:
alter database
drop logfile member '路徑,log';

下面一個實例:
SQL> alter database
  2  drop logfile member '/oracle1/redo4_o3.log'
  3  /
Database altered.

-----刪除了一個成員,但其日誌文件並未被刪除,如下所示。要在操作系統內手動刪除。
SQL> ! ls /oracle1
control01.ctl  redo4_o3.log  test01.dbf

SQL> ! rm -r /oracle1/redo4_o3.log



注意!
刪除日誌成員時要注意以下幾點!
1.日誌成員處於current狀態不能被刪除。
2.刪除時,要保證日誌組至少擁有一個成員。
3.因故障需要刪除成員後,需要立刻補加成員,以保證鏡像關係。
4.刪除成員時,其日誌文件並未被刪除,要在操作系統上手動刪除。


5.3移動重做日誌文件。

1.關閉數據庫,重啓mount模式。
SQL> shutdown immediate
SQL> startup mount

2.移動重做日誌文件到所需位置。
SQL> ! mv /home/app/oracle/oradata/orcl/redo02.log /oracle1

3.重命名日誌文件。
SQL> alter database rename file
  2  '/home/app/oracle/oradata/orcl/redo02.log'
  3  to
  4  '/oracle1/redo02.log'
  5  /
Database altered.

4.啓動數據庫。


六.歸檔與不歸檔模式。

當數據庫自動對原來的日誌文件進行壓縮備份的話就叫歸檔模式。
沒有對數據庫日誌文件進行自動壓縮備份就叫非歸檔模式。

不歸檔模式                                歸檔模式
只能冷備份。(關閉數據庫才能備份)                                           可以熱備份,增量備份,部分恢復。
恢復可能不盡全。                                                                        可以做完全恢復而且可以將數據庫恢復到特定的點。


6.1.查詢當前數據庫是否歸檔模式
6.1.1   archive log list 顯示數據庫是否歸檔模式和聯機重做文件組的信息。----權限SYSDBA

SQL> archive log list
Database log mode              No Archive Mode                 ------不歸檔模式。
Automatic archival             Disabled                                 -------自動存檔             禁用
Archive destination            USE_DB_RECOVERY_FILE_DEST       --存檔終點            
Oldest online log sequence     30                                          ----最早聯機日誌序號
Current log sequence           32                                             ----當前日誌序號

6.1.2 v$database    ----system權限可以查詢,其log_mode列記錄了數據庫是否處於歸檔模式。

SQL> select name,log_mode from v$database;

NAME      LOG_MODE
--------- ------------
ORCL      NOARCHIVELOG

6.2 查詢歸檔日誌文件的信息。
6.2.1 v$log_history    記錄已歸檔日誌文件的序列號,SCN等信息。

SQL> desc v$log_history
 Name                                    
 -------------------------------
 RECID                                              
 STAMP                                           
 THREAD#                                           
 SEQUENCE#                                       
 FIRST_CHANGE#                                     
 FIRST_TIME                                       
 NEXT_CHANGE#                                    
 RESETLOGS_CHANGE#                       
 RESETLOGS_TIME         

6.2.2 v$archived_log 同是記錄歸檔日誌文件的信息,更詳細。

自行desc,熟悉一下,如何?

6.2.3 歸檔日誌存放的目錄。---(db_recovery_file_dest 參數記錄着歸檔日誌的路徑)
----如何更改歸檔日誌存放的路徑?----詳見6.4
SQL> show parameter db_recovery_file_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /home/app/oracle/flash_recover
                                                 y_area


6.3切換歸檔模式

由6.1.1知道,我的oracle並沒有開啓歸檔模式,現在手動開啓歸檔模式。

1.關閉數據庫。
SQL> shutdown immediate

2.重啓mount模式。(不加載數據文件,只加載控制,日誌文件模式。)
SQL> startup mount

3.查看數據庫當前模式。
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     30
Current log sequence           32

4.設置數據庫爲歸檔模式。
SQL> alter database archivelog;

5.加載數據文件。
SQL> alter database open;

6.查看日誌歸檔模式。
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     30
Next log sequence to archive   32
Current log sequence           32
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章