0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OracleDBでアーカイブ・エラー(ORA-00257)が発生した際の解決法

Posted at

経緯

とある朝、いつものようにOracleDBを利用しているシステムの開発を進めようとしたところ、
以下のようなメッセージが出てきた。

screenshot1579824739456.png

なるほど。なんかわからんけどエラーが発生したようだ。

調査

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ファイルを作成する

del_arclog.rcv
run{
 # 7日以前を削除
 delete noprompt archivelog until time 'sysdate-7';
 # OSから削除された場合、oracle側も削除する
 crosscheck archivelog all;
 delete expired archivelog all;
}
del_arclog.sh
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

▼実行結果
image.png

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時にスプールを上書きする)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?