このトピックでは、DRDS モードデータベースから AUTO モードデータベースへの変換方法について説明します。
背景情報
PolarDB-X では、CREATE DATABASE LIKE または CREATE DATABASE AS ステートメントを使用して、DRDS モードデータベースから AUTO モードデータベースへの変換が可能です。AUTO モードデータベースと DRDS モードデータベースの詳細については、「AUTO モードデータベースと DRDS モードデータベース」をご参照ください。本トピックでは、明確化のため、元の DRDS モードデータベースを「ソース DRDS データベース」、新しい AUTO モードデータベースを「ターゲット AUTO データベース」と呼びます。
-
create database likeステートメントは、ソース DRDS データベースのテーブルスキーマのみを変換し、データはコピーしません。 -
create database asステートメントは、テーブルスキーマを変換し、対応するテーブルからデータをコピーします。
前提条件
インスタンスのバージョンが 5.4.16-16717637 以降である必要があります。インスタンスのバージョンの確認方法については、「インスタンスバージョンの確認」をご参照ください。
注意事項
-
変換プロセス中は、ソース DRDS データベースに読み取りロックがかかって読み取り専用になり、変換が完了するまですべての DML および DDL ステートメントがブロックされます。そのため、業務への影響を慎重に評価してください。
-
変換の失敗を防ぐため、変換中はソース DRDS データベースまたはターゲット AUTO データベースでは、DML または DDL ステートメントを実行しないでください。
-
変換プロセスは、ソース DRDS データベースを削除または上書きしません。代わりに、ソース DRDS データベースから新しいターゲット AUTO データベースを作成します。変換後もソース DRDS データベースにアクセスできます。
-
ストレージ容量不足による失敗を防ぐため、開始前に十分な容量があることを確認してください。
構文
CREATE DATABASE [IF NOT EXISTS] auto_database_name
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 データベースの名前。このデータベースは既に存在し、DRDS モードデータベースである必要があります。 |
|
mode |
新しいデータベースのモード。このパラメータは |
|
dry_run |
dry_run パラメータは、PolarDB-X がソース DRDS データベースから AUTO モードデータベースへのテーブルスキーマ変換をどのように実行するかをプレビューします。PolarDB-X がどのように変換を実行するかについての詳細は、「テーブルスキーマ変換ルール」をご参照ください。 有効な値:
説明
|
|
lock |
lock パラメータは、変換中にソース DRDS データベースに読み取りロックをかけるかどうかを制御します。読み取りロックは、ソース DRDS データベースを読み取り専用にし、すべての DML および DDL 操作をブロックします。 有効な値:
|
|
create_tables |
create_tables パラメータは、変換中にターゲット AUTO データベースに、対応するテーブルスキーマを作成するかどうかを制御します。 有効な値:
|
|
include |
include パラメータは、ソース DRDS データベースから変換するテーブルを指定します。include を指定すると、include パラメータで指定したテーブルのみが変換されます。 |
|
exclude |
exclude パラメータは、変換から除外するテーブルを指定します。exclude を指定すると、exclude パラメータで指定したテーブルは変換されません。 |
例
-
db_drdsDRDS モードデータベースをdb_autoAUTO モードデータベースに変換します。この操作では、テーブルスキーマのみを変換し、データはコピーしません。CREATE DATABASE db_auto like db_drds mode=auto;次の出力が返されます:
+-------------+ | RESULT | +-------------+ | ALL SUCCESS | +-------------+ 1 row in set (10 min 32.17 sec) -
db_drdsDRDS モードデータベースをdb_autoAUTO モードデータベースに変換します。この操作では、テーブルスキーマを変換し、データをコピーします。CREATE DATABASE db_auto as db_drds mode=auto;次の出力が返されます:
+-------------+ | RESULT | +-------------+ | ALL SUCCESS | +-------------+ 1 row in set (10 min 37.30 sec) -
tb1テーブルのみをdb_drdsDRDS モードデータベースからdb_auto_existAUTO モードデータベースに変換してコピーします。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) -
db_drdsソース 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 データベースとそのテーブルを作成する必要があります。ターゲットデータベースのテーブルスキーマは、ソースデータベースのものと同一である必要があります。
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)
また、show full ddl コマンドを使用して進行状況を確認することもできます。
時間のかかる変換タスクでは、接続が失われた場合に結果を確認できないことがあります (接続が失われても変換タスクは正常に実行され続けます)。その場合は、show ddl result を使用して変換結果を確認できます。また、INFORMATION_SCHEMA.CREATE_DATABASE でより詳細な結果を確認することもできます。
[変換時間]
変換時間は、主にソース DRDS データベースとターゲット AUTO データベース間のデータコピープロセスに依存します。PolarDB-X 専用インスタンス (8 コア CPU、64 GB メモリ、4 コンピュートノード、4 ストレージノード) のテスト環境では、Sysbench テストに基づいて DRDS データベースが作成されました。データベースには 4 つのテーブルが含まれ、各テーブルには 5,000 万行、合計約 44 GB のデータがありました。変換には 10 分 37 秒かかりました。
実際の変換時間は、インスタンスの仕様やデータベースのサイズなどの要因によって異なります。より正確な見積もりを得るには、オフピーク時またはテスト環境でリハーサルを実行することを推奨します。リハーサルでは、lock パラメータを false に設定できます。
[テーブルスキーマ変換ルール]
PolarDB-X が DRDS モードデータベースから AUTO モードデータベースへ自動変換する際のルールを理解することで、PolarDB-X によって変換されたデータベースとテーブルが業務要件を満たすかどうかを評価し、必要に応じて調整できます。
単一テーブルとブロードキャストテーブル
DRDS モードの単一テーブルとブロードキャストテーブルは、それぞれ AUTO モードの単一テーブルとブロードキャストテーブルに変換されます。
データベースシャーディングとテーブルシャーディングを使用するテーブル
-
関数マッピングテーブル
DRDS 関数タイプ
DRDS シャーディング関数
AUTO パーティショニング関数
Hash
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,10), right(b,10))
Date
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))
-
テーブルシャーディングなしのデータベースシャーディング
# 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);説明関数マッピングテーブルに示すように、
-
データベースシャーディング関数はパーティショニング関数に変換されます。
-
テーブルスキーマは、AUTO モードのレベル 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 );説明関数マッピングテーブルに示すように、
-
テーブルシャーディング関数は、対応するパーティショニング関数に変換されます。
-
テーブルスキーマは、AUTO モードのレベル 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;説明関数マッピングテーブルに示すように、
-
データベースシャーディング関数は、対応するパーティショニング関数に変換されます。
-
パーティション数は、データベースシャード数とテーブルシャード数の積に等しくなります。
-
テーブルスキーマは、AUTO モードのレベル 1 パーティションテーブルに変換されます。
-
-
異なるルールによるデータベースシャーディングとテーブルシャーディング
# 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;説明関数マッピングテーブルに示すように、
-
データベースシャーディング関数は、対応するレベル 1 パーティショニング関数に変換され、レベル 1 パーティション数はデータベースシャード数と等しくなります。
-
テーブルシャーディング関数は、対応するレベル 2 パーティショニング関数に変換され、レベル 2 パーティション数はテーブルシャード数と等しくなります。
-
テーブルスキーマは、AUTO モードのレベル 2 パーティションテーブルに変換されます。
-
[シーケンス変換ルール]
DRDS モードでは、group sequence、time-based sequence、simple sequence は、すべて AUTO モードの New Sequence タイプに変換されます。これにより、全体的なパフォーマンスが向上します。詳細については、「シーケンス」をご参照ください。
注意事項
-
ターゲット AUTO データベースは、ソース DRDS データベースと同じ
CHARSETおよびCOLLATE属性を持つ必要があります。そのため、create database LIKE/ASステートメントでCHARSETまたはCOLLATEを手動で指定することはできません。 -
ターゲット AUTO データベースとそのテーブルは、ソース DRDS データベースとそのテーブルから
locality属性を継承しません。localityの詳細については、「LOCALITY を使用したストレージロケーションの指定」をご参照ください。