Oracle
數據庫報 ora-00257
錯誤并且執行alter system switch logfile
命令卡死的解決過程
7
月26
日下午,某醫院用戶的 HIS
系統無法連接,報如下錯誤:
初步判斷是歸檔日志問題。
用戶的 HIS
系統數據庫是雙節點 Oracle 11g Rac
集群。登錄服務器之后發現使用 sqlplus
可以登錄系統,但是執行 alter system switch logfile;
命令時系統無反應,出現卡死狀態。
這應該是 Oracle 的日志不能歸檔,導致無法切換日志。用戶反映HIS
客戶斷無法連接數據庫,導致醫院業務停止。
解決過程如下:
步驟1:使用 v$flash_recovery_area_usage
視圖查看歸檔日志的空間利用率。發現達到 99.95%
,如下圖所示:
步驟2:使用 rman
刪除歸檔日志。
命令如下:
rman target /
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';
CROSSCHECK ARCHIVELOG ALL;
DELETE EXPIRED ARCHIVELOG ALL;
執行以上命令后發現 7 天之前的歸檔日志并沒有被刪除。原因是 DELETE ARCHIVELOG
命令只刪除做過備份的歸檔文件。
使用如下命令繼續刪除歸檔文件:
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';
DELETE FORCE ARCHIVELOG UNTIL TIME 'SYSDATE-7'; -- 強制刪除歸檔日志,不管有沒有做過備份
DELETE EXPIRED ARCHIVELOG ALL;
刪除之后查詢 v$flash_recovery_area_usage
視圖信息,發現日志文件數量由 697
個減少為 290
個,但REDO LOG
對應的PERCENT_SPACE_USED
參數的值卻變成了1455.6%(正常值應該為 0-100
)。執行 alter system switch logfile;
命令時系統仍然處于卡死狀態。
查詢發現:當 V$FLASH_RECOVERY_AREA_USAGE
顯示 ARCHIVED LOG
使用率超過 100%
時,說明閃回恢復區空間已耗盡,會導致:
(1)歸檔失敗(出現 ORA-00257 錯誤);
(2)數據庫掛起(DML 操作阻塞);
(3)日志切換卡死(ALTER SYSTEM SWITCH LOGFILE
無響應)。
SQL> select * from v$flash_recovery_area_usage;FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 1455.6 0 290
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
7 rows selected.
步驟3:考慮到業務需要,臨時修改歸檔日志存放的地址,然后再查找原因。
系統配置有 dg
,參數log_archive_dest_1
和 log_archive_dest_2
的配置如下:
log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=hisdb'
log_archive_dest_2='SERVICE=dghisdb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dghisdb'
執行如下操作切換歸檔日志存放的地址:
-- 在兩個節點上分別創建目錄:/u01/app/oracle/gdbak0726
-- 然后執行下面的命令切換歸檔日志的地址
alter system set log_archive_dest_2='location=/u01/app/oracle/gdbak0726' scope=both;
執行上面的命令之后,過了幾分鐘,發現系統恢復正常。用戶反映可以登錄系統了,業務恢復正常。執行alter system switch logfile
命令時也比較順利。
=====================================================================================================
=============== 問題最終解決 =========================================================================
=====================================================================================================
到晚上八點半,醫院下班之后,把歸檔日志的地址恢復為原來的參數。命令如下:
alter system set log_archive_dest_2='SERVICE=dghisdb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dghisdb' scope=both;
執行以上命令之后,發現執行alter system switch logfile
命令時仍然卡死。
查詢發現, v$flash_recovery_area_usage
視圖中 ARCHIVED LOG
對應的參數 PERCENT_SPACE_USED
的值與參數db_recovery_file_dest_size
有關,把參數db_recovery_file_dest_size
的值調大即可。
查看參數db_recovery_file_dest_size
的值:
SQL> show parameter DB_RECOVERY_FILE_DEST_SIZENAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest_size big integer 5G
執行下面的命令把參數db_recovery_file_dest_size
的值修改為 50G:
alter system set db_recovery_file_dest_size=50G scope=both;
然后查詢 v$flash_recovery_area_usage
視圖信息:
SQL> select * from v$flash_recovery_area_usage;FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 145.56 0 290
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
7 rows selected.
再次把參數db_recovery_file_dest_size
的值修改為 100G:
alter system set db_recovery_file_dest_size=100G scope=both;
然后查詢 v$flash_recovery_area_usage
視圖信息,發現ARCHIVED LOG
選項對應的PERCENT_SPACE_USED
參數的值已下降到100
以內。
SQL> select * from v$flash_recovery_area_usage;FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 72.78 72.43 290
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 07 rows selected.
過了幾分鐘,用戶反映業務恢復正常了。說明通過修改參數db_recovery_file_dest_size
的值是可以的解決問題的。