oracle database standard editionでセミオンラインddl
TRANSCRIPT
Oracle Database Standard EditionでセミオンラインDDL
2015/10/17
北川健太郎JPOUG> SET EVENTS 20151017
⾃⼰紹介
名前北川健太郎-
仕事WEB系企業のDBA-DBA歴2年目-
社内MySQL:99%-Oracle Database SEone:1%-
Enterprise Editionに憧れてるStandard Edition使いです⼝癖「あーそれEnterpriseならできたのに・・」
1/26
Oracle Database Standard Editionで困ること
オンラインDDLパラレルクエリパーティションテーブルADDMASHand so on…
2/26
そこで3/26
pt-online-schema-
change(pt-osc)4/26
サービス無停⽌でDDLが可能な
MySQLのツール!5/26
Oracleでも作っちゃおう!
6/26
Oracle-semi-onlineDDL
pt-oscを参考に作成したツールマテリアライズドビューとトリガーを使⽤して、テーブルの複製を⾏うことでセミオンラインDDLを実現Oracle Database 11g以降対応
11gの機能[読取り専⽤の表]を使⽤するため-
オンラインDDLではなくセミオンラインDDL完全オンラインでの実装は無理でした。ごめんなさい。-
どんなサイズのテーブルでも少しの停⽌時間でDDLが完了数秒テーブルが存在しないエラーを許すのであればオンラインで可能-
7/26
Oracle-semi-onlineDDLをどういうとき使⽤するか
主にインデックスの作成代⽤できたり最適化されるDDLカラムの追加(ADD COLUMN)
11g以降であればdefault値+NOT NULLが付与されていても最適化される-
カラムの削除(DROP COLUMN)UNUSEDを使⽤する
-
カラムの変更(MODIFY COLUMN)-インデックスの削除(DROP INDEX)
11g以降であれば不可視化できる(INVISIBLE)-
8/26
pt-oscの簡単な概要
pt-oscは⼤きく分けて4つの⼯程でオンラインDDLを実現 1. テーブル複製 2. 新規更新のためのトリガー作成 3. 既存データコピー 4. テーブル⼊れ替え
9/26
1.テーブル複製(pt-osc)
空のテーブルを複製複製テーブルにalter table実施
10/26
2.トリガー作成(pt-osc)
新規更新はテーブルに複製テーブルへ更新するトリガー
insertやdelete時にIGNORE句がある-insertやupdate時にREPLACE句がある-
11/26
3.既存データコピー(pt-osc)
データを主キーごとのチャンクに分けて複製テーブルへコピー
12/26
4.テーブル⼊れ替え(pt-osc)
複製テーブルとテーブルを同時にRENAMERename table 'TEST_TABLE' to 'OLD_TEST_TABLE' , 'NEW_TEST_TABLE' to 'TEST_TABLE';
古いテーブルを削除する13/26
Oracle-semi-onlineDDLの簡単な概要
Oracle-semi-onlineDDLも⼤きく分けて4つの⼯程 1. テーブル複製 2. 既存データコピー 3. 新規更新のためのトリガー作成 4. テーブル⼊れ替え
14/26
1.テーブル複製(Oracle-semi-onlineDDL)
空のテーブルを複製複製テーブルにalter table実施
15/26
2.既存データコピー(Oracle-semi-onlineDDL)
テーブルにMaterialized View LogとMaterialized View作成複製テーブルに対して、Mviewのデータをごそっとコピーする
16/26
3.トリガー作成(Oracle-semi-onlineDDL)
Mviewに複製テーブルへ更新するトリガーを作成Mviewを⾼速リフレッシュをすることで複製テーブルに反映
17/26
3.トリガー作成(Oracle-semi-onlineDDL)
pt-oscの場合既存データコピーと新規更新のトリガーが同時に実⾏される-
Oracle-semi-onlineDDLの場合既存データコピーした後にMview⾼速リフレッシュすることで新規更新を反映
-
Mergeやヒント句のIGNORE̲ROW̲ON̲DUPKEY̲INDEXを使⽤することでpt-oscと同様の動作を考えた。
難しかったのでやめた
-
18/26
4.テーブル⼊れ替え(Oracle-semi-onlineDDL)
ここでアクセス不可な時間帯が発⽣
19/26
4.テーブル⼊れ替え(Oracle-semi-onlineDDL)
テーブルをREAD ONLYにする
ALTER TABLE ・・ READ ONLY;
20/26
4.テーブル⼊れ替え(Oracle-semi-onlineDDL)
Mviewの⾼速リフレッシュでREAD ONLY以前の差分を反映
exec dbms_mview.refresh('Mview','f');
21/26
4.テーブル⼊れ替え(Oracle-semi-onlineDDL)
Materialized View Logの削除
drop materialized view log ・・
22/26
4.テーブル⼊れ替え(Oracle-semi-onlineDDL)
テーブルのrename
ALTER TABLE 'TEST_TABLE' to RENAME TO 'OLD_TEST_TABLE';
23/26
4.テーブル⼊れ替え(Oracle-semi-onlineDDL)
複製テーブルのrename
ALTER TABLE 'NEW_TEST_TABLE' RENAME TO 'TEST_TABLE';
oldテーブルの削除24/26
まとめ
メリットどんなテーブルでも最⼩限の停⽌時間でDDL可能-テーブルやインデックスの断⽚化が解消される-
デメリット主キー必須-データ容量が対象のテーブルサイズの3倍が必要-やっぱり負荷が⾼い-
github:kenken0807対応:インデックス作成、インデックス削除
25/26
ご清聴ありがとうございました。
26/26