2011年11月15日火曜日

Oracle DatabaseのフラッシュリカバリエリアがいっぱいでDBが応答しない時について


昨日ちょうどOracleDBの障害があったので備忘録。
つかOracleDB使ってる人は当たり前かもしれないけどDB知らない人が開発環境でローカルに入れたりした時にハマるかもしれないのであんまり詳しくない人用に(ホントにあったので)

OracleDB(以下Oracle)はフラッシュリカバリエリアの領域をインストール時に指定します。


フラッシュリカバリエリアについてはこちら


推奨としてはこのフラッシュリカバリエリアは物理的に別のHDD(バックアップストレージ)をISCSI等で指定するのが流儀ですがまぁ開発環境とかだとローカルにバシッと数Gで切っちゃったりします。
本番環境でも切っちゃったりすることあるとは思います。
俺もそういう本番環境作ったことありますので。
でこのフラッシュリカバリエリアは「Oracleのバックアップ領域」として使われます。


具体的には

  1. RMAN(Oracleのバックアップの仕組み)で生成したバックアップセット(暗号化されたバックアップ)の保存
  2. アーカイブログ(データベース内の実行ログ)の保存
  3. 初期パラメータなどのその他、必要ファイルの保存

などです。
まぁここらへんはWEBに詳しいことが沢山あるのでDBAの人は調べてください。
Oracleを運用する上では必須の知識です。
なお、このフラッシュリカバリエリアの領域はdbにログインした後に

select * from v$recovery_file_dest;

で確認したり、EM上から確認できます。
参考画像


でここからが本題です。
上記のリンクを最後まで読まれた方はご理解いただけてると思いますが

フラッシュリカバリ領域がいっぱいになった場合には、以下のようにフラッシュリカバリ領域が満杯になったことを示すORA-19815がアラートログに出 力されます。このとき、インスタンスがダウンしたり、バックアップが取得できなくなることにはなりません。Oracleが自動的に古いファイルから削除し てくれますが、あまり好ましいことではないので、手動でのメンテナンスを検討する必要があります。
 と書いてあります。
が、アーカイブログモードでDBを運用している場合DBが落ちます←
そして再起動しようとするとREDOログが更新出来ないためマウントは出来ますがオープンでできません。
つまり起動でこけますm9(^Д^)プギャー
なので常にフラッシュリカバリエリアの領域を圧迫しないようにメンテナンスする必要があります。
なのでOracleにはEMでRMANのバックアップスケジュールを指定した際にお手軽に過去のバックアップ分を削除したり、アーカイブログを削除するように設定できます。
そもそもバックアップの設定の以下の部分で出来ます。

まずEMの可用性を選んで



バックアップの設定を選びます



さらにポリシーの黄色でマークしたところをお好みにどうぞ。


な感じですがこれ簡単だけど罠があります。
「EMでバックアップ設定して一緒にアーカイブログの削除やバックアップの差分も削除できるから安心!」とか思ってるとはまります←今回はこれだった。
これはEMが正常に動いてないとスケジューラーも当然動きません。
コマンドラインで

emctl status dbconsole

と打ってRunningとか返ってくる癖にスケジューラーが動いてないとかよくある話です。
そうなると一見元気にDBは動いているのにある日突然止まります。
そもそも開発環境だと常時DBを起こしておらず、必要な時にDBだけを起動させることもあるでしょう。
そうなるとdboraとか設定してるとかWindows版(全部自動起動するはず)ならいいんですがDBだけ起動させてEM立ち上げ忘れるとかあると思います。
フラッシュリカバリエリアの領域に対して割り当てて無いのにテストデータ作るために大量のinsert文とか流してアーカイブログログを大量に作っちゃうとフラッシュリカバリエリアの領域を食いつぶして止まっちゃうわけです。
で止まったから再起動→立ち上がらない(´・ω・`)となるわけです。

でそんな人はこちらを参考にしながら対応してみてください。
初期パラメータの修正し、フラッシュリカバリエリアの容量を拡げた後にDBを起動させてログの削除を行います。
開発環境なら一時凌ぎでいいですが本番環境の場合はかならずフラッシュリカバリエリアの最検討をしてください。
そもそもフラッシュリカバリエリアの監視をしてなかったor削除のルーチンが無かった場合は早急に対応した方がよいと思います。
そんな人はこちらを参考にしてみるといいと思います。
ついでに私が設計する場合はスケジューラーはEMを使わずにlinuxのcronを使ってバックアップ等を行なっています。
監視も冒頭で触れたSQLとシェルスクリプトを使ってzabbixに値を投げて監視し、閾値を超えた場合はメールを出すようにしています。
ココらへんの運用については需要があれば次の機会に。

と言う訳で本番環境での諸設定もですが開発環境でOracleを使う場合もアーカイブログの運用には気をつけましょう!!