このトピックでは、分散リレーショナルデータベースサービス (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がデータベースを変換する方法の詳細については、「スキーマ変換ルール」をご参照ください。 有効な値:
説明
|
ロック | 変換中にソースDRDSデータベースに読み取りロックを適用するかどうかを指定します。 読み取りロックが適用されると、ソースDRDSデータベースは読み取り専用になり、ソースDRDSデータベースでDMLまたはDDLステートメントを実行できなくなります。 有効な値:
|
create_tables | 変換時にターゲット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モード) 」をご参照ください。