oracle database standard editionでセミオンラインddl

27
Oracle Database Standard EditionでセミオンラインDDL 2015/10/17 北川健太郎 JPOUG> SET EVENTS 20151017

Upload: kentaro-kitagawa

Post on 06-Apr-2017

751 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Oracle Database Standard EditionでセミオンラインDDL

Oracle Database Standard EditionでセミオンラインDDL

2015/10/17

北川健太郎JPOUG> SET EVENTS 20151017

Page 2: Oracle Database Standard EditionでセミオンラインDDL

⾃⼰紹介

名前北川健太郎-

仕事WEB系企業のDBA-DBA歴2年目-

社内MySQL:99%-Oracle Database SEone:1%-

Enterprise Editionに憧れてるStandard Edition使いです⼝癖「あーそれEnterpriseならできたのに・・」

1/26

Page 3: Oracle Database Standard EditionでセミオンラインDDL

Oracle Database Standard Editionで困ること

オンラインDDLパラレルクエリパーティションテーブルADDMASHand so on…

2/26

Page 4: Oracle Database Standard EditionでセミオンラインDDL

そこで3/26

Page 5: Oracle Database Standard EditionでセミオンラインDDL

pt-online-schema-

change(pt-osc)4/26

Page 6: Oracle Database Standard EditionでセミオンラインDDL

サービス無停⽌でDDLが可能な

MySQLのツール!5/26

Page 7: Oracle Database Standard EditionでセミオンラインDDL

Oracleでも作っちゃおう!

6/26

Page 8: Oracle Database Standard EditionでセミオンラインDDL

Oracle-semi-onlineDDL

pt-oscを参考に作成したツールマテリアライズドビューとトリガーを使⽤して、テーブルの複製を⾏うことでセミオンラインDDLを実現Oracle Database 11g以降対応

11gの機能[読取り専⽤の表]を使⽤するため-

オンラインDDLではなくセミオンラインDDL完全オンラインでの実装は無理でした。ごめんなさい。-

どんなサイズのテーブルでも少しの停⽌時間でDDLが完了数秒テーブルが存在しないエラーを許すのであればオンラインで可能-

7/26

Page 9: Oracle Database Standard EditionでセミオンラインDDL

Oracle-semi-onlineDDLをどういうとき使⽤するか

主にインデックスの作成代⽤できたり最適化されるDDLカラムの追加(ADD COLUMN)

11g以降であればdefault値+NOT NULLが付与されていても最適化される-

カラムの削除(DROP COLUMN)UNUSEDを使⽤する

-

カラムの変更(MODIFY COLUMN)-インデックスの削除(DROP INDEX)

11g以降であれば不可視化できる(INVISIBLE)-

8/26

Page 10: Oracle Database Standard EditionでセミオンラインDDL

pt-oscの簡単な概要

pt-oscは⼤きく分けて4つの⼯程でオンラインDDLを実現 1. テーブル複製 2. 新規更新のためのトリガー作成 3. 既存データコピー 4. テーブル⼊れ替え

9/26

Page 11: Oracle Database Standard EditionでセミオンラインDDL

1.テーブル複製(pt-osc)

空のテーブルを複製複製テーブルにalter table実施

10/26

Page 12: Oracle Database Standard EditionでセミオンラインDDL

2.トリガー作成(pt-osc)

新規更新はテーブルに複製テーブルへ更新するトリガー

insertやdelete時にIGNORE句がある-insertやupdate時にREPLACE句がある-

11/26

Page 13: Oracle Database Standard EditionでセミオンラインDDL

3.既存データコピー(pt-osc)

データを主キーごとのチャンクに分けて複製テーブルへコピー

12/26

Page 14: Oracle Database Standard EditionでセミオンラインDDL

4.テーブル⼊れ替え(pt-osc)

複製テーブルとテーブルを同時にRENAMERename table 'TEST_TABLE' to 'OLD_TEST_TABLE' , 'NEW_TEST_TABLE' to 'TEST_TABLE';

古いテーブルを削除する13/26

Page 15: Oracle Database Standard EditionでセミオンラインDDL

Oracle-semi-onlineDDLの簡単な概要

Oracle-semi-onlineDDLも⼤きく分けて4つの⼯程 1. テーブル複製 2. 既存データコピー 3. 新規更新のためのトリガー作成 4. テーブル⼊れ替え

14/26

Page 16: Oracle Database Standard EditionでセミオンラインDDL

1.テーブル複製(Oracle-semi-onlineDDL)

空のテーブルを複製複製テーブルにalter table実施

15/26

Page 17: Oracle Database Standard EditionでセミオンラインDDL

2.既存データコピー(Oracle-semi-onlineDDL)

テーブルにMaterialized View LogとMaterialized View作成複製テーブルに対して、Mviewのデータをごそっとコピーする

16/26

Page 18: Oracle Database Standard EditionでセミオンラインDDL

3.トリガー作成(Oracle-semi-onlineDDL)

Mviewに複製テーブルへ更新するトリガーを作成Mviewを⾼速リフレッシュをすることで複製テーブルに反映

17/26

Page 19: Oracle Database Standard EditionでセミオンラインDDL

3.トリガー作成(Oracle-semi-onlineDDL)

pt-oscの場合既存データコピーと新規更新のトリガーが同時に実⾏される-

Oracle-semi-onlineDDLの場合既存データコピーした後にMview⾼速リフレッシュすることで新規更新を反映

-

Mergeやヒント句のIGNORE̲ROW̲ON̲DUPKEY̲INDEXを使⽤することでpt-oscと同様の動作を考えた。

難しかったのでやめた

-

18/26

Page 20: Oracle Database Standard EditionでセミオンラインDDL

4.テーブル⼊れ替え(Oracle-semi-onlineDDL)

ここでアクセス不可な時間帯が発⽣

19/26

Page 21: Oracle Database Standard EditionでセミオンラインDDL

4.テーブル⼊れ替え(Oracle-semi-onlineDDL)

テーブルをREAD ONLYにする

ALTER TABLE ・・ READ ONLY;

20/26

Page 22: Oracle Database Standard EditionでセミオンラインDDL

4.テーブル⼊れ替え(Oracle-semi-onlineDDL)

Mviewの⾼速リフレッシュでREAD ONLY以前の差分を反映

exec dbms_mview.refresh('Mview','f');

21/26

Page 23: Oracle Database Standard EditionでセミオンラインDDL

4.テーブル⼊れ替え(Oracle-semi-onlineDDL)

Materialized View Logの削除

drop materialized view log ・・

22/26

Page 24: Oracle Database Standard EditionでセミオンラインDDL

4.テーブル⼊れ替え(Oracle-semi-onlineDDL)

テーブルのrename

ALTER TABLE 'TEST_TABLE' to RENAME TO 'OLD_TEST_TABLE';

23/26

Page 25: Oracle Database Standard EditionでセミオンラインDDL

4.テーブル⼊れ替え(Oracle-semi-onlineDDL)

複製テーブルのrename

ALTER TABLE 'NEW_TEST_TABLE' RENAME TO 'TEST_TABLE';

oldテーブルの削除24/26

Page 26: Oracle Database Standard EditionでセミオンラインDDL

まとめ

メリットどんなテーブルでも最⼩限の停⽌時間でDDL可能-テーブルやインデックスの断⽚化が解消される-

デメリット主キー必須-データ容量が対象のテーブルサイズの3倍が必要-やっぱり負荷が⾼い-

 github:kenken0807対応:インデックス作成、インデックス削除

25/26

Page 27: Oracle Database Standard EditionでセミオンラインDDL

ご清聴ありがとうございました。

26/26