運用のデータ修正依頼が来たので、ちゃっちゃとSQL文を作って実行してCOMMITした。さあ帰ろうとして何気なく修正SQLを確認したところ、UPDATE TBL SET FLD = 1 WHERE ID = 数値;という行が200行以上ある中で1つだけ、UPDATE TBL SET FLD = 1 WHERE ID = ID;という行があるではないか。ということはTBLテーブルのすべてのレコードで、FLDが1になってしまった。
血の気は引くは、気が動転してしまい、どうすればよいか全然思いつかない。バックアップから戻すわけにもいかず、そのうち何件かはFLDの値が推測できるが、全部で25万件あるものを正しく戻すことは不可能である。
これは首だなと覚悟したその時だった。同僚がフラッシュバックリカバリという機能があることを教えてくれた。
これによると、ある時点でのテーブルの状態を取得できるということだった。
早速、SELECT * FROM TBL AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '60' MINUTE);としたところ、1時間前に修正する前の状態が取得できた。
まさに九死に一生、地獄の淵から生還した。
この結果を元にFLDの値を戻すSQL文を作成して実行した。
その後、正しいSQL文に直して再度修正をした。
帰る前に気づいてよかった。このフラッシュバックリカバリはUNDO表領域にデータが残っている間しか使えないので、月曜日におかしいよって言われても後の祭りだったかも。Oracleバンザイと思った日だった。
0 件のコメント:
コメントを投稿