なぜflashback dropを使わないの?
TRANSCRIPT
なぜ Flashback Dropを使わないの?JPOUG Tech Talk Night #6ライトニングトーク三原 健一
自己紹介• 名前:三原 健一• フリーランス• 現在、某 SIer にてパフォーマンスを専門とするチームに従事• 以前、某メルマガ執筆者の一人• もっと以前、ヘリコプターに乗ってました。• 信条:日の当たらない地味な機能に光を与える
Flashback Drop って必要なの?
過去3年で2回の事例を見た
• 事例1• オンライン中の本番テーブルを誤って Drop
• 事例2• 総合試験環境のテーブルを誤って Drop
Flashback Drop って必要なの?
ヒアリングしてみた• ゴミ箱に入れる時の I/O 負荷が気になる。
• ところで、ゴミ箱ってどこ?• ゴミ箱の容量が気になる。• 新機能ってちょっと不安だし。• そもそも、俺オペミスしないもん!だから、そんな機能は無効にしていた。
いろいろ誤解があるようだ
検証してみた!• 検証1
• 基本的な動作• 従属オブジェクト、制約
• 検証2• 容量管理
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
Free Area 40%
初期状態
DEPTPK_DEPT
EMPPK_EMP
PK_DEPT
PK_EMP
FK_EMP
初期状態
検証1
TS_SMALL 表領域( 640KB )
BIN$TduxVYG8Q5mq7BFKwzmeuw==$0 (ORG:EMP)
BIN$IM3P5MOwSlazE4G+zy6X3w==$0 (ORG:PK_EMP)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
Extent Free 40→60% Segment Free 40%
SQL> drop table EMP;
DEPTPK_DEPT
BIN$TduxVYG8Q5mq7BFKwzmeuw==$0
BIN$IM3P5MOwSlazE4G+zy6X3w==$0
PK_DEPT
BIN$YIfQE0ilRXy+VvPcGtg1WA==$0
FK_EMP 削除
SQL> drop table EMP;
TS_SMALL 表領域( 640KB )
EMP
BIN$IM3P5MOwSlazE4G+zy6X3w==$0
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
Extent Free 40% Segment Free 40%
SQL> flashback table EMP to before drop;
DEPTPK_DEPT
EMP
BIN$IM3P5MOwSlazE4G+zy6X3w==$0
PK_DEPT
BIN$YIfQE0ilRXy+VvPcGtg1WA==$0
FK_EMP 削除
SQL> flashback table EMP to before drop;
検証1まとめ• テーブルを Drop しても Rename されるだけ。
• 表領域間の移動はない。• インデックスも Rename される。• PK 制約も Rename される。• FK 制約は削除される。• テーブル名は「 to before drop 」で元に戻る。
• インデックス、 PK 制約は Rename されたまま。
検証2
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
SQL> create table EMP1 as select * from EMP;SQL> create unique index PK_EMP1 on EMP1 (EMPNO);
EMP1 (8block=64KB)
PK_EMP1 (8block=64KB)
Extent Free 20% Segment Free 20%
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
SQL> drop table EMP1;
BIN$fwT/IhomQvm3rrv7SMAEIA==$0
BIN$YDcoyDClRYqEdI1NlIY3ng==$0
Extent Free 40% Segment Free 20%
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
PK_EMP2 (8block=64KB)
BIN$fwT/IhomQvm3rrv7SMAEIA==$0
BIN$YDcoyDClRYqEdI1NlIY3ng==$0
EMP2 (8block=64KB)
SQL> create table EMP2 as select * from EMP;SQL> create unique index PK_EMP2 on EMP2 (EMPNO);
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0
BIN$fwT/IhomQvm3rrv7SMAEIA==$0
BIN$YDcoyDClRYqEdI1NlIY3ng==$0
BIN$c3jA6BZKTGOkGUgJI69p8g==$0
SQL> drop table EMP2;
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
BIN$SyavBrvpRz6HQHACx2Ln7Q==$0
BIN$c3jA6BZKTGOkGUgJI69p8g==$0
EMP3 (8block=64KB)
PK_EMP3 (8block=64KB)
SQL> create table EMP3 as select * from EMP;SQL> create unique index PK_EMP3 on EMP3 (EMPNO);
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
EMP3 (8block=64KB)
PK_EMP3 (8block=64KB)
PK_EMP4 (8block=64KB)
EMP4 (8block=64KB)
SQL> create table EMP4 as select * from EMP;SQL> create unique index PK_EMP4 on EMP4 (EMPNO);
TS_SMALL 表領域( 640KB )
EMP (8block=64KB)
PK_EMP (8block=64KB)
DEPT (8block=64KB)
PK_DEPT (8block=64KB)
SALGRADE (8block=64KB)
Management Area (8block=64KB)
EMP3 (8block=64KB)
PK_EMP3 (8block=64KB)
EMP4 (8block=64KB)
SQL> drop index PK_EMP4;
検証2まとめ• テーブルを Drop すると空きエクステントは増えるが、セグメントはそのまま残る。• 表領域に空きエクステントがあっても空きセグメントが存在しない状況があり得る。• 新たなテーブル作成時は古いリサイクルビン・セグメントを解放して領域を確保する。
• Drop 時の SCN を見ているようだ。• (当たり前だが)インデックスのみの Drop はそのまま削除。
Flashback Drop って必要なの?
デフォルト:有効をあえて変える理由がわからない
もし、有効にしていればあの事例も大したことにはならなかったかも
Amazon RDS for Oracle は「 recyclebin=off 」だった !?Why?
「現行踏襲の呪縛」から解放され新機能を正しく評価しよう!
検証内容はブログで公開します。http://onefact.jp/wp/2016/02/25/
終わり
おまけ: 10g ではメタデータが残っていた?SQL> select ORIGINAL_NAME,TYPE,SPACE from user_recyclebin 2 where CREATETIME = (select min(CREATETIME) from user_recyclebin);
ORIGINAL_NAME TYPE SPACE-------------------------------- ------------------------- ----------TABLE******** TABLE 0INDEX************ INDEX 0PK_************* INDEX 0
SQL> flashback table TABLE******** to before drop rename to TABLE********_RCV;
フラッシュバックが完了しました。SQL> desc TABLE********_RCV 名前 NULL? 型 ----------------------------------------- -------- ------------------ COL1 NOT NULL NUMBER(22) COL2 NUMBER(22) COL3 NUMBER(22) COL4 DATE COL5 DATE COL6 NUMBER(22) COL7 DATE
SQL> select * from TABLE********_RCV;
レコードが選択されませんでした。