すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DRDS モードのデータベースから AUTO モードのデータベースへの変換

最終更新日:Mar 29, 2026

PolarDB-X を使用すると、既存の Distributed Relational Database Service (DRDS) モードのデータベースを、単一の SQL ステートメント — いずれかの CREATE DATABASE LIKE(スキーマのみ)または CREATE DATABASE AS(スキーマおよびデータ)— を使用して、AUTO モードのデータベースに変換できます。ソース DRDS データベースはプロセス全体で保持され、その横に新しい送信先 AUTO データベースが作成されるため、ソースの廃止前に結果を検証し、必要に応じてロールバックできます。

ステートメントの選択

CREATE DATABASE LIKECREATE DATABASE AS
テーブルスキーマの変換はいはい
テーブルデータのコピーいいえはい
標準的な所要時間約 10 分 (スキーマのみ)約 10 分 37 秒 (44 GB、4 テーブル x 5,000 万行)
使用シナリオ完全移行をコミットする前にスキーマ変換の結果を検証する場合スキーマとデータの完全移行を実行する場合

前提条件

開始する前に、以下を確認してください。

  • バージョン 5.4.16-16717637 以降を実行している PolarDB-X インスタンス。バージョンの確認方法については、「インスタンスのバージョン表示」をご参照ください

  • 十分なストレージの空き容量。ストレージが不足している場合、変換は失敗します

注意事項

  • 変換中、PolarDB-X はソースの DRDS データベースに読み取りロックを適用します。データベースは読み取り専用になり、変換が完了するまで DML または DDL ステートメントを実行できなくなります。ビジネスの中断を避けるため、オフピーク時間またはテスト環境で変換をスケジュールしてください。

  • 変換中にソースの DRDS データベースまたはターゲットの AUTO データベースのいずれかに対して DML または DDL ステートメントを実行しないでください。実行すると、変換は失敗します。

  • ソースの DRDS データベースは変換後も保持されます。新しいターゲットの AUTO データベースが並行して作成されるため、結果を検証し、必要に応じてソースを廃止する前にロールバックできます。

構文

CREATE DATABASE [IF NOT EXISTS] auto_database_name
{ LIKE | AS } drds_database_name
[convert_option_list]

convert_option_list:
    convert_option [convert_option...] [{ include_list | exclude_list }]

convert_option:
      mode=auto
    | dry_run={ true | false }
    | lock={ true | false }
    | create_tables={ true | false }

include_list:
    include=table_name [,table_name...]

exclude_list:
    exclude=table_name [,table_name...]

パラメーター

パラメーター説明デフォルト値
auto_database_name作成するターゲット AUTO データベースの名前です。
drds_database_nameソース DRDS データベースの名前です。
modeターゲットデータベースのデータベースモードです。auto を指定します。
dry_runtrue を指定すると、テーブルの作成やデータのコピーを行わず、スキーマ変換結果をプレビューできます。ドライラン実行中は、ソースデータベースはロックされません。false を指定すると、実際の変換を実行します。false
locktrue を指定すると、変換中にソース DRDS データベースに読み取りロックを適用し、ソースとターゲット間のデータ整合性を保ちます。false を指定するとロックをスキップします。この設定は、ドライランまたはテスト環境でのみ使用してください。本番環境における移行では、ロックをスキップするとソースとターゲット間でデータの不整合が発生するため、使用しないでください。true
create_tablestrue を指定すると、PolarDB-X がターゲット AUTO データベースに対してテーブルスキーマを自動的に変換・作成します。false を指定すると、パーティションスキームを完全制御できます。この場合、事前にターゲット AUTO データベースおよびすべてのテーブル(ソースのテーブル名およびカラム定義と一致するように)を手動で作成したうえで、PolarDB-X はデータのみをコピーします。true
include指定したテーブルのみを変換します。
exclude指定したテーブルを変換から除外します。

データベースの変換

以下の例では、最も一般的なシナリオについて説明します。すべての例で、ソース DRDS データベースとして db_drds を、送信先 AUTO データベースとして db_auto を使用します。

スキーマのみを変換 (データなし)

完全移行を実行する前に、AUTO モードでテーブルスキーマがどのように表示されるかを検証したい場合に、CREATE DATABASE LIKE を使用します。

CREATE DATABASE db_auto LIKE db_drds mode=auto;

期待される出力:

+-------------+
| RESULT      |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (10 min 32.17 sec)

スキーマの変換とデータのコピー

完全移行を実行するには、CREATE DATABASE AS を使用します。

CREATE DATABASE db_auto AS db_drds mode=auto;

期待される出力:

+-------------+
| RESULT      |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (10 min 37.30 sec)

特定のテーブルを既存のターゲットデータベースに移行

ターゲットデータベース db_auto_exist が既に存在する場合、IF NOT EXISTS を使用して、データベースを再作成することなくテーブル tb1 を追加します。

