読者です 読者をやめる 読者になる 読者になる

フラッシュバックドロップ機能について

フラッシュバック・ドロップを少し検証して纏めてみた。

 

■フラッシュバック・ドロップについて

端的に言うと削除した表を元に戻す機能。

概念的にはWindownにおけるゴミ箱と同等と考えて問題ない

10gからの新機能

「SYSTEM表領域を除く」ローカル管理表領域上のオブジェクトに対して使用可能。

デフォルトでオブジェクトを削除するとリサイクル・ビンに移動され、領域の開放は行われない

表を削除すると依存する索引などのオブジェクトもリサイクル・ビンに移動される(ビューはそのまま残る)

リサイクル・ビン内では「BIN$unique_id$version」と言う命名識別子になる

PURGE RECYCLEBINの実行時やオブジェクトの存在する表領域が一杯になったタイミングでオブジェクトは削除される

表領域やユーザを削除した場合はリサイクル・ビンのオブジェクトも削除されてしまう

リサイクル・ビン内のオブジェクトにSELECT文は実行可能。DMLDDLは不可

混同しがちだがフラッシュバック・ドロップとフラッシュバック・テーブルは別機能

 

実機検証

(1)リサイクル・ビン機能の有効・無効の確認方法(デフォルト有効)
 SQL>
 SQL> show parameter recyclebin
 
 NAME TYPE VALUE
 ------------------------------------ ----------- ------------------------------
 recyclebin string on
 SQL>

 

(2)システムレベルでリサイクル・ビンの無効化(変更の反映に再起動が必要)
 SQL> ALTER SYSTEM SET recyclebin = OFF SCOPE = SPFILE;
 SQL> shutdown immediate
 SQL> startup

(3)システムレベルでリサイクル・ビンの有効化(変更の反映に再起動が必要)
 SQL> ALTER SYSTEM SET recyclebin = ON SCOPE = SPFILE;
 SQL> shutdown immediate
 SQL> startup

 

(4)セッションレベルでリサイクル・ビンの無効化(変更の反映に再起動が不要)
 SQL> ALTER SESSION SET recyclebin = OFF;

 

(5)セッションレベルでリサイクル・ビンの有効化(変更の反映に再起動が不要)
 SQL> ALTER SESSION SET recyclebin = ON;

(6)フラッシュバック・ドロップ機能実行例(一連の手順として紹介します)
 SQL>-----表を削除します
 SQL>
 SQL> drop table scott.emp;
 表が削除されました。
 SQL>
 SQL>
 SQL> ---削除した表と依存するオブジェクトがリサイクルビンに移動した事を確認
 SQL>
 SQL> set linesize 200
 SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE FROM RECYCLEBIN;
 OBJECT_NAME ORIGINAL_NAME TYPE
 ------------------------------ ----------------- ------
 BIN$5TGyHH+ZTYu1BbQcHb/cmA==$0 PK_EMP INDEX
 BIN$H7uzFOohQ8y0zQwx4kg63Q==$0 EMP TABLE
 SQL>
 SQL>
 SQL> --削除した表をフラッシュバックし復元します(表を復元するとそれに依存する索引なども復元します)
 SQL>
 SQL> FLASHBACK TABLE SCOTT.EMP TO BEFORE DROP;
 フラッシュバックが完了しました。
 SQL>
 SQL>
 SQL> --インデックスは復元後もリサイクルビン内でのネーミングのままとなります。
 SQL>
 SQL> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'EMP';
 INDEX_NAME
 ------------------------------
 BIN$5TGyHH+ZTYu1BbQcHb/cmA==$0
 SQL>
 SQL>
 SQL> --インデックスをDROP前の名前に戻します。
 SQL> ALTER INDEX "BIN$5TGyHH+ZTYu1BbQcHb/cmA==$0" RENAME TO PK_EMP;
 索引が変更されました。
 SQL>
 SQL> --インデックスの名前が元に戻ったことを確認します。
 SQL> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'EMP';
 
 INDEX_NAME
 ------------------------------
 PK_EMP
 
 SQL>--

