重做日志文件(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
