OBをトコトン極める

Oracle テーブルを誤って削除してしまった場合の対応

  • 2018.02.06
  • 株式会社システムインテグレータ
Oracle テーブルを誤って削除してしまった場合の対応

SI Object Browserでのログイン直後に表示される[オブジェクトリスト]では、Windowsのエクスプローラ風のGUIを採用し、直感的な操作ができるようになっています。

t1.png

オブジェクトリスト
 

「この画面、わかりやすくていいですね」とお褒めの言葉をいただくこともありますが、その一方で「気づかないうちにDELETEキーを押していて、テーブルを消しそうになって焦った」という声も。

t2.png

オブジェクトリスト - DELETEキー押下

本当に間違って消してしまったとしても、まずは一度落ち着いてください。SI Object Browserの[ごみ箱]画面を使用して、削除直前のテーブルを復元できる可能性があります。

今回は、この[ごみ箱]を使用したテーブル復元の方法をご紹介したいと思います。
[ごみ箱]画面はOracleRECYCLEBIN機能を簡単に利用するものとなっており、利用するにはいくつか条件があります。 

前提条件

①Oracle Database 10g以降 かつ 初期化パラメータ「RECYCLEBIN」がON(デフォルト)であること
②削除してしまったテーブルが格納されていた表領域がSYSTEM表領域でないこと
③削除してしまったテーブルが格納されていた表領域に十分な空きがあること
④テーブルの削除(DROP TABLE)でPURGEオプションを使用していないこと

これらの前提条件を少し解説します。

①の初期化パラメータ「RECYCLEBIN」は、[データベース情報]画面で確認できます。

(要DBAロール)

t3.png

データベース情報 - 初期化パラメータ

②については、SYSTEM表領域に格納されているテーブルをDROPするとPURGEオプションを指定していなくても自動的にパージされてしまいます。

ユーザーテーブルをSYSTEM表領域に格納することはないと思いますが、万一SYSTEM表領域内のテーブルを削除してしまった場合、今回の方法で復元することはできません。 

③については、テーブルの削除後に表領域がいっぱいになった状態で既存テーブルの自動拡張やオブジェクトの追加が行われると、ごみ箱からパージされてしまうので注意が必要です。 

④のPURGEオプションはごみ箱を経由せずテーブルを破棄するオプションとなりますので、このオプションを指定してDROPしたテーブルをごみ箱から復元することはできません。 

これらの条件を満たしたうえで、削除したテーブルのSELECT/DROP権限を持つユーザーであれば復元を実行できます。
同一セッションで復元作業を行う場合は、ユーザーの切り替えは特に必要ないでしょう。

それでは、さっそく見ていきたいと思います。

テーブルを削除

まずは、テーブルを削除する前に定義情報を確認しておきます。
シンプルな「T1」テーブルを今回の検証に使用したいと思います。

t4.png

T1」テーブルの定義情報

復元作業後にデータがちゃんと復元されたかを確認するために、別途コピーを保存しておきました。それでは、これからが本番です。

t5.png

削除実行
 

無事()テーブルが削除されましたので、[ごみ箱]画面を参照してみます。

ごみ箱画面を参照、復元実行

[ごみ箱]画面を開くには、ツールバーから[ごみ箱]ボタンを押すか、[管理]メニューから[ごみ箱]を選択します。

t6.png

ツールバー ごみ箱

[ごみ箱]画面を開くと、PURGEオプションなしでDROPされたテーブルやその従属オブジェクトを確認することができます。

今回削除したテーブル「T1」とその主キー制約により作成されたインデックス「PK_T1」が格納されていることがわかりますね。

t7.png

[ごみ箱]画面

ここで注意したいのは、従属オブジェクトを指定して復元することはできないということです。例えばインデックスが選択状態になっていると[復元]ボタンは有効になりません。

それでは、テーブル「T1」を選択状態にして[復元]ボタン または 右クリックメニューの[復元]を押下してみましょう。

t8.png 
ごみ箱 復元

復元を実行すると「オブジェクトが復元されました」のメッセージとともに、[ごみ箱]画面のリストからテーブルとインデックスの情報が消えます。正しく復元されているのでしょうか?

復元したテーブルを確認

[オブジェクトリスト]に戻り、再読み込みを行いました。
テーブル「T1」は確かに復元されているようです。

t9.png

オブジェクトリスト 復元後

テーブルの定義情報やデータの内容についても確認してみましょう。
t10.png

T1」テーブルの定義情報 復元後

削除を行う前は、列「C1」に対する主キー制約「PK_T1」のみ従属していましたが、復元後はごみ箱に格納されていた時の名前(BIN$)の主キー制約と、同名のユニークインデックスが従属しています。
 t11.png

データ確認 復元後

テーブルデータについては、件数、差分ともに問題ないようですね。 

まとめ

いかがでしたか?

今回ご紹介した方法では、テーブルのデータを削除直前まで戻すことができました。一方で、主キー制約が元の名前で復元できないなど、完全な状態に復元できるわけではありません。

今回は紹介しませんでしたが、参照整合性制約が設定されている場合は、手動で設定しなおす必要もあります。

また、運用中の環境でこの手順を実行したと想定した場合、上記に加えて削除されなかったテーブルとのデータ整合性が不正になる可能性がありますので、本番運用環境で実行するのには不向きなようですね。

開発環境上で、せっかく作成したテストデータがあるテーブルを削除してしまった時など、どうしても直前データを復旧したい、という場合に今回の手順を利用してみてください。

SI Object Browser 製品カタログ

SI Object Browser 製品カタログ