なぜFlashback Dropを使わないの?

33
なな Flashback Drop ななななななJPOUG Tech Talk Night #6 ななななななななな なな な

Transcript of なぜFlashback Dropを使わないの?

Page 1: なぜFlashback Dropを使わないの?

なぜ Flashback Dropを使わないの?JPOUG Tech Talk Night #6ライトニングトーク三原 健一

Page 2: なぜFlashback Dropを使わないの?

自己紹介• 名前:三原 健一• フリーランス• 現在、某 SIer にてパフォーマンスを専門とするチームに従事• 以前、某メルマガ執筆者の一人• もっと以前、ヘリコプターに乗ってました。• 信条:日の当たらない地味な機能に光を与える

Page 3: なぜFlashback Dropを使わないの?

Flashback Drop って必要なの?

Page 4: なぜFlashback Dropを使わないの?

過去3年で2回の事例を見た

• 事例1• オンライン中の本番テーブルを誤って Drop

• 事例2• 総合試験環境のテーブルを誤って Drop

Page 5: なぜFlashback Dropを使わないの?

Flashback Drop って必要なの?

Page 6: なぜFlashback Dropを使わないの?

ヒアリングしてみた• ゴミ箱に入れる時の I/O 負荷が気になる。

• ところで、ゴミ箱ってどこ?• ゴミ箱の容量が気になる。• 新機能ってちょっと不安だし。• そもそも、俺オペミスしないもん!だから、そんな機能は無効にしていた。

Page 7: なぜFlashback Dropを使わないの?

いろいろ誤解があるようだ

Page 8: なぜFlashback Dropを使わないの?

検証してみた!• 検証1

• 基本的な動作• 従属オブジェクト、制約

• 検証2• 容量管理

Page 9: なぜFlashback Dropを使わないの?

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%

初期状態

Page 10: なぜFlashback Dropを使わないの?

DEPTPK_DEPT

EMPPK_EMP

PK_DEPT

PK_EMP

FK_EMP

初期状態

Page 11: なぜFlashback Dropを使わないの?

検証1

Page 12: なぜFlashback Dropを使わないの?

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;

Page 13: なぜFlashback Dropを使わないの?

DEPTPK_DEPT

BIN$TduxVYG8Q5mq7BFKwzmeuw==$0

BIN$IM3P5MOwSlazE4G+zy6X3w==$0

PK_DEPT

BIN$YIfQE0ilRXy+VvPcGtg1WA==$0

FK_EMP 削除

SQL> drop table EMP;

Page 14: なぜFlashback Dropを使わないの?

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;

Page 15: なぜFlashback Dropを使わないの?

DEPTPK_DEPT

EMP

BIN$IM3P5MOwSlazE4G+zy6X3w==$0

PK_DEPT

BIN$YIfQE0ilRXy+VvPcGtg1WA==$0

FK_EMP 削除

SQL> flashback table EMP to before drop;

Page 16: なぜFlashback Dropを使わないの?

検証1まとめ• テーブルを Drop しても Rename されるだけ。

• 表領域間の移動はない。• インデックスも Rename される。• PK 制約も Rename される。• FK 制約は削除される。• テーブル名は「 to before drop 」で元に戻る。

• インデックス、 PK 制約は Rename されたまま。

Page 17: なぜFlashback Dropを使わないの?

検証2

Page 18: なぜFlashback Dropを使わないの?

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%

Page 19: なぜFlashback Dropを使わないの?

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%

Page 20: なぜFlashback Dropを使わないの?

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);

Page 21: なぜFlashback Dropを使わないの?

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;

Page 22: なぜFlashback Dropを使わないの?

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);

Page 23: なぜFlashback Dropを使わないの?

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);

Page 24: なぜFlashback Dropを使わないの?

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;

Page 25: なぜFlashback Dropを使わないの?

検証2まとめ• テーブルを Drop すると空きエクステントは増えるが、セグメントはそのまま残る。• 表領域に空きエクステントがあっても空きセグメントが存在しない状況があり得る。• 新たなテーブル作成時は古いリサイクルビン・セグメントを解放して領域を確保する。

• Drop 時の SCN を見ているようだ。• (当たり前だが)インデックスのみの Drop はそのまま削除。

Page 26: なぜFlashback Dropを使わないの?

Flashback Drop って必要なの?

Page 27: なぜFlashback Dropを使わないの?

デフォルト:有効をあえて変える理由がわからない

Page 28: なぜFlashback Dropを使わないの?

もし、有効にしていればあの事例も大したことにはならなかったかも

Page 29: なぜFlashback Dropを使わないの?

Amazon RDS for Oracle は「 recyclebin=off 」だった !?Why?

Page 30: なぜFlashback Dropを使わないの?

「現行踏襲の呪縛」から解放され新機能を正しく評価しよう!

Page 31: なぜFlashback Dropを使わないの?

検証内容はブログで公開します。http://onefact.jp/wp/2016/02/25/

Page 32: なぜFlashback Dropを使わないの?

終わり

Page 33: なぜFlashback Dropを使わないの?

おまけ: 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;

レコードが選択されませんでした。