Oracle9i(9.0.1)で発生する致命的なバグ
自分の夏季休暇中、同僚は全社システムで利用しているOracleのバグのせいでシステム復旧で大変な目にあわされたようです。本当にご苦労様でした>同僚
バグの内容はLONG RAWデータ型をINSERT処理する際にロールバックセグメントでエクステントが発生するときまれにブロックを壊してしまうというものです。これは9.2.0.3以降であれば修正済みとのことで、実際にこのバグに遭遇する人はほとんどいないと思われますが、我々のシステムはその運の悪い部類に入っていたのでした。
最悪なのは、ブロック破損をした内容がアーカイブログにも出力されてしまうことがあり、その場合、コールドバックアップで取得したDBFファイルに順次アーカイブを適用することで復旧する方法自体がとれず、不完全リカバリしか行えなくなります。
対処方法は以下の通り。
- 自動UNDO管理をやめ、昔ながらのロールバックセグメントを手動で作り、管理する。そのとき、エクステントが発生しないようにする
- LONG RAW型をやめ、LOB型に移行する
- 初期化パラメータDB_BLOCK_CHECKING=TRUEを設定する
いずれも決定打となる解決策ではありません。個人的に自動UNDO管理が楽であったので、ORACLEを9.0.1から9.2.0へバージョンアップする方向で改善作業を進めたいです。
また、ブロック破損のチェックはdbvコマンドで行います。そしてブロック破損部分を無効にするのはDBMS_REPAIRパッケージを利用します。が、この場合、データが消えてしまうので注意が必要です。
ちなみにOracle8iでも同様のバグがあるとのことです。大量のLONG RAWデータを所有されている方は一度dbvコマンドでデータベースファイルのブロック破損を調べてみたほうが良いかもしれません。