CREATE DATABASE IF NOT EXISTS db_auto_exist AS db_drds include=tb1;

期待される出力:

+-------------+
| RESULT      |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (8 min 12.05 sec)

変更を加えずにスキーマ変換をプレビュー

dry_run=true を設定すると、DRDS スキーマが AUTO スキーマにどのようにマップされるかをプレビューできます。テーブルは作成されず、データもコピーされません。ソースデータベースはロックされません。

CREATE DATABASE db_auto LIKE db_drds dry_run=true include=tb1,tb2;

期待される出力:

+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE_TABLE_DRDS                                                                                                                                                                                                                                   | CREATE_TABLE_AUTO                                                                                                                                                                                                                                              |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb1   | CREATE TABLE `tb1` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`id`) | CREATE TABLE `tb1` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32 |
| tb2   | CREATE TABLE `tb2` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`id`) | CREATE TABLE `tb2` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.04 sec)

事前に作成されたターゲットデータベースにデータをコピー

送信先のパーティション スキームを完全に制御したい場合は、create_tables=false を設定します。ソースと同じテーブル名および列定義を持つ db_auto およびすべてのテーブルを事前に作成し、次のコマンドを実行します:

CREATE DATABASE db_auto AS db_drds create_tables=false;

PolarDB-X はデータをコピーしますが、データベースやテーブルは作成しません。

期待される出力:

+-------------+
| RESULT      |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (5 min 47.75 sec)

変換進捗の監視 (大規模データベース向け)

変換に相当な時間がかかる大規模なデータベースの場合、タスクが実行されている間に INFORMATION_SCHEMA.CREATE_DATABASE ビューを使用して進行状況を追跡します。

SELECT * FROM INFORMATION_SCHEMA.CREATE_DATABASE WHERE TARGET_SCHEMA = 'db_auto'\G

出力例:

*************************** 1. row ***************************
             DDL_JOB_ID: 1547426040408715264
          SOURCE_SCHEMA: db_drds
          TARGET_SCHEMA: db_auto
              TABLE/SEQ: tb1
                  STAGE: BACKFILL
                 STATUS: RUNNING
                 DETAIL: NULL
                SQL_SRC: CREATE TABLE `tb1` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`id`)
                SQL_DST: CREATE TABLE IF NOT EXISTS `tb1` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32
    BACKFILL_START_TIME: 2023-01-01 19:13:01
CURRENT_SPEED(ROWS/SEC): 37632
AVERAGE_SPEED(ROWS/SEC): 216064
          FINISHED_ROWS: 216064
 APPROXIMATE_TOTAL_ROWS: 1
      BACKFILL_PROGRESS: 100%
*************************** 2. row ***************************
             DDL_JOB_ID: 1547426040408715264
          SOURCE_SCHEMA: db_drds
          TARGET_SCHEMA: db_auto
              TABLE/SEQ: tb2
                  STAGE: BACKFILL
                 STATUS: RUNNING
                 DETAIL: NULL
                SQL_SRC: CREATE TABLE `tb2` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`id`)
                SQL_DST: CREATE TABLE IF NOT EXISTS `tb2` (
        `id` int(11) NOT NULL,
        `k` int(11) NOT NULL DEFAULT '0',
        `c` char(120) NOT NULL DEFAULT '',
        `pad` char(60) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32
    BACKFILL_START_TIME: 2023-01-01 19:13:01
CURRENT_SPEED(ROWS/SEC): 36608
AVERAGE_SPEED(ROWS/SEC): 211968
          FINISHED_ROWS: 211968
 APPROXIMATE_TOTAL_ROWS: 1
      BACKFILL_PROGRESS: 100%
2 rows in set (0.01 sec)

DDL ジョブのステータスの概要をすばやく取得するには、以下を実行します。

SHOW FULL DDL;

タスクが完了する前に接続が閉じられた場合、変換は実行を続けます。再接続後に SHOW DDL RESULT を実行して、最終結果を確認してください。

パフォーマンスのリファレンス:8 コア、64 GB メモリ、4 台のコンピュートノード、および 4 台のストレージノードを備えたインスタンスで、4 つのテーブル(各テーブルに 5,000 万行あり、合計約 44 GB)を持つデータベースを変換するのに要する時間は、約 10 分 37 秒です。実際の持続時間は、インスタンスタイプおよびデータベースサイズによって異なります。現実的な見積もりを得るには、lock=false を指定して、非ピーク時間帯にテスト変換を実行してください。

スキーマ変換ルール (リファレンス)

完全移行を実行する前に、これらのルールを確認して、自動変換されたスキーマが要件を満たしていることを検証してください。

単一テーブルとブロードキャストテーブル

DRDS モードの単一テーブルとブロードキャストテーブルは、どちらも AUTO モードのブロードキャストテーブルに変換されます。

シャードテーブル

シャーディング関数のマッピング

DRDS シャーディング関数タイプDRDS モードのシャーディング関数AUTO モードのパーティショニング関数
ハッシュhash(a)key(a)
str_hash(a, startIdx, endIdx)key(a)
uni_hash(a)key(a)
right_shift(a)key(a)
range_hash(a, b, 10)co_hash(right(a,n), right(b,n))
日付と時刻YYYYMM(a)hash(to_months(a))
YYYYWEEK(a)hash(to_weeks(a))
YYYYDD(a)hash(to_days(a))
MM(a)range(month(a))
DD(a)range(dayofmonth(a))
WEEK(a)range(dayofweek(a))
MMDD(a)range(dayofyear(a))

シャーディングシナリオの例

以下の例は、PolarDB-X が各シャーディングシナリオをどのように変換するかを示しています。

*データベースシャーディングのみ (テーブルパーティショニングなし)*

データベースシャーディング関数は、パーティショニング関数にマッピングされます。結果は 1 レベルのパーティションを持ちます。

-- DRDS モード
CREATE TABLE tb1 (
  id INT,
  name VARCHAR(20)
) dbpartition BY uni_hash(id);

-- AUTO モード (変換後)
CREATE TABLE tb1 (
  id INT,
  name VARCHAR(20)
) PARTITION BY KEY(id);

*テーブルパーティショニングのみ (データベースシャーディングなし)*

テーブルシャーディング関数は、パーティショニング関数にマッピングされます。結果は 1 レベルのパーティションを持ちます。

-- DRDS モード
CREATE TABLE tb3 (
  id INT,
  dt DATE
) tbpartition BY week(dt) tbpartitions 4;

-- AUTO モード (変換後)
CREATE TABLE tb3 (
  id INT,
  dt DATE
) PARTITION BY RANGE (dayofweek(`dt`)) (
  PARTITION p2 VALUES LESS THAN (2),
  PARTITION p3 VALUES LESS THAN (3),
  PARTITION p4 VALUES LESS THAN (4),
  PARTITION p5 VALUES LESS THAN (5),
  PARTITION p6 VALUES LESS THAN (6),
  PARTITION pd VALUES LESS THAN MAXVALUE
);

*同じルールを使用したデータベースシャーディングとテーブルパーティショニング*

両方のシャーディング関数は、単一のパーティショニング関数にマッピングされます。パーティションの数は、データベースシャード数 x テーブルシャード数に等しくなります。結果は 1 レベルのパーティションを持ちます。

-- DRDS モード
CREATE TABLE tb2 (
  buyer_id VARCHAR(20),
  order_id VARCHAR(20)
) dbpartition BY range_hash(buyer_id, order_id, 10)
  tbpartition BY range_hash(buyer_id, order_id, 10) tbpartitions 4;

-- AUTO モード (変換後)
CREATE TABLE tb2 (
  buyer_id VARCHAR(20),
  order_id VARCHAR(20)
) PARTITION BY co_hash(right(buyer_id, 10), right(order_id, 10)) PARTITIONS 64;

*異なるルールを使用したデータベースシャーディングとテーブルパーティショニング*

データベースシャーディング関数はレベル 1 のパーティション関数になり (レベル 1 パーティション数 = データベースシャード数)、テーブルシャーディング関数はレベル 2 のパーティション関数になります (レベル 2 パーティション数 = テーブルシャード数)。結果は 2 レベルのパーティションを持ちます。

-- DRDS モード
CREATE TABLE tb5 (
  buyer_id VARCHAR(20),
  order_id VARCHAR(20)
) dbpartition BY hash(buyer_id)
  tbpartition BY hash(order_id) tbpartitions 4;

-- AUTO モード (変換後)
CREATE TABLE tb5 (
  buyer_id VARCHAR(20),
  order_id VARCHAR(20)
) PARTITION BY KEY(buyer_id) PARTITIONS 16
  SUBPARTITION BY KEY(order_id) SUBPARTITIONS 4;

シーケンス変換ルール

DRDS モードのグループシーケンス、時間ベースのシーケンス (TIME)、および SIMPLE シーケンスはすべて、AUTO モードの新しいシーケンスに変換されます。これは、全体的により優れたパフォーマンスを提供します。詳細については、「シーケンス」をご参照ください。

変換の制約

  • 送信先の AUTO データベースの CHARSET および COLLATE は、ソースの DRDS データベースと一致します。CREATE DATABASE LIKE または CREATE DATABASE ASCHARSET または COLLATE を指定することはサポートされていません。

  • ソース DRDS データベースとそのテーブルの LOCALITY 属性は、送信先 AUTO データベースに引き継がれません。詳細については、「LOCALITY 属性を使用してデータノードを指定する (DRDS モード)」をご参照ください。

次のステップ