ADMIN_MOVE_TABLE プロシージャーを使用したオンラインでの表の移動
ADMIN_MOVE_TABLE プロシージャーを使用すると、オンラインまたはオフラインでの移動を用いて表を移動できます。 コスト、スペース、移動のパフォーマンス、およびトランザクションのオーバーヘッドと比べて、可用性の重要性の方がより大きい場合には、オフラインの表移動ではなく、オンラインの表移動を使用します。
始める前に
表および索引のコピー、ステージング表、および追加のログ項目に対応できる十分なディスク・スペースがあることを確認してください。
このタスクについて
表をオンラインのまま移動する場合は、ストアード・プロシージャーを 1 回だけ呼び出すことも、複数回 (プロシージャーが実行する操作ごとに 1 回ずつ) 呼び出すこともできます。 複数回の呼び出しを行うと、移動のキャンセル、更新を行う際にターゲット表をオフラインにするタイミングの制御などの追加オプションを選択できます。
SYSPROC.ADMIN_MOVE_TABLE プロシージャーを呼び出すと、ソース表のシャドー・コピーが作成されます。 このコピー・フェーズでは、トリガーを使用してソース表への変更 (更新、挿入、または削除) がキャプチャーされ、ステージング表に書き込まれます。 コピー・フェーズが完了すると、ステージング表にキャプチャーされた変更内容がシャドー・コピーに再生されます。 その後、ストアード・プロシージャーはソース表を短期間オフラインにして、ソース表名と索引名をシャドー・コピーとその索引に割り当てます。 その後、シャドー表がソース表に置き換わってオンラインになります。 デフォルトでは、ソース表はドロップされますが、KEEP オプションを使用すると、別の名前でそれを保持できます。
索引 (特にユニーク索引) がない表でオンラインの移動を実行することは避けてください。 ユニーク索引がない表をオンライン移動するとデッドロックが生じる可能性があり、再生が複雑またはコストが高くなる場合があります。
ソース表に対して競合するロックをかけるアプリケーションは SQL0911N 理由コード 68 で失敗する可能性があります。ロック・タイムアウトが競合する場合、ADMIN_MOVE_TABLE の方が正常に実行される可能性が高いからです。 SWAP 操作中にデッドロックが発生しないようにするには、FORCE_ALL オプションを使用できます。 詳細については、FORCE_ALL を参照してください。
プロシージャー
表をオンラインで移動するには、以下のようにします。
例
CALL SYSPROC.ADMIN_MOVE_TABLE(
'SVALENTI',
'T1',
'ACCOUNTING',
'ACCOUNTING',
'ACCOUNTING',
'',
'',
'',
'',
'',
'MOVE')
CALL SYSPROC.ADMIN_MOVE_TABLE(
'EBABANI',
'T1',
'ACCOUNTING',
'ACCOUNTING',
'ACCOUNTING',
'',
'',
'',
'',
'KEEP, COPY_USE_LOAD,LOAD_MSGPATH "/home/ebabani"',
'MOVE')
CALL SYSPROC.ADMIN_MOVE_TABLE(
'SVALENTI',
'T1',
'',
'',
'',
'',
'',
'',
'C1 VARCHAR(1000), C2 INT(5), C3 CHAR(5), C4 CLOB',
'',
'MOVE')
CREATE TABLE T1(C1 BIGINT,C2 BIGINT,C3 CHAR(20),C4 DEC(10,2),C5 TIMESTAMP,C6 BIGINT
GENERATED ALWAYS AS (C1+c2),C7 GRAPHIC(10),C8 VARGRAPHIC(20),C9 XML
この表を、列 C5 および C6 をドロップして、同じ表スペース内で移動させます。CALL SYSPROC.ADMIN_MOVE_TABLE(
'SVALENTI',
'T1',
'',
'',
'',
'',
'',
'',
'c1 BIGINT,c2 BIGINT ,c3 CHAR(20),c4 DEC(10,2),c7 GRAPHIC(10),c8 VARGRAPHIC(20),c9 XML',
'',
'MOVE')
CREATE TABLE "EBABANI "."T1" (
"I1" INTEGER ,
"I2" INTEGER )
DISTRIBUTE BY HASH("I1")
PARTITION BY RANGE("I1")
(PART "PART0" STARTING(0) ENDING(100) IN "TS1",
PART "PART1" STARTING(101) ENDING(MAXVALUE) IN "TS2");
スキーマ EBABANI の T1 表を、TS3 表スペースに移動します。 パーティション定義を指定します。DB2 "CALL SYSPROC.ADMIN_MOVE_TABLE
('EBABANI',
'T1',
'TS3',
'TS3',
'TS3',
'',
'',
'(I1) (STARTING 0 ENDING 100 IN TS1 INDEX IN TS1 LONG IN TS1,
STARTING 101 ENDING MAXVALUE IN TS3 INDEX IN TS3 LONG IN TS3)',
'',
'',
'MOVE')"