IBM Support

[Db2] 表をコピーする方法

Question & Answer


Question

ある表のデータを同じデータベースの新しい表にコピーしたい場合、どのような方法がありますか。

Answer

同じ定義の新しい表を作成し、データをコピーする方法を紹介します。
Db2 9.7 以降であれば、ADMIN_MOVE_TABLE プロシージャーを呼び出して表のコピーができます。

以下、ソース表はコピー元の表、ターゲット表はコピー先の表を表します。

A. 新しい表を作成し、データをコピーする方法
  1. ターゲット表を作成
    CREATE TABLE の LIKE オプションを使用する方法と、 db2look ツールにて生成したソース表の DDL を使用する方法があります。
    a. CREATE TABLE の LIKE オプションを使用する方法
    $ db2 connect to <DB 名>
    $ db2 create table <ターゲット表> like <ソース表> in <表スペース名>
    注: 索引定義や制約などはコピーできません。ID 列やデフォルト値は INCLUDING オプションでコピーできます。

    b. db2look ツールで生成したソース表の DDL を使用する方法
    $ db2look -d <データベース名> -a -e -t <ソース表> -o <出力ファイル>
    出力ファイル中のオブジェクト名 (ソース表名、表スペース名など) をエディターで新しい名前に書き換えたのちに、以下の手順で表を作成します。
    $ db2 connect to <DB 名>
    $ db2 -tvf <出力ファイル>
  2. データをコピー
    INSERT SELECT を使用する方法と、カーソル LOAD を使用する方法があります。
    a. INSERT SELECT でコピーする方法
    $ db2 "insert into <ターゲット表> select * from <ソース表>"
    注: 表のデータ量が大きいと、大きなログ・スペースが必要です。必要に応じて 表作成時に NOT LOGGED INITIALLY パラメーターを使用してください。NOT LOGGED INITIALLY パラメーター使用時は、NOT LOGGED INITIALLY パラメーターによるロギングの低減 の考慮点をご確認ください。

    b. カーソル LOAD を使用する方法
    $ db2 "declare c1 cursor for select * from <ソース表>"
    $ db2 load from c1 of cursor replace into <ターゲット表>
    注: リカバリー可能 (LOGRETAIN または LOGARCHMETH1 により有効化) な DB の場合はバックアップ・ペンディングになるため、バックアップを取得してください。
    LOAD に COPY YES または NONRECOVERABLE を指定すると、バックアップ・ペンディングになりません。 

B. ADMIN_MOVE_TABLE プロシージャーを使用する方法

Db2 9.7 以降、ADMIN_MOVE_TABLE プロシージャーを呼び出して、オンラインで表のコピーができます。
移動先の表スペースを指定しない場合は同じ表スペース上に再作成され、さらに KEEP オプションを指定した場合は、元の表が名前を変えて残ります。
使用例
$ db2 "CALL SYSPROC.ADMIN_MOVE_TABLE('スキーマ名','ソース表','','KEEP','MOVE')"
以下は、スキーマ名 V97FP4 の表 ORG をコピーし、新たに表 NEW を作成する例です。
$ db2 "CALL SYSPROC.ADMIN_MOVE_TABLE('V97FP4','ORG','','KEEP','MOVE')"

  結果セット 1
 --------------

  KEY                              VALUE
  -------------------------------  ---------------------------
  AUTHID                           V97FP4
  CLEANUP_END                      2011-11-24-13.09.46.532704
  CLEANUP_START                    2011-11-24-13.09.46.078933
  COPY_END                         2011-11-24-13.09.40.069264
  COPY_OPTS                        ARRAY_INSERT,NON_CLUSTER
  COPY_START                       2011-11-24-13.09.39.385066
  COPY_TOTAL_ROWS                  9
  INDEXNAME
  INDEXSCHEMA
  INIT_END                         2011-11-24-13.09.39.139422
  INIT_START                       2011-11-24-13.09.32.749776
  ORIGINAL                         ORGAAAFRno
  REPLAY_END                       2011-11-24-13.09.45.345964
  REPLAY_START                     2011-11-24-13.09.40.074164
  REPLAY_TOTAL_ROWS                0
  REPLAY_TOTAL_TIME                1
  STATUS                           COMPLETE
  SWAP_END                         2011-11-24-13.09.45.973409
  SWAP_RETRIES                     0
  SWAP_START                       2011-11-24-13.09.45.661825
  VERSION                          09.07.0004

  21 レコードが選択されました。

  リターン状況 = 0

$ db2 rename table ORG TO NEW
$ db2 rename table \"ORGAAAFRno\" TO ORG

運用上の考慮点
ADMIN_MOVE_TABLE プロシージャーを使用する場合、以下の点を注意してください。
  • 同一表スペースに複数の移動を同時に行うことは避けてください。
  • 表に対するアクティビティーが少ないときに実行してください。
  • 異なるデータベースへ複数の表をコピーする場合は、 db2move ユーティリティーを利用できます。
    db2move ユーティリティーを使用したスキーマ・コピーの例

関連情報
[Db2] バックアップ・ペンディングの回復方法
CREATE TABLE ステートメント
CURSOR ファイル・タイプを使用したデータの移動
ADMIN_MOVE_TABLE プロシージャーによるオンラインでの表の移動


お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008RZsAAM","label":"Data Movement-\u003Eadmin_move_table"},{"code":"a8m500000008PlYAAU","label":"Database Objects-\u003ETables"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
02 November 2023

UID

swg21576312