在ORACLE10g和11g版本,ORACLE預設的日志歸檔路徑為閃回恢複區($ORACLE_BASE/flash_recovery_area)。對于這個路徑,ORACLE有一個限制,就是預設隻有2G的空間,而且 不隻是歸檔日志 的預設路徑,也是 備份檔案 和 閃回日志 的預設位址,這樣的話歸檔日志鎖使用的空間就達不到2G,在沒有設定好這個路徑大小的情況下,很多系統都遇到過歸檔日志滿而無法歸檔導緻資料庫夯住的問題,可以使用下面的SQL語句去檢視歸檔資訊。
一.在資料庫開啟的情況下
檢測是否已開啟歸檔
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 19
Current log sequence 20
SQL>select log_mode from v$database;
如果為ARCHIVELOG則表示已成功歸檔
檢視,Disabled表示未開啟歸檔
二. 開啟歸檔模式
2.1 重新啟動挂起狀态
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
--如果安裝多個庫,會報錯,找不到句柄
--exit 再用管理者進入
Total System Global Area 1258291200 bytes
Fixed Size 1219160 bytes
Variable Size 318768552 bytes
Database Buffers 922746880 bytes
Redo Buffers 15556608 bytes
Database mounted.
行至此步,真正的問題才出現。mount了無數次始終startup不上,說是監聽程式無法監聽到你目前的例程了。當然,如果監聽程式配置得當,此類問題是不會在這裡出現的。既然是監聽程式出現問題,那麼就從這裡入手進行解決。在oracle資料庫的安裝目錄下(路徑可能如:oracle\product\10.2.0\db_1\NETWORK\ADMIN)可以找到listener.ora這種參數檔案,
2.2 修改啟動歸檔模式
SQL> alter database archivelog;
Database altered.
--打開資料庫
SQL> alter database open;
--檢視是否開啟
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 15
Next log sequence to archive 17
Current log sequence 17
2.3 修改歸檔日志目錄及大小
檢視參數db_recovery_file_dest,存檔終點USE_DB_RECOVERY_FILE_DEST預設就是閃回恢複區($ORACLE_BASE/flash_recovery_area),可以通過下面的SQL檢視閃回恢複區的資訊。
SQL> show parameter db_recover
NAME TYPE VALUE
-------------------------- ----------- ----------------------------
db_recovery_file_dest string oracle\flash_recovery_area
db_recovery_file_dest_size big integer 2G
預設情況下,歸檔日志會存放到 閃回恢複區(oracle\flash_recovery_area)内,如果閃回恢複區已經使用到2G,歸檔日志就有可能無法繼續歸檔,資料庫夯住,通常的解決方法是增大閃回恢複區,可以用以下SQL實作。
Oracle 裡面有個叫做spfile的東西,就是動态參數檔案,裡面設定了Oracle 的各種參數。所謂的動态,就是說你可以在不關閉資料庫的情況下,更改資料庫參數,記錄在spfile裡面。
文法:alter system set 參數=值 scope=spfile;
注意:ALTER SYSTEM 中 SCOPE=SPFILE/MEMORY/BOTH 的差別:
SCOPE = SPFILE : 此更改寫入初始化參數檔案,更改将在下次啟動時生效。動态參數與靜态參數都一樣可以。也是靜态參數唯一可以使用的方式。
SCOPE = MEMORY : 隻在記憶體上修改,立即生效,但重新開機後将不再生效,因為并沒有寫入到初始化參數檔案。隻适用于動态參數,靜态參數則不允許
SCOPE = BOTH : 預設選項,既寫入到初始化參數檔案,也在記憶體上修改,立即生效。同樣也隻适用于動态參數,靜态參數則不允許
SQL> alter system set db_recovery_file_dest_size=3G;
系統已更改。
即使用這種方法解決的目前燃眉之急,雖然閃回恢複區ORACLE會自動管理,如果閃回恢複區空間不足就會清理掉沒用的資料,但是如果備份政策不是很完善,資料庫非常繁忙的情況下,還有可能遇到這種情況,通常需要修改歸檔日志的路徑,将歸檔日志放到其他不受限制的路徑下來解決這個問題,可通過下面的SQL來修改歸檔日志的存放路徑。
SQL> alter system set log_archive_dest_1='location=oracle\log1\archive_log';
Database log mode Archive Mode
Automatic archival Enabled
Archive destination oracle\log1\archive_log
Oldest online log sequence 30
Next log sequence to archive 32
Current log sequence 32
實際上從Oracle 10g開始,可以生成多份一樣的日志,儲存多個位置,以防不測,方法如下:
SQL>alter system set log_archive_dest_2='location=oracle\log2\archive_log';
Archive destination oracle\log1\archive_log
Oldest online log sequence 30
Next log sequence to archive 32
Current log sequence 32
2.4 修改日志檔案命名格式:
//設定歸檔程序數
SQL> alter system set log_archive_max_processes = 5;
歸檔日志的名字受log_archive_format參數限制,可以通過下面的指令檢視。
SQL> show parameter log_archive_format
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_format string %t_%s_%r.dbf
SQL> alter system set log_archive_format = "archive_%t_%s_%r.log" scope=spfile;
2.5歸檔目前重做日志
重做歸檔
alter system archive log current;
檢視歸檔日志
select name from v$archived_log;
SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
/oracle/archivelog1/archive_log1_5_927044427.dbf
注:
<
alter system switch logfile 是強制日志切換,不一定就歸檔目前的重做日志檔案(若自動歸檔打開,就歸檔前的重做日志,若自動歸檔沒有打開,就不歸檔目前重做日志。)
alter system archive log current 是歸檔目前的重做日志檔案,不管自動歸檔有沒有打都歸檔。
主要的差別在于:
alter system switch logfile 對單執行個體資料庫或RAC中的目前執行個體執行日志切換;
alter system archive log current 會對資料庫中的所有執行個體執行日志切換。
>
2.6重新開機資料庫
shutdown immediate;
startup
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /opt/app/oracle/archivelog2/archive_log
Oldest online log sequence 9
Next log sequence to archive 11
Current log sequence 11
已開啟歸檔
三.修改為非歸檔模式
3.1以 mount狀态啟動資料庫
SQL> shutdown immediate
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 973080688 bytes
Database Buffers 620756992 bytes
Redo Buffers 7360512 bytes
3.2 歸檔目前重做日志
alter system archive log current;
3.3 以 mount狀态啟動資料庫
3.4 更改歸檔模式為非歸檔模式
SQL> alter database noarchivelog;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /oracle/archivelog2/archive_log
Oldest online log sequence 9
Current log sequence 11
四. 歸檔日志檢查
4.1 首先看archiv log所在位置
很有可能,歸檔日志存放位置不在 閃回恢複區
SQL> show parameter log_archive_dest;
會看到類似下面的結果
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string
log_archive_dest_10 string
這時候如果value是空的,可以嘗試
如果已開啟歸檔,則在Value列,可以看到日志路徑,不過可能有多個日志副本,請注意
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string location=/oracle/archivelog1/archive_log
log_archive_dest_2 string location=/oracle/archivelog2/archive_log
4.2 使用情況
-----這裡可以看到閃回恢複區裡的空間使用情況:
SQL> select * From v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE .13 0 1
ONLINELOG 2.93 0 3
ARCHIVELOG 99.72 0 122
BACKUPPIECE 0 0 0
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0
這裡隻是個案例,假如快滿了,使用了超過99%的日志空間
------注意這一步才是真正檢視歸檔空間的實際使用情況
--本人沒有測試過,後續再驗證,參考原文中是這麼說的
SQL> select * from v$recovery_file_dest;
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------- ---------- ----------------- ---- --------------- -------------------
/oracle/flash_recovery_area 2147483648 1804771840 0 51
五. 已滿處理
archive log空間滿可能會導緻不能遠端登入,是以ssh到伺服器後,使用sqlplus sys/pass as sysdba登陸oracle。
這裡使用ORACLE自帶的備份恢複工具RMAN
5.1 設定環境變量 ORACLE_SID
使用RMAN連接配接本地資料庫之前必須首先設定作業系統環境變量:ORACLE_SID,并指定該值等于目标資料庫的執行個體名。如果本地庫隻有一個執行個體并已經設定了ORACLE_SID環境變量,則不需要再指定ORACLE_SID。RMAN會自動連接配接到預設執行個體。
SET ORACLE_SID =jssbook
5.2 啟動RMAN連接配接資料庫
如果連接配接本地資料庫,則使用
RMAN TARGET /
登入管理者賬戶
如果遠端連接配接,則使用RMAN TARGET SYS/CHANGE_ON_INSTALL@TESTDB,例如:RMAN TARGET SYS/sysadmin@orcl
必須在建立連接配接時指定一個有效的網絡服務名(Net Service Name),本地的tnsname.ora檔案中必須已經建立了該網絡服務名的正确配置
5.3 檢視歸檔日志狀态
$ rman target /
Recovery Manager: Release 11.2.0.1.0 - Production on Mon Nov 7 17:26:27 2016
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected to target database: jssbook(DBID=1314906249)
RMAN> list archivelog all;
using target database control file instead of recovery catalog
List of Archived Log Copies for database with db_unique_name WETALK
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
1 1 5 A 04-NOV-16
Name: /oracle/archivelog1/archive_log1_5_927044427.dbf
2 1 5 A 04-NOV-16
Name: /oracle/archivelog2/archive_log1_5_927044427.dbf
5.3 手動删除歸檔日志
方法一:
先删除實體的歸檔日志,然後執行下列指令
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
說明:
SYSDATA-7,表明目前的系統時間7天前,before關鍵字表示在7天前的歸檔日志,如果使用了閃回功能,也會删除閃回的資料。
同樣道理,也可以删除從7天前到現在的全部日志,不過這個指令要考慮清楚,做完這個删除,最好馬上進行全備份資料庫
DELETE ARCHIVELOG from TIME 'SYSDATE-7'; 删除從7天前到現在的全部日志,慎用
方法二:
UNIX/LINUX下也可以通過FIND找到7天前的歸檔資料,使用EXEC子操作删除
find /oracle/oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;
或
find /mnt/oradb/archivelog -type f -mtime +1 -exec rm {} \;
這樣做仍然會在RMAN裡留下未管理的歸檔檔案
仍需要在RMAN裡執行下面2條指令
crosscheck archivelog all;
delete expired archivelog all;
最後再輸入一次crosscheck archivelog all;就行了
【參考原文】http://blog.itpub.net/26508908/viewspace-1663566/
【參考原文】http://www.linuxidc.com/Linux/2014-02/96188.htm
【參考原文】http://blog.itpub.net/14293828/viewspace-1425794/
本文轉自xiaocao1314051CTO部落格,原文連結:http://blog.51cto.com/xiaocao13140/1936877 ,如需轉載請自行聯系原作者