経緯
とある朝、いつものようにOracleDBを利用しているシステムの開発を進めようとしたところ、
以下のようなメッセージが出てきた。
なるほど。なんかわからんけどエラーが発生したようだ。
調査
OracleのEnterpriseManagerにアクセスしようとしたところ、見た目は違うが上記と同じエラーメッセージが表示され、ログインすらできない。
調べてみると、今回のエラーは「アーカイブ・ログ」というものが溜まりすぎているのが問題らしい。
社内で聞き取りをしたところ、誰か他の人がアーカイブ・ログの書き込み設定を無効→有効に変更していたとのこと。
症状の解消手順(暫定対応)
1. teraterm等でroot権限でログイン
2. oracleユーザーに変更
3. リカバリマネージャ(RMAN)の起動
4. 一定期間(今回は7日間)以上前のアーカイブログを削除
5. リカバリマネージャを終了
6. oracleユーザーでSQLPlusにログイン
7. Oracleインスタンスの起動
8. SQLPlusを終了
9. リスナコントロールを起動
10. リスナを開始
11. リスナコントロールを終了
12. oracleユーザーからログアウト
13. teraterm等を終了
以下は全て実行するコマンドです。処理結果は記載していません。
$ su - oracle
$ rman
RMAN> DELETE ARCHIVELOG UNTIL TIME 'sysdate - 7';
RMAN> exit
$ sqlplus [User]/[Password] as sysdba
SQL> startup
SQL> exit
$ lsnrctl
LSNRCTL> start
LSNRCTL> exit
$ exit
継続的対応
とりあえずOracleは使えるようになったけど、このままだとどうせまた再発するので、アーカイブログを定期的に削除する仕組みを入れることにした。
参考:アーカイブログの削除方法まとめ(ORA-00257対処方法)
削除バッチ(バッチ?シェル?)の作成
1. oracleユーザーのホームディレクトリ(今回は/home/oracle
)直下に、以下の2ファイルを作成する
run{
# 7日以前を削除
delete noprompt archivelog until time 'sysdate-7';
# OSから削除された場合、oracle側も削除する
crosscheck archivelog all;
delete expired archivelog all;
}
su -l oracle -c "rman target / @del_arclog.rcv log=del_arclog.log append nocatalog"
2. 上記2ファイルの所有者を、oracleユーザに変更する
3. 上記2ファイルに、所有者における実行権限を付与する
4. 所有者と権限の設定を確認する
$ cd /home/oracle
$ chown oracle:oinstall del_arclog.rcv
$ chown oracle:oinstall del_arclog.sh
$ chmod 744 del_arclog.rcv
$ chmod 744 del_arclog.sh
$ ll
crontabにスケジュール登録する
1. root権限でteraterm等にログイン
2. crontabに、指定のスケジュールで/home/oracle/del_arclog.sh
を実行するように登録
$ crontab -e
0 19 * * * /home/oracle/del_arclog.sh (毎日19時に実行することとした)
cronの実行ログは以下のコマンドで確認することができる。
$ tail -f /var/log/cron
cronのメールスプールを削除する
初期状態では、cronの実行後にrootアカウント宛にメール送信する処理が動く。
が、メール設定をしていない場合にはスプールフォルダにどんどんメールが溜まっていき、
今後はこっちが溢れてしまう。
対策は様々あると思うが、今回は実行結果をメール送信する必要もないが、
メールを送信しない設定に変更するのもちょっと不安なので、
一定期間ごとにスプールのメールを削除する処理を上記同様にcronに登録することにした。
$ crontab -e
0 19 * * * /home/oracle/del_arclog.sh (←さっきの)
0 5 * * * cat /dev/null > /var/spool/mail/root (←今回の。毎朝5時にスプールを上書きする)