本文介绍了如何将DRDS模式的数据库转换为AUTO模式数据库。
背景信息
PolarDB-X支持通过create database like/as语句,将DRDS模式数据库转换为AUTO模式数据库。AUTO模式数据库与DRDS模式数据库的介绍,请参见AUTO模式数据库与DRDS模式数据库。(为方便表述,下文将待转换的DRDS模式数据库称为源DRDS库,转换后得到的AUTO模式数据库称为目标AUTO库)
create database like
语句仅转换源DRDS库中的表的结构,不会复制数据。create database as
语句支持转换源DRDS库中表的结构,且复制对应表的数据。
前提条件
实例版本需在5.4.16-16717637及以上。查看实例版本的方法请参见查看实例版本。
注意事项
转换过程将会对源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...]
参数说明
参数名称 | 参数说明 |
auto_database_name | 新创建数据库的名称,即目标AUTO库的名称。 |
drds_database_name | 源DRDS库的名称,该库必须是已经存在的DRDS模式的数据库。 |
mode | 新创建的数据库的模式选项,参数固定取值auto。 |
dry_run | dry_run参数支持查看源DRDS库中的表结构以及其在AUTO模式下的结构。您也可以查看表结构转换规则了解PolarDB-X是如何进行转换的, 取值如下:
说明
|
lock | lock参数用于控制在转换过程中,是否对源DRDS库加读锁。加读锁将使得源DRDS库变为只读状态,源DRDS库上的DML、DDL操作都将被禁止。 取值如下:
|
create_tables | create_tables参数用于控制在转换过程中是否在目标AUTO库下创建对应的表结构。 取值如下:
|
include | include参数表示转换源DRDS库中的部分表,当使用include时,只有include参数指定的表会被转换。 |
exclude | exclude参数表示排除源DRDS库中的部分表,当使用exclude时,exclude参数指定的表将不会被转换。 |
示例
将DRDS模式的数据库db_drds转换为AUTO模式数据库db_auto,仅转换表结构,不复制数据。
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,转换表结构且复制数据。
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库中,转换表结构且复制数据。
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库db_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提供了查看DRDS库转AUTO库任务的视图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库间的数据复制过程导致。在PolarDB-X独享规格,8核64 GB,4个计算节点,4个存储节点的环境下,参照Sysbench测试创建DRDS库,数据量为4张表,每张表5000万行,共约44 GB数据,转换耗时10min37s。
具体转换耗时与您的实例规格、数据库大小等因素有关,如需了解更准确的转换时间,建议您在业务低峰期或测试环境进行演练,演练时可关闭lock参数。
表结构转换规则
通过了解PolarDB-X自动转换DRDS模式库为AUTO模式库的转换规则,您可以评估PolarDB-X自动转换的库和表是否满足您的业务需求,从而做出更贴近业务需求的调整。
单表和广播表
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))
分库不分表。
# 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模式的一级分区表。
不分库只分表。
# 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模式的一级分区表。
分库且分表(分库拆分规则和分表拆分规则相同)。
# 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模式的一级分区表。
分库且分表(分库拆分规则和分表拆分规则不相同)。
# 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;
说明由函数映射关系表可知:
分库拆分函数将转换为对应的一级分区函数,且一级分区数量等于分库数量。
分表拆分函数将转换为对应的二级分区函数,且二级分区数量等于分表数量。
表结构将转换为AUTO模式的二级分区表。
Sequence转换规则
DRDS模式下的group sequence
、time-based sequence
、simple sequence
将被全部转换为AUTO模式下综合性能更好的New Sequence
。详情请参见Sequence。
注意事项
因为转换后的AUTO模式库和转换前的DRDS模式库的
CHARSET
属性和COLLATE
属性需要保持一致,所以不允许在create database like/as
语句中手动指定CHARSET
和COLLATE
;转换后的AUTO模式库和表不会继承DRDS模式库和表的
locality
属性。关于locality
,请参见通过LOCALITY指定存储位置。