はじめに
開発環境でテーブルの数百万件データの更新・削除処理をかけたところ、DBサーバが停止し再起動できない状況に陥った。
原因究明と解決方法を備忘としてまとめておく。
OSはWindows Server2019、DBはOracle Database 19cを前提として記載する。
ログを見る
DBサーバの障害発生時はalertログを見る。
alertログのディレクトリはデフォルトでは以下の通り。
$ORACLE_BASE/diag/rdbms/<SID>/<SID>/trace/alert_<SID>.log
動的パフォーマンスビューのV$DIAG_INFOをSELECT文で確認が可能。
SELECT NAME, VALUE FROM V$DIAG_INFO;
alert_.logには以下のエラーが出力されていた。
ORA-19809: リカバリ・ファイルの制限を超えています
ORA-19804: XXXバイトのディスク領域をXXXバイト制限から再利用できません
ORA-19809は高速リカバリ領域が不足したため発生したエラー。
高速リカバリ領域とはバックアップファイル、アーカイブログファイルなどのリカバリ関連のファイルの出力先となるディスク領域である。
高速リカバリ領域に出力されたファイルはOracle Databaseによって管理され、
初期化パラメータDB_RECOVERY_FILE_DEST_SIZEに設定されたサイズを超えないように制御される。
今回発生したエラーは、出力ファイルサイズがDB_RECOVERY_FILE_DEST_SIZEで指定したサイズを超えたため発生した。
復旧方法
DBサーバの復旧のため、高速リカバリ領域に出力されたファイルを削除する。
OSコマンドでファイル削除を行うと、Oracle Databaseが高速リカバリ領域の空きを認識しないため注意が必要。
DBサーバ上でRMANコマンドう実行しファイルを削除する。高速リカバリ領域の空きをOracle Databaseに認識させる。
コマンドプロンプトからRMANを起動
RMAN TARGET /
マウントモードでの起動
DBを起動できない状態のため、MOUNT状態にする。
RMAN> STARTUP MOUNT;
アーカイブファイルと実際に存在しているアーカイブファイルの整合性チェック
RMAN> CROSSCHECK ARCHIVELOG ALL;
アーカイブログファイルの確認
RMAN> LIST ARCHIVELOG ALL;
アーカイブログファイルの削除
RMAN> DELETE ARCHIVELOG ALL;
削除後のアーカイブログの確認
RMAN> LIST ARCHIVELOG ALL;
DB起動
RMAN> ALTER DATABASE OPEN;
DBが起動できるようになった。
再度処理をながすときは、DB_RECOVERY_FILE_DEST_SIZEを増やし対応する。
初期化パラメータファイルの値を変更後にDB再起動を行うか、ALTER SYSTEMコマンドで動的に変更できる。