今天數據群有人反應網站不能正常打開,經檢查Oracle數據庫遠程連不上,提示信息:ORA-00257: archiver error. Connect internal only, until freed。可能是archivelog滿了。以前學習SQL只關注CRUD,對日志了解甚少,此次宕機雖然對生成沒有造成惡劣影響,但也是因為業務不熟悉所致,特花一天時間學習並記錄Oracle日志歸檔功能。.
以下內容針對沒有使用Oracle ASM磁盤組情況,使用了Oracle ASM磁盤組的情況以后分析。
- Oracle日志操作模式分為兩種:ARCHIVELOG、NOARCHIVELOG
連接Oracle終端
- windows系統:sqlplus
- Linux系統:先登錄ssh,切換到oracle用戶,再啟動sqlplus登錄oracle
查看當前日志操作模式
- 通用方法:SELECT log_mode from v$database;
- sys用戶:
開啟日志歸檔
- 啟用歸檔日志前要先停止數據庫
shutdown immediate;
- 數據庫以mount方式啟動
startup mount;
- 改變日志模式
-
- 啟用數據庫歸檔
alter database archivelog;
-
- 關閉歸檔
alter database noarchivelog;
- 打開數據庫
alter database open;
- 查看歸檔日志信息
archive log list;
- 查看默認閃回歸檔存儲路徑
show parameter db_recovery_file_dest;
Oracle11g版本,ORACLE默認的日志歸檔路徑為閃回恢復區($ORACLE_BASE/fast_recovery_area)。對於這個路徑,Oracle有一個限制,就是默認只有4G的空間,而且不只是歸檔日志的默認路徑,也是備份文件和閃回日志的默認地址,這樣的話歸檔日志鎖使用的空間就達不到4G。
測試入庫100w數據,生成歸檔文件
- 查看閃回空間已經占用情況
select * from V$FLASH_RECOVERY_AREA_USAGE;
- 查看歸檔日志文件數量
select * from v$recovery_file_dest;
當出現ORA-00257: archiver error. Connect internal only, until freed錯誤連不上數據的時候,如果數據庫歸檔目標為USE_DB_RECOVERY_FILE_DEST且DB_RECOVERY_FILE_DEST目錄為默認閃回空間目錄時
- 方法一可采取增大閃回空間大小方式:
alter system set db_recovery_file_dest_size=8G scope=both;
- 方法二修改歸檔日志的路徑
alter system set db_recovery_file_dest='location=C:\app\Administrator\oracle_log' scope=both;
- 方法三修改歸檔日志的路徑,將歸檔日志放到其他不受限制的路徑下來解決這個問題,可通過下面的SQL來修改歸檔日志的存放路徑
alter system set log_archive_dest_1=’location=C:\app\Administrator\oracle_log’;
查看archiv log所在位置
show parameter log_archive_dest;
archive log list;
通過切換日志,查看歸檔路徑下是否有歸檔日志產生來驗證歸檔路徑設置是否正確,切換日志命令如下
alter system switch logfile;
方法二和方法三都是修改歸檔文件存儲路徑,具體區別是什么呢,要想理解具體區別就要先理解歸檔日志路徑三個參數
- 1、DB_RECOVERY_FILE_DEST:閃回恢復區路徑
show parameter db_recovery_file_dest;
- 2、LOG_ARCHIVE_DEST:LOG_ARCHIVE_DEST:指定歸檔文件存放的路徑,該路徑只能是本地磁盤,默認為’’。
show parameter LOG_ARCHIVE_DEST;
- 3、LOG_ARCHIVE_DEST_n:指定歸檔文件存放的路徑,Oracle最多支持把日志文件歸檔到31個地方,n從1到31。歸檔地址可以為本地磁盤,或者網絡設備。
三個參數區別如下
-
- 1、 如果設置了DB_RECOVERY_FILE_DEST,就不能設置LOG_ARCHIVE_DEST,默認的歸檔日志存放於DB_RECOVERY_FILE_DEST指定的閃回恢復區中。可以設置LOG_ARCHIVE_DEST_n,如果這樣,那么歸檔日志不再存放於DB_RECOVERY_FILE_DEST中,而是存放於LOG_ARCHIVE_DEST_n設置的目錄中。如果想要歸檔日志繼續存放在DB_RECOVERY_FILE_DEST中,可以通過如下命令:alter system set log_archive_dest_1=’location=USE_DB_RECOVERY_FILE_DEST’;
- 2、 如果設置了LOG_ARCHIVE_DEST,就不能設置LOG_ARCHIVE_DEST_n和DB_RECOVERY_FILE_DEST。如果設置了LOG_ARCHIVE_DEST_n,就不能設置LOG_ARCHIVE_DEST。也就是說,LOG_ARCHIVE_DEST參數和DB_RECOVERY_FILE_DEST、LOG_ARCHIVE_DEST_n都不共存。而DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST_n可以共存。
- 3、 LOG_ARCHIVE_DEST只能與LOG_ARCHIVE_DUPLEX_DEST共存。這樣可以設置兩個歸檔路徑。LOG_ARCHIVE_DEST設置一個主歸檔路徑,LOG_ARCHIVE_DUPLEX_DEST設置一個從歸檔路徑。所有歸檔路徑必須是本地的。
- 4、 如果LOG_ARCHIVE_DEST_n設置的路徑不正確,那么Oracle會在設置的上一級目錄歸檔。比如設置LOG_ARCHIVE_DEST_1=’location=C:\archive1’,而OS中並沒有archive1這個目錄,那么Oracle會在C盤歸檔。
刪除歸檔文件
- 首先刪除歸檔文件在物理主機磁盤中的文件
- 物理文件刪除后ORACLE的controlfile中仍然記錄着這些archivelog的信息,在oracle的OEM管理器中有可視化的日志展現出,接下來要做的就是從controlfile中清除掉多余歸檔日志文件記錄
利用RMAN進行刪除操作,操作步驟如下:
window客戶端系統為例
- 打開Rman連接數據庫
- 查看歸檔日志的狀態
list archivelog all;
- 執行archivelog校驗命令
crosscheck archivelog all;
- 刪除校驗失敗的記錄
delete expired archivelog all;
- 選擇yes
- 查看歸檔日志
List archivelog all;
- 查看歸檔日志文件
select substr(t.NAME,1) NAME,ROUND(sum(t.BLOCKS*t.BLOCK_SIZE)/1024/1024) TOTAL_MB from v$archived_log t where t.DELETED='NO' group by substr(t.NAME,1);
完全正確,至此歸檔文件完全刪除~!