ADMIN_MOVE_TABLE プロシージャーを使用したオンラインでの表の移動

ADMIN_MOVE_TABLE プロシージャーを使用すると、オンラインまたはオフラインでの移動を用いて表を移動できます。 コスト、スペース、移動のパフォーマンス、およびトランザクションのオーバーヘッドと比べて、可用性の重要性の方がより大きい場合には、オフラインの表移動ではなく、オンラインの表移動を使用します。

始める前に

表および索引のコピー、ステージング表、および追加のログ項目に対応できる十分なディスク・スペースがあることを確認してください。

このタスクについて

表をオンラインのまま移動する場合は、ストアード・プロシージャーを 1 回だけ呼び出すことも、複数回 (プロシージャーが実行する操作ごとに 1 回ずつ) 呼び出すこともできます。 複数回の呼び出しを行うと、移動のキャンセル、更新を行う際にターゲット表をオフラインにするタイミングの制御などの追加オプションを選択できます。

SYSPROC.ADMIN_MOVE_TABLE プロシージャーを呼び出すと、ソース表のシャドー・コピーが作成されます。 このコピー・フェーズでは、トリガーを使用してソース表への変更 (更新、挿入、または削除) がキャプチャーされ、ステージング表に書き込まれます。 コピー・フェーズが完了すると、ステージング表にキャプチャーされた変更内容がシャドー・コピーに再生されます。 その後、ストアード・プロシージャーはソース表を短期間オフラインにして、ソース表名と索引名をシャドー・コピーとその索引に割り当てます。 その後、シャドー表がソース表に置き換わってオンラインになります。 デフォルトでは、ソース表はドロップされますが、KEEP オプションを使用すると、別の名前でそれを保持できます。

索引 (特にユニーク索引) がない表でオンラインの移動を実行することは避けてください。 ユニーク索引がない表をオンライン移動するとデッドロックが生じる可能性があり、再生が複雑またはコストが高くなる場合があります。

ソース表に対して競合するロックをかけるアプリケーションは SQL0911N 理由コード 68 で失敗する可能性があります。ロック・タイムアウトが競合する場合、ADMIN_MOVE_TABLE の方が正常に実行される可能性が高いからです。 SWAP 操作中にデッドロックが発生しないようにするには、FORCE_ALL オプションを使用できます。 詳細については、FORCE_ALL を参照してください。

プロシージャー

表をオンラインで移動するには、以下のようにします。

  1. 以下のいずれかの方法で ADMIN_MOVE_TABLE プロシージャーを呼び出します。
    • ADMIN_MOVE_TABLE プロシージャーを一度呼び出します。その際、少なくともソース表のスキーマ名、ソース表名、および操作タイプとして MOVE を指定します。 例えば、同じ表スペース内の既存の表にデータを移動するには、以下の構文を使用します。
      CALL SYSPROC.ADMIN_MOVE_TABLE (
      'schema name',
      'source table',
      '',
      '',
      '',
      '',
      '',
      '',
      '',
      '',
      'MOVE')
    • ADMIN_MOVE_TABLE プロシージャーを、操作ごとに一度ずつ、複数回呼び出します。その際、少なくともソース表のスキーマ名、ソース表名、および操作名を指定します。 例えば、同じ表スペース内の新しい表にデータを移動するには、以下の構文を使用します。
      CALL SYSPROC.ADMIN_MOVE_TABLE (
      'schema name',
      'source table',
      '',
      '',
      '',
      '',
      '',
      '',
      '',
      '',
      'operation name')
      ここで、operation name は INIT、COPY、REPLAY、VERIFY、または SWAP のいずれかの値です。 これらの操作の順序でプロシージャーを呼び出す必要があります。例えば、最初の呼び出しでは操作名として INIT を指定しなければなりません。
      注: VERIFY 操作にはコストがかかります。この操作は、表移動に必要な場合にのみ実行してください。
  2. オンライン移動が失敗する場合、再実行してください。
    1. 表の移動が失敗する原因となる問題を修正します。
    2. 表移動が失敗した際に進行中だったステージを判別します。そのためには、SYSTOOLS.ADMIN_MOVE_TABLE プロトコル表で状況を照会します。
    3. ストアード・プロシージャーを再び呼び出します。その際、適切なオプションを指定します。
      • プロシージャーの状況が INIT の場合、INIT オプションを使用します。
      • プロシージャーの状況が COPY の場合、COPY オプションを使用します。
      • プロシージャーの状況が REPLAY の場合、REPLAY または SWAP オプションを使用します。
      • プロシージャーの状況が CLEANUP の場合、CLEANUP オプションを使用します。
    オンラインの表移動の状況が COMPLETED または CLEANUP ではない場合、ストアード・プロシージャーに CANCEL オプションを指定すると移動をキャンセルできます。

例 1: スキーマ SVALENTI にある T1 表を、T1 をオフラインにすることなく ACCOUNTING 表スペースに移動させます。 新しい表スペースに表を移動させるため、DATA、INDEX、および LONG の各表スペースを指定します。
CALL SYSPROC.ADMIN_MOVE_TABLE( 
'SVALENTI', 
'T1', 
'ACCOUNTING',
'ACCOUNTING',
'ACCOUNTING',
'', 
'', 
'', 
'',
'',
'MOVE')   
例 2: スキーマ EBABANI の T1 表を、T1 をオフラインにすることなく ACCOUNTING 表スペースに移動させ、移動後も元の表のコピーを保持します。 COPY_USE_LOAD および LOAD_MSGPATH オプションを使用して、ロード・メッセージ・ファイル・パスを指定します。 新しい表スペースに表を移動させるため、DATA、INDEX、および LONG の各表スペースを指定します。 元の表は、'EBABANI'.'T1AAAAVxo' のような名前で保持されます。
CALL SYSPROC.ADMIN_MOVE_TABLE( 
'EBABANI', 
'T1', 
'ACCOUNTING',
'ACCOUNTING',
'ACCOUNTING',
'', 
'', 
'', 
'',
'KEEP, COPY_USE_LOAD,LOAD_MSGPATH "/home/ebabani"',
'MOVE')
例 3: T1 表を同じ表スペース内で移動させます。 T1 の列 C1 は、非推奨のデータ・タイプ LONG VARCHAR を使用しているので、互換性のあるデータ・タイプを使用するように変更します。
CALL SYSPROC.ADMIN_MOVE_TABLE(
'SVALENTI',
'T1',
'',
'',
'',
'',
'',
'',
'C1 VARCHAR(1000), C2 INT(5), C3 CHAR(5), C4 CLOB',
'',
'MOVE')
注: この操作中に列名を変更することはできません。
例 4: 以下のステートメントによって作成された T1 表があります。
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')   
例 5: 表スペース TS1 および TS2 で 2 つの範囲が定義されている範囲パーティション表があります。 表を表スペース TS3 に移動しますが、最初の範囲は TS1 に残します。
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')"