#はじめに
こんにちは。
今回は、Oracle(11gR2)が提供している、オンライン再定義パッケージ(DBMS_REDEFINITINONパッケージ)を使って、
ハマった話と、ハマってる最中に知ったマテリアライズドビューの裏仕様について語りたいと思います。
ハマっていた時にこのあたりの情報がネット上にまるでなかったので、
同じようにハマっている方が世にいればその助けになればと思います。
#やろうとしたこと
私が担当しているシステムでは長年の運用によってデータ量が肥大してしまい、
オンラインアプリのパフォーマンスが劣化してしまっていました。
DBMS_REDEFINITINONパッケージを使い、とあるキー(仮にCLIENT_IDとします)で並び変えて再定義すると、
「パフォーマンスが大幅に向上するぜ!」とDBAさんから提案を受けたので、
「よっしゃ!やりましょう」となりました。
(オンラインアプリで使用しているSQLの大半はCLIENT_IDを検索キーとして使用しているので、
同一CLIEND_IDのレコードを近いブロックに寄せておくことで、検索時の読み取りブロック数を減らすという目論み)
#私たちが立てたの再定義の大まかな手順
①DBMS_REDEFINITION.CAN_REDEF_TABLEで対象のテーブルがオンライン再定義が可能か確認する。
②DBMS_REDEFINITION.START_REDEF_TABLEで対象のテーブルの仮表を作成してデータコピーする。
(この時にオプションを指定してCLIENT_ID順に並び替える)
③DBMS_REDEFINITION.COPY_TABLE_DEPENDENTSで対象のテーブルの依存オブジェクト(制約やインデックスなど)を仮表にコピーする。
④DBMS_REDEFINITION.SYNC_INTERIM_TABLEで15分毎に適宜、対象のテーブルから仮表へデータ同期を行う。
(この間に一週間程度かけて、オンラインアプリで実行されるSQLを仮表に対して実行して実行計画に問題がないかを確認)
⑤DBMS_REDEFINITION.FINISH_REDEF_TABLEで元表と仮表の名前を入れ替えてオンライン再定義を完了させる。
※⑤を実施するときはその後の関連作業があるため、サービス停止。
(この時点で「オンライン再定義」ではないですがw)
#仮表はマテリアライズドビューとして作成される
DBMS_REDEFINITION.START_REDEF_TABLEで作成された仮表はマテリアライズドビュー(以下マテビュー)として作成されます。
そして、DBMS_REDEFINITION.SYNC_INTERIM_TABLEで実施されるデータ同期は
マテリアライズドビューの高速リフレッシュと同じ仕組みのようです。
#マテリアライズドビューは現システムで運用実績あり!しかしデータ同期でハマる!
オンライン再定義の対象としていたテーブルは、今回4テーブルだったのですが、
全て、これらのテーブルをマスタ表とするマテビューを作成していて、
日々の高速リフレッシュを含めた運用実績があったため、
オンライン再定義中のデータ同期も問題なく終わると思ってました。
しかし、当日、落とし穴が待っていました。。。
手順の①~③までは順調に消化、一回手動で「DBMS_REDEFINITION.SYNC_INTERIM_TABLE」実行してみることになりました。
このとき溜まっていたマテリアライズドビュー・ログ(以下MLOG)は15,000件程度、
これまでの経験から、「まあ、1分くらいで終わるっしょ!」と
タカをくくっていましたが、終わらない。。。
結局、完了するのに30分かかりました。
先程お話しした通り、対象のテーブルをマテビューで他システムに連携している関係上、
限られた時間の中でオンライン再定義完了→他システムのマテビューの再作成を行わなければならないため、
この同期にかかる時間は死活問題で、この程度の件数でこんな時間かかってしまっては。。。
ということでオンライン再定義計画は頓挫してしまいました。。。
(次回に続く)
https://qiita.com/terry_carp/items/93a6c0f911fae1e9960a