一、常用日志查詢語句
select * from v$flash_recovery_area_usage; --查看空間占用率,如果 ARCHIVED LOG 超過90%,Oracle隨時有宕機的危險
select * from v$recovery_file_dest; --查看歸檔日志大小及使用情況
select group#, bytes, status from v$log; --查看現有日志
select sequence#,first_time from v$loghist;--列出所有歸檔redo日志文件的順序和產生的時間
select * from v$archived_log; --查看v$archive_log
select count(*) from v$archived_log where archived='YES' and deleted='NO'; --查看所有歸檔,未刪除的歸檔日志
二、歸檔日志管理
Oracle日志分類
分三大類: Alert log files--警報日志,Trace files--跟蹤日志(用戶和進程)和 redo log 重做日志(記錄數據庫的更改)。
重做日志分為在線重做日志和歸檔重做日志。
online Redo log files--在線重做日志,又稱聯機重做日志,指Oracle以SQL腳本的形式實時記錄數據庫的數據更新,換句話說,實時保存已執行的SQL腳本到在線日志文件中(按特定的格式)。
Archive Redo log files--歸檔重做日志,簡稱歸檔日志,指當條件滿足時,Oracle將在線重做日志以文件形式保存到硬盤(持久化)。
重做日志的簡單原理:在數據更新操作commit前,將更改的SQL腳本寫入重做日志。主要用於數據庫的增量備份和增量恢復。
重做日志直接對應於硬盤的重做日志文件(有在線和歸檔二種),重做日志文件以組(Group)的形式組織,一個重做日志組包含一個或者多個日志文件。
關於在線重做日志(online redo log)
在線重做日志的原理:
對於在線重做日志,Oracle 11g默認對於每個數據庫實例,建立3個在線日志組,每組一個日志文件,文件名稱為REDO01.LOG,REDO02.LOG和REDO03.LOG。(用戶可以通過視圖操作添加/修改/刪除日志組和日志文件來自定義在線重做日志)
每組內的日志文件的內容完全相同,且保存在不同的位置,用於磁盤日志鏡像,以做多次備份提高安全性。默認情況這3組通常只有一組處於活動狀態,不斷地同步寫入已操作的腳本,當日志文件寫滿時(達到指定的空間配額),如果當前數據庫處於歸檔模式,則將在線日志歸檔到硬盤,成為歸檔日志;若當前數據庫處於非歸檔模式,則不進行歸檔操作,而當前在線日志的內容會被下一次重新寫入覆蓋而無法保存。因此,通常數據庫在運行時,是處於歸檔模式下的,以保存數據更新的日志。
當前歸檔日志組寫滿后,Oracle會切換到下一日志組,繼續寫入,就這樣循環切換;當處於歸檔模式下,切換至原已寫滿的日志組,若該日志組歸檔完畢則覆蓋寫入,若沒有則只能使用日志緩沖區,等待歸檔完畢之后才能覆蓋寫入。當然,處於非歸檔模式下是直接覆蓋寫入的。(關於數據庫歸檔模式的設置,我會在另外的博文中講到)。
Oracle提供了2個視圖用於維護在線重做日志:V$LOG 和 V$LOGFILE,我們可以通過這兩個視圖查看和修改在線日志。
關於V$LOG視圖的詳細屬性字段可Oracle 11g的官方文檔:http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/dynviews_2029.htm
關於V$LOGFILE視圖的詳細屬性字段可Oracle 11g的官方文檔:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/dynviews_2031.htm
還可以通過ALTER DATABASE ADD 、delete等命令增加/修改/刪除在線日志或日志組,具體操作可查看http://blog.csdn.net/robinson_0612/archive/2010/07/20/5749556.aspx
關於歸檔重做日志(Archive redo log)
其實,所謂的歸檔,就是指將在線日志進行歸檔、持久化到成固定的文件到硬盤,便於以后的恢復和查詢。 當然,前提條件是數據庫要處於歸檔模式。
Oracle 11g 默認是為歸檔日志設定2個歸檔位置,這2個歸檔位置的的歸檔日志的內容完全一致,但文件名不同。
Oracle數據庫開歸檔之后,oracle 系統默認的歸檔空間為2G,由於日志過多,空間寫滿,數據庫的redo文件不能歸檔,而出現oracle數據庫掛起的問題。oem打開oracle 10g 數據庫操作界面,會顯示如下錯誤信息: 由於輸出設備已滿或不可用, 歸檔程序無法歸檔重做日志。 數據庫無法使用
現將解決辦法稍作總結:
1、添加新的日志文件
--查看歸檔日志組和路徑信息
SQL>select group#, member from v$logfile;
--添加日志文件
SQL>alter database add logfile group 5'/usr/local/oracle/oradata/greedb/redo05.log' size 2048M;
-- 查看添加后的組狀態:
SQL> select group#, bytes, status from v$log;
SQL> select group#, member from v$logfile;
2、增大歸檔日志空間
查看db_recovery
SQL> show parameter db_recovery NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string G:\Oracle\product\10.2.0\flash _recovery_area db_recovery_file_dest_size big integer 2G
通過以下方法調整系統的回閃恢復區大小:
- 首先是關閉數據庫:以SYS身份鏈接到oracle,執行shutdown immediate;
- 啟動數據庫到mount狀態:startup mount
- 查看回閃恢復區的大小和存放目標:show parameter db_recovery_file_dest
- 修改回閃恢復區的大小alter system set db_recovery_file_dest_size = 4G(缺省是2G,可以根據實際情況調整大小)
- 最后打開數據庫: alter database open;
OK , 問題解決。數據庫恢復使用。
3、清空Oracle日志信息
在controlfile中記錄着每一個archivelog的相關信息,如果只刪除OS級別的歸檔日志,controlfile中仍然記錄着這些archivelog的信息,在oracle的OEM管理器中扔有可視化的日志出現,也就是oracle並不知道這些文件已經不存在了。需使用以下方法,徹底刪除:
1、連接 RMAN管理
rman target / 或者 RMAN target sys/sysadmin@orcl
2、查看歸檔日志列表
查看歸檔日志列表:list archivelog all;
查看失效的歸檔日志列表:list expired archivelog all;
3、刪除歸檔日志
--檢查控制文件和實際物理文件的差別
RMAN> crosscheck archivelog all;
--刪除當前時間之間的所有歸檔日志 RMAN>delete archivelog all completed before 'sysdate';
--刪除從7天前到現在的全部日志,慎用!!!
RMAN> delete archivelog from time 'sysdate-7';
--以上操作仍然會在RMAN里留下未管理的歸檔文件,可使用以下命令刪除
delete expired archivelog all;
4、退出RMAN
RMAN> exit
其他RMAN操作
show all --查看所有的rman策略.
如何確認歸檔日志是否過期,rman有一個保留策略,可以定義多少天之前的日志算為過期;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
--以下步驟可不做
5、清空v$archived_log
SQL> execute sys.dbms_backup_restore.resetCfileSection(11);
6、查看v$archive_log
SQL>select * from v$archived_log;
7、生成新的日志文件
SQL>alter system switch logfile;
三、其他說明
當一組聯機重做日志寫滿時,LGWR進程將開始寫下一組日志文件。這被稱為日志切換。此時,會產生檢查(校驗)點操作,還有一些信息被寫到控制文件中。除了在重做日志自動切換和自動產生的檢查點之外,Oracle數據庫dba還可能根據管理和維護的需要,在任何時候強制性的進行重做日志切換,也可以強制性的產生校驗點。
強制性產生重做日志文件切換的命令為:
alter system switch logfile 強制性產生校驗點,不一定就歸檔當前的重做日志文件,(若自動歸檔打開,就歸檔前的重做日志,若自動歸檔沒有打開,就不歸檔當前重做日志。)
alter system checkpoint
alter system archive log current 是歸檔當前的重做日志文件,不管自動歸檔有沒有打都歸檔。
主要的區別在於:
ALTER SYSTEM SWITCH LOGFILE對單實例數據庫或RAC中的當前實例執行日志切換;
而ALTER SYSTEM ARCHIVE LOG CURRENT會對數據庫中的所有實例執行日志切換。
為什么執行熱備后要執行alter system archive log current 這個語句,看到很多腳本都是這樣寫的。是不是必須的?
一般的RMAN腳本都是這樣寫的,因為RMAN是可以備份歸檔日志的。
alter system archive log current 這樣后就可以將所有的歸檔都備份出來了。這樣做是為了保證數據的完整和一致。