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