今天數據羣有人反應網站不能正常打開,經檢查Oracle數據庫遠程連不上,提示信息:ORA-00257: archiver error. Connect internal only, until freed。多是archivelog滿了。之前學習SQL只關注CRUD,對日誌瞭解甚少,這次宕機雖然對生成沒有形成惡劣影響,但也是由於業務不熟悉所致,特花一天時間學習並記錄Oracle日誌歸檔功能。.sql
如下內容針對沒有使用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。windows
測試入庫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;
經過切換日誌,查看歸檔路徑下是否有歸檔日誌產生來驗證歸檔路徑設置是否正確,切換日誌命令以下oracle
alter system switch logfile;
方法二和方法三都是修改歸檔文件存儲路徑,具體區別是什麼呢,要想理解具體區別就要先理解歸檔日誌路徑三個參數app
- 一、DB_RECOVERY_FILE_DEST:閃回恢復區路徑
show parameter db_recovery_file_dest;
- 二、LOG_ARCHIVE_DEST:LOG_ARCHIVE_DEST:指定歸檔文件存放的路徑,該路徑只能是本地磁盤,默認爲’’。
show parameter LOG_ARCHIVE_DEST;
- 三、LOG_ARCHIVE_DEST_n:指定歸檔文件存放的路徑,Oracle最多支持把日誌文件歸檔到31個地方,n從1到31。歸檔地址能夠爲本地磁盤,或者網絡設備。
三個參數區別以下ssh
-
- 一、 若是設置了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’;
- 二、 若是設置了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能夠共存。
- 三、 LOG_ARCHIVE_DEST只能與LOG_ARCHIVE_DUPLEX_DEST共存。這樣能夠設置兩個歸檔路徑。LOG_ARCHIVE_DEST設置一個主歸檔路徑,LOG_ARCHIVE_DUPLEX_DEST設置一個從歸檔路徑。全部歸檔路徑必須是本地的。
- 四、 若是LOG_ARCHIVE_DEST_n設置的路徑不正確,那麼Oracle會在設置的上一級目錄歸檔。好比設置LOG_ARCHIVE_DEST_1=’location=C:\archive1’,而OS中並無archive1這個目錄,那麼Oracle會在C盤歸檔。
刪除歸檔文件
- 首先刪除歸檔文件在物理主機磁盤中的文件
- 物理文件刪除後ORACLE的controlfile中仍然記錄着這些archivelog的信息,在oracle的OEM管理器中有可視化的日誌展示出,接下來要作的就是從controlfile中清除掉多餘歸檔日誌文件記錄
利用RMAN進行刪除操做,操做步驟以下:post
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);
徹底正確,至此歸檔文件徹底刪除~!測試