本文介紹了如何將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指定存儲位置。