(7)リサイクルビンの内容を表示
 SQL> show recyclebin
 ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
 ---------------- ------------------------------ ------------ -------------------
 HOGEHOGE BIN$IMeAX6FfR/CtiT1+UvV7Ow==$0 TABLE 2016-06-03:22:24:33

 

(8)上記と同様にリサイクルビンの内容を表示
 SQL> SELECT * FROM RECYCLEBIN;

(9) PURGEオプション指定でリサイクルビンに残さず表を削除
 SQL> DROP TABLE hoge PURGE;
 表が削除されました。
 
 
(10)実行ユーザのリサイクルビンをすべて削除
 SQL> purge user_recyclebin;
 リサイクルビンがパージされました。
 
(11)上記と同じく実行ユーザのリサイクルビンをすべて削除
 SQL>PURGE RECYCLEBIN ;

 

(12)DB内のリサイクルビンをすべて削除(SYSDBA権限が必要)
 SQL> purge dba_recyclebin;
 DBAリサイクルビンがパージされました。

 

(13)USERS表領域内のリサイクルビンをすべて削除(通常のオブジェクトは削除されない)
 SQL> PURGE TABLESPACE USERS;
 
 表領域がパージされました。

 

(14)リサイクルビン内のオブジェクトのSELECT文発行(オブジェクト名は""で囲む必要有)
 SQL> show recyclebin
 ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
 ---------------- ------------------------------ ------------ -------------------
 HOGE BIN$6JkRsq50RDmX+iOuip1HcQ==$0 TABLE 2016-06-03:22:40:00
 SQL>
 SQL> select DNAME FROM SCOTT."BIN$6JkRsq50RDmX+iOuip1HcQ==$0";
  DNAME
 --------------
 ACCOUNTING
 RESEARCH
 SALES
 OPERATIONS

 

(15)リサイクルビン内のオブジェクトにDDLDMLを実行するとORA-38301エラー(仕様動作)
 SQL> delete from SCOTT."BIN$6JkRsq50RDmX+iOuip1HcQ==$0";
 delete from SCOTT."BIN$6JkRsq50RDmX+iOuip1HcQ==$0"
  *
 行1でエラーが発生しました。:
 ORA-38301: リサイクルビンのオブジェクトにDDL/DMLを実行できません

 

(16)索引などと異なりビューに関しては依存する表と共にリサイクルビンに移動されず残る(一連の手順として紹介します)
 SQL>--ビューの作成
 SQL> create view hoge_view as select * from scott.hoge;
 ビューが作成されました。
 SQL>
 SQL>--ビューと依存関係にある表を削除
 SQL> drop table hoge;
 表が削除されました。
 SQL>
 SQL>--対象表がリサイクルビンに移動したことを確認
 SQL> show recyclebin
 ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
 ---------------- ------------------------------ ------------ -------------------
 HOGE BIN$iFchJ2arSsOK73cgOSOutg==$0 TABLE 2016-06-03:22:53:49
 SQL>
 SQL>--ビューに関してはリサイクルビンに移動されない(依存オブジェクトが無いためORA-04063が返る)
 SQL> select * from scott.hoge_view;
 select * from scott.hoge_view
  *
 行1でエラーが発生しました。:
 ORA-04063: view "SCOTT.HOGE_VIEW"にエラーがあります。
 SQL>
 SQL>--ビューの依存する表をフラッシュバックする
 SQL> FLASHBACK TABLE SCOTT.hoge TO BEFORE DROP;
 フラッシュバックが完了しました。
 SQL>
 SQL>--依存表のフラッシュバック後はビューへの問い合わせが実行可能
 SQL> select * from scott.hoge_view;
 
  DEPTNO DNAME LOC
 ---------- -------------- -------------
  10 ACCOUNTING NEW YORK
  20 RESEARCH DALLAS
  30 SALES CHICAGO
  40 OPERATIONS BOSTON