本文介绍了如何将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是如何进行转换的,

取值如下:

  • true:开启dry_run参数;
  • false:关闭dry_run参数,默认值为false。
说明
  • dry_run参数仅用于展示DRDS模式下的表结构如何转换为AUTO模式的表结构。不会创建任何表结构,也不会复制表数据。
  • 开启dry_run参数,不会对源DRDS库产生任何影响(例如导致源DRDS库变为只读状态)。
lock

lock参数用于控制在转换过程中,是否对源DRDS库加读锁。加读锁将使得源DRDS库变为只读状态,源DRDS库上的DML、DDL操作都将被禁止。

取值如下:

  • true:开启lock,对源drds库加读锁,默认值为true;
  • false:关闭lock
    重要 如果关闭此参数将导致源DRDS库和目标AUTO库间的数据不一致。
create_tables

create_tables参数用于控制在转换过程中是否在目标AUTO库下创建对应的表结构。

取值如下:

  • true:开启create_tablesPolarDB-X将自动为您转换表结构并在目标AUTO库下创建数据表。默认值为true;
  • false:关闭create_tables,关闭参数要求您必须预先创建好目标AUTO库,并在AUTO库下创建出所有和源DRDS库对应的表。
    说明
    • 如果认为PolarDB-X自动转换的表不够贴近您的应用场景,您可以选择关闭create_tables参数,自行创建目标AUTO库及表。目标AUTO库下的表必须和源DRDS库下的表拥有完全一致的表名和列定义,您可以自定义分区方式。
    • create_tables选项关闭时,create database as语句将只进行源DRDS库到目标AUTO库的数据复制,不创建目标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模式下的单表和广播表。

  • 分库分表

    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) key(a),且在b上创建clustered index,分区函数为key(b)。
    日期类型 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模式下的分库分表将会被转换为AUTO模式下的分区表。根据DRDS模式分库分表的类型,可以分成如下几类:

    • 分库不分表:根据分库拆分函数进行映射,转换为AUTO模式的分区表。 示例如下:
      # 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)
      ) tbpartition by range_hash(buyer_id,order_id, 10) tbpartitions 4;
      
      # 映射为auto模式的表
      create table tb1 (
        buyer_id varchar(20),
        order_id varchar(20),
        clustered index `auto_cg_order_id`(`order_id`) partition by key (`order_id`) partitions 64
      ) partition by key(buyer_id) partitions 64;
                                  
Sequence转换规则

DRDS模式下的group sequence、time-based sequence、simple sequence将被全部转换为AUTO模式下综合性能更好的New Sequence(NEW)

其他
  • 目标AUTO库的CHARSET和COLLATE将和源DRDS库保持一致,因此不允许在create database like/as语句中手动指定CHARSET和COLLATE;
  • 源DRDS库及其表的locality属性将不会被设置到目标AUTO库。DRDS库的locality相关内容,请参见通过LOCALITY指定存储位置(DRDS模式)