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

PolarDB:DRDSモードのデータベースをAUTOモードのデータベースに変換する

最終更新日:Sep 18, 2024

このトピックでは、分散リレーショナルデータベースサービス (DRDS) モードのデータベースをAUTOモードのデータベースに変換する方法について説明します。

背景情報

PolarDB-Xを使用すると、CREATE DATABASE LIKEまたはCREATE DATABASE ASステートメントを実行して、DRDSモードのデータベースをAUTOモードのデータベースに変換できます。 AUTOモードおよびDRDSモードのデータベースについては、「AUTOモードおよびDRDSモードのデータベース」をご参照ください。 以下のセクションでは、変換されるDRDSモードのデータベースをソースDRDSデータベースと呼び、変換後のAUTOモードのデータベースをターゲットAUTOデータベースと呼びます。

  • CREATE DATABASE LIKEステートメントを実行すると、PolarDB-XはソースDRDSデータベースのテーブルのスキーマのみを変換し、テーブルデータはコピーしません。

  • CREATE DATABASE ASステートメントを実行すると、PolarDB-XはソースDRDSデータベースのテーブルのスキーマを変換し、テーブルデータをコピーします。

前提条件

ソースDRDSデータベースが属するPolarDB-Xインスタンスのバージョンは、5.4.16-16717637以降です。 PolarDB-Xインスタンスのバージョンを表示する方法の詳細については、「インスタンスのバージョンの表示」をご参照ください。

使用上の注意

  • 変換中、ソースDRDSデータベースに読み取りロックが適用され、読み取り専用になります。 読み取り専用状態では、変換が完了するまで、ソースDRDSデータベースでDMLステートメントまたはDDLステートメントを実行できません。 したがって、データベースを変換する前に、変換がビジネスに影響しないことを確認してください。

  • 変換中は、ソースDRDSデータベースまたはターゲットAUTOデータベースでDMLステートメントまたはDDLステートメントを実行しないことをお勧めします。 それ以外の場合、変換は失敗します。

  • 変換中、ソースDRDSデータベースは削除または上書きされません。 代わりに、ソースDRDSデータベースに基づいて新しい宛先AUTOデータベースが作成されます。 変換が完了した後も、ソースDRDSデータベースにアクセスできます。

  • データベースを変換する前に、残りの容量が十分であることを確認してください。 残りのスペース容量が不十分な場合、変換は失敗します。

構文

CREATE DATABASE [IF NOT EXISTS] auto_database_name
as
drds_database_name
[covert_option_list]

covert_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...]

Parameters

パラメーター

説明

auto_database_name

作成する宛先AUTOデータベースの名前。

drds_database_name

ソースDRDSデータベースの名前。 DRDSモードで有効なデータベースの名前を入力します。

モード

作成されたデータベースのモード。 値をautoに設定します。

dry_run

変換プロセスのドライ実行モードを有効にするかどうかを指定します。 dry_runモードでは、ソースDRDSデータベースのテーブルのスキーマとAUTOモードのテーブルのスキーマを表示できます。 PolarDB-Xがデータベースを変換する方法の詳細については、「スキーマ変換ルール」をご参照ください。

有効な値:

  • true: 変換プロセスのdry_runモードを有効にします。

  • false: 変換プロセスのdry_runモードを無効にします。 デフォルト値です。

説明
  • dry_runパラメーターは、DRDSモードのテーブルスキーマをAUTOモードのテーブルスキーマに変換する方法を表示するためにのみ使用されます。 ドライラン中は、テーブルスキーマは作成されず、テーブルデータはコピーされません。

  • dry_runパラメーターをtrueに設定した場合、ソースDRDSデータベースは影響を受けません。 たとえば、ソースDRDSデータベースは読み取り専用になりません。

ロック

変換中にソースDRDSデータベースに読み取りロックを適用するかどうかを指定します。 読み取りロックが適用されると、ソースDRDSデータベースは読み取り専用になり、ソースDRDSデータベースでDMLまたはDDLステートメントを実行できなくなります。

有効な値:

  • true: ソースDRDSデータベースに読み取りロックを適用します。 デフォルト値です。

  • false: ソースDRDSデータベースから読み取りロックを削除します。

    重要

    このパラメーターをfalseに設定すると、ソースDRDSデータベースとターゲットAUTOデータベースの間でデータの不一致が発生します。

create_tables

変換時にターゲットAUTOデータベースにテーブルスキーマを作成するかどうかを指定します。

有効な値:

  • true: true: create_tablesをtrueに設定すると、PolarDB-Xは自動的にテーブルスキーマを変換し、ターゲットAUTOデータベースにテーブルを作成します。 デフォルト値です。

  • false: create_tablesをfalseに設定した場合、事前にターゲットAUTOデータベースを作成し、ソースDRDSデータベース内のすべてのテーブルに対応するテーブルをターゲットAUTOデータベースに作成する必要があります。

    説明
    • PolarDB-Xによって自動的に変換されたテーブルがシナリオに適用されない場合は、create_tablesパラメーターを無効にし、ビジネス要件に基づいてターゲットAUTOデータベースとテーブルを作成できます。 ターゲットAUTOデータベースのテーブルは、ソースDRDSデータベースのテーブルと同じテーブル名と列定義を持つ必要があります。 移行先のAUTOデータベースでパーティションモードをカスタマイズできます。

    • create_tablesパラメーターがfalseに設定されている場合、create DATABASE ASステートメントを実行すると、PolarDB-XはソースDRDSデータベースからターゲットAUTOデータベースにのみデータをコピーし、ターゲットAUTOデータベースまたはテーブルは作成しません。

含む

ソースDRDSデータベースで変換されるテーブルのスキーマ。 includeパラメーターを設定すると、includeパラメーターで指定されたテーブルのスキーマのみが変換されます。

除外

ソースDRDSデータベースで変換されないテーブルのスキーマ。 excludeパラメーターを設定した場合、excludeパラメーターで指定されたテーブルのスキーマは変換されません。

  • 次のステートメントを実行して、DRDSモードのdb_drdsという名前のデータベースをAUTOモードのdb_autoという名前のデータベースに変換します。 この文を実行すると、db_drdsデータベース内のテーブルのスキーマのみが変換され、テーブルデータはコピーされません。

    CREATE DATABASE db_auto like db_drds mode=auto;

    次の出力が返されます。

    +-------------+
    | RESULT      |
    +-------------+
    | ALL SUCCESS |
    +-------------+
    1 row in set (10 min 32.17 sec)
  • 次のステートメントを実行して、DRDSモードのdb_drdsという名前のデータベースをAUTOモードのdb_autoという名前のデータベースに変換します。 この文を実行すると、db_drdsデータベース内のテーブルのスキーマが変換され、テーブルデータがコピーされます。

    CREATE DATABASE db_auto as db_drds mode=auto;

    次の出力が返されます。

    +-------------+
    | RESULT      |
    +-------------+
    | ALL SUCCESS |
    +-------------+
    1 row in set (10 min 37.30 sec)
  • 次のステートメントを実行して、DRDSモードのデータベースdb_drds内のtb1テーブルを、既に存在するターゲットAUTOデータベースに移行します。 この文を実行すると、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)
  • 次のステートメントを実行して、ソースDRDSデータベースのtb1テーブルとtb2テーブルのスキーマ、および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)
  • 次のステートメントを実行して、ソースDRDSデータベースからターゲットAUTOデータベースにデータをコピーします。 この文を実行すると、変換は実行されません。 宛先のAUTOデータベースと対応するテーブルを事前に作成する必要があります。 ターゲットAUTOデータベースのテーブルの定義は、ソースDRDSデータベースのテーブルの定義と同じである必要があります。

    CREATE DATABASE db_auto as db_drds create_tables=false;

    次の出力が返されます。

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

コンバージョンの進行状況と結果の表示

PolarDB-Xでは、INFORMATION_SCHEMA.CREATE_DATABASEビューを使用して、変換の進行状況と結果を表示できます。 たとえば、次のSQL文を実行して、ターゲットAUTOデータベースがdb_autoである変換タスクの進行状況を表示できます。

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)

PolarDB-Xでは、SHOW FULL DDL文を実行して変換の進行状況を確認できます。

時間のかかる変換タスクの場合、接続が閉じていて、返された結果を表示できない場合は、SHOW DDL RESULTステートメントを実行して変換結果を表示できます。 接続が閉じている場合、変換タスクは引き続き実行されます。 INFORMATION_SCHEMA.CREATE_DATABASEビューを使用して、より詳細な結果を表示することもできます。

変換にかかる時間

この時間は主に、データがソースDRDSデータベースから宛先AUTOデータベースにコピーされる期間に費やされます。 たとえば、専用仕様が8コア、64 GBのメモリ、4つの計算ノード、4つのストレージノードを持つPolarDB-Xインスタンスでは、Sysbenchテストを参照してDRDSデータベースを作成します。 データベースには4つのテーブルがあり、各テーブルには5,000万行のデータがあります。 総データ量は約44 GBです。 この場合、変換には10分37秒かかります。

説明

データベースの変換にかかる具体的な時間は、インスタンスタイプやデータベースサイズなど、さまざまな要因によって異なります。 データベースの変換にかかる正確な時間を取得する場合は、オフピーク時またはテスト環境でドリルを実行することをお勧めします。 ドリル中にlockパラメーターをfalseに設定できます。

スキーマ変換ルール

このセクションでは、PolarDB-XがDRDSモードのデータベースをAUTOモードのデータベースに自動的に変換するために使用する変換ルールについて説明します。 これは、変換後にPolarDB-Xによって作成されたターゲットデータベースとテーブルがビジネス要件を満たしているかどうかを評価するのに役立ちます。

シングルテーブルとブロードキャストテーブル

DRDSモードのシングルテーブルはAUTOモードのブロードキャストテーブルに変換され、DRDSモードのブロードキャストテーブルはAUTOモードのブロードキャストテーブルに変換されます。

削られたテーブル

  • 次の表に、関数のマッピングを示します。

    DRDSシャーディング関数タイプ

    DRDSモードのシャーディング機能

    AUTOモードでのパーティショニング機能

    ハッシュ

    ハッシュ (a)

    キー (a)

    str_hash(a, startIdx, endIdx)

    キー (a)

    uni_hash(a)

    キー (a)

    right_shift(a)

    キー (a)

    range_hash(a、b、10)

    co_hash(right(a,n), right(b,n))

    日付と時刻

    YYYYMM(a)

    ハッシュ (to_months(a))

    YYYYWEEK(a)

    ハッシュ (to_weeks(a))

    YYYYDD(a)

    ハッシュ (to_days(a))

    MM(a)

    範囲 (月 (a))

    DD(a)

    範囲 (dayofmonth(a))

    週 (a)

    範囲 (dayofweek(a))

    MMDD(a)

    範囲 (dayofyear(a))

  • データベースシャーディングは実行され、テーブル分割は実行されません。

    # The table in DRDS mode.
    create table tb1 (
    	id int,
      name varchar(20)
    ) dbpartition by uni_hash(id);
    
    # The mapped table in AUTO mode.
    create table tb1 (
      id int,
      name varchar(20)
    ) partition by key(id);
    説明

    関数マッピングテーブルは次のとおりです。

    • データベースシャーディング関数は、パーティショニング関数に変換される。

    • テーブルスキーマは、AUTOモードで1レベルのパーティションのみを持つテーブルに変換されます。

  • テーブル分割が実行され、データベース分割は実行されません。

    # The table in DRDS mode.
    create table tb3 (
      id int,
      dt date
    ) tbpartition by week(dt) tbpartitions 4;
    
    # The mapped table in AUTO mode.
    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
    );
    説明

    関数マッピングテーブルは次のとおりです。

    • テーブルシャーディング関数は、対応する分割関数に変換される。

    • テーブルスキーマは、AUTOモードで1レベルのパーティションのみを持つテーブルに変換されます。

  • データベースシャーディングとテーブル分割は、同じルールを使用して実行されます。

    # The table in DRDS mode.
    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; 
    
    # The mapped table in AUTO mode.
    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;
    
    説明

    関数マッピングテーブルは次のとおりです。

    • データベースシャーディング関数は、対応する分割関数に変換される。

    • パーティションの数は、データベースシャードの数とテーブルシャードの数の積に等しくなります。

    • テーブルスキーマは、AUTOモードで1レベルのパーティションのみを持つテーブルに変換されます。

  • データベースシャーディングとテーブル分割は、異なるルールを使用して実行されます。

    # The table in DRDS mode.
    create table tb5 (
      buyer_id varchar(20),
      order_id varchar(20)
    ) dbpartition by hash(buyer_id) tbpartition by hash(order_id) tbpartitions 4; 
    
    # The mapped table in AUTO mode.
    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;
    
    説明

    関数マッピングテーブルは次のを示します。

    • データベースシャーディング関数は、対応するレベル1パーティション関数に変換されます。 レベル1のパーティションの数は、データベースシャードの数と同じです。

    • テーブル分割関数は、対応するレベル2分割関数に変換される。 レベル2パーティションの数は、テーブルシャードの数に等しくなります。

    • テーブルスキーマは、AUTOモードで2レベルのパーティションを持つテーブルに変換されます。

シーケンス変換ルール

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

使用上の注意

  • ターゲットAUTOデータベースのCHARSETおよびCOLLATEステートメントは、ソースDRDSデータベースのステートメントと同じです。 したがって、CREATE DATABASE LIKEまたはCREATE DATABASE AS文でCHARSETまたはCOLLATEを手動で指定することはできません。

  • ソースDRDSデータベースとそのテーブルのLOCALITY属性は、ターゲットAUTOデータベースでは構成されません。 DRDSデータベースのlocality属性の詳細については、「LOCALITY属性を使用してデータノードを指定する (DRDSモード) 」をご参照ください。