冷數(shù)據(jù)DDL
本文介紹了對(duì)冷數(shù)據(jù)進(jìn)行DDL的操作方法以及優(yōu)化方法。
前提條件
數(shù)據(jù)庫(kù)引擎版本為MySQL 8.0.2,且內(nèi)核小版本為8.0.2.2.23及以上。
僅針對(duì)CSV/ORC格式的冷數(shù)據(jù),以下OSS表以及冷數(shù)據(jù)均指CSV/ORC格式的冷數(shù)據(jù)表。
DDL執(zhí)行算法
PolarDB MySQL版冷數(shù)據(jù)支持以下2種DDL執(zhí)行算法:
INSTANT算法: 使用INSTANT算法執(zhí)行DDL操作時(shí),只需要修改數(shù)據(jù)字典中的元數(shù)據(jù),不需要修改或復(fù)制存量數(shù)據(jù),也不需要重建表。因此其不受表的大小影響,整個(gè)DDL過(guò)程可以秒級(jí)完成。
COPY算法:當(dāng)使用COPY算法執(zhí)行DDL操作時(shí),需要將表中所有的數(shù)據(jù)復(fù)制到新表中。在數(shù)據(jù)復(fù)制期間,會(huì)持有原表的SNW(SHARED_NO_WRITE)鎖。因此,在執(zhí)行DDL操作期間僅支持讀操作,不允許執(zhí)行并發(fā)寫入操作,對(duì)業(yè)務(wù)影響較大。
為了使用指定算法執(zhí)行DDL語(yǔ)句,您可以指定ALGORITHM字段,可選的值有DEFAULT、INSTANT和COPY。當(dāng)DDL操作不支持該算法時(shí),會(huì)立即返回報(bào)錯(cuò)。
通常來(lái)說(shuō),INSTANT算法比COPY算法代價(jià)更低,執(zhí)行影響更小。當(dāng)用戶不通過(guò)ALGORITHM手動(dòng)指定DDL使用的算法時(shí),PolarDB MySQL版會(huì)自動(dòng)優(yōu)先選擇INSTANT算法,其次才考慮使用COPY算法。因此,本文詳細(xì)介紹INSTANT算法。
INSTANT算法使用說(shuō)明
8.0.2.2.23版本支持了OSS冷數(shù)據(jù)表的元數(shù)據(jù)(OSS META)能力。只有當(dāng)表開(kāi)啟OSS META時(shí),才可以支持INSTANT DDL,否則只能支持COPY DDL。 使用方法如下:
查看當(dāng)前表是否開(kāi)啟OSS META。
通過(guò)
show create table
命令,可以查看當(dāng)前表是否開(kāi)啟了OSS META。如果返回結(jié)果中有OSS META=1 ,則說(shuō)明當(dāng)前表開(kāi)啟了OSS META。show create table t \G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` varchar(1000) DEFAULT NULL ) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */ 1 row in set (0.00 sec)
老化場(chǎng)景下增加OSS META。
無(wú)論是InnoDB單表老化為OSS外表,還是InnoDB分區(qū)表歸檔至OSS外表,或是InnoDB表歸檔至OSS分區(qū),在創(chuàng)建新的OSS外表時(shí),都是通過(guò)系統(tǒng)變量 use_oss_meta來(lái)控制當(dāng)前創(chuàng)建的OSS外表(分區(qū))是否使用OSS META管理元數(shù)據(jù)。
當(dāng)系統(tǒng)變量use_oss_meta為ON時(shí),例如:
show variables like "use_oss_meta"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | use_oss_meta | ON | +---------------+-------+ 1 row in set (0.03 sec)
此時(shí),歸檔至OSS外表會(huì)帶有OSS META標(biāo)記:
alter table t engine = csv storage oss; Query OK, 3 rows affected (2.13 sec) Records: 3 Duplicates: 0 Warnings: 0 show create table t \G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` varchar(1000) DEFAULT NULL ) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */ 1 row in set (0.00 sec)
alter table t1 change partition p0 engine = orc; Query OK, 0 rows affected (1.95 sec) Records: 0 Duplicates: 0 Warnings: 0 show create table t1 \G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `order_time` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020223 OSS META=1 */ CONNECTION='default_oss_server' /*!99990 800020205 PARTITION BY RANGE COLUMNS(id) (PARTITION p0 VALUES LESS THAN (10) ENGINE = ORC, PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (40) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (50) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN (60) ENGINE = InnoDB, PARTITION p6 VALUES LESS THAN (70) ENGINE = InnoDB, PARTITION p7 VALUES LESS THAN (80) ENGINE = InnoDB, PARTITION p8 VALUES LESS THAN (90) ENGINE = InnoDB, PARTITION p9 VALUES LESS THAN (100) ENGINE = InnoDB, PARTITION p10 VALUES LESS THAN (110) ENGINE = InnoDB) */ 1 row in set (0.00 sec)
對(duì)沒(méi)有OSS META的表添加META。
可以通過(guò)
repair
命令對(duì)沒(méi)有META的表額外增加OSS META。repair table t; +--------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------+--------+----------+----------+ | test.t | repair | status | OK | +--------+--------+----------+----------+ 1 row in set (0.84 sec) show create table t \G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` varchar(1000) DEFAULT NULL ) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */ 1 row in set (0.00 sec)
說(shuō)明在repair期間會(huì)持有表的X鎖,當(dāng)前表無(wú)法查詢和修改。repair實(shí)際時(shí)間與表的大小有關(guān)。
關(guān)閉當(dāng)前表的OSS META功能。
可以通過(guò)
disable
命令關(guān)閉當(dāng)前表的META。alter table t disable oss meta; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 show create table t \G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` varchar(1000) DEFAULT NULL ) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ 1 row in set (0.00 sec)
關(guān)閉后,表上不會(huì)顯示OSS META標(biāo)記。
說(shuō)明執(zhí)行
disable
命令關(guān)閉META后,無(wú)需重啟,即可生效。
DDL行為特征
COLUMN操作
操作 | 重建表 | 僅修改元數(shù)據(jù) |
增加列 | 否1 | 是1 |
刪除列 | 是 | 否 |
重命名列 | 否 | 是 |
重排序列 | 是 | 否 |
設(shè)置列的默認(rèn)值 | 否 | 是 |
修改列注釋 | 否 | 是 |
修改列類型 | 是 | 否 |
擴(kuò)展VARCHAR長(zhǎng)度 | 否 | 是 |
將UTF8mb3字符集修改為UTF8mb4字符集 | 否2 | 是2 |
刪除列默認(rèn)值 | 否 | 是 |
修改auto-increment值 | 否 | 是 |
變更某列為NULL | 是 | 否 |
變更某列為非NULL | 是 | 否 |
修改ENUM/SET列的定義 | 否 | 是3 |
秒級(jí)加字段功能僅支持將列添加至表的末尾。同時(shí),需要當(dāng)前表開(kāi)啟OSS META 。當(dāng)表未指定主鍵時(shí),需要將參數(shù)
implicit_primary_key
的值設(shè)置為OFF,以避免在執(zhí)行秒級(jí)加字段操作時(shí)因表的最末尾的隱式主鍵列導(dǎo)致加列操作失敗。如果集群不支持使用秒級(jí)加字段功能,增加字段將使用COPY方式執(zhí)行DDL。此時(shí)需要進(jìn)行全表重建,重建期間允許并發(fā)讀操作。當(dāng)滿足以下條件時(shí),將列的字符集從UTF8mb3修改至UTF8mb4僅修改元數(shù)據(jù),無(wú)需修改數(shù)據(jù)。否則,需要使用COPY算法進(jìn)行表重建,且重建期間全程鎖表,目標(biāo)表只能讀,不能執(zhí)行寫入操作。
列類型為CHAR、VARCHAR、ENUM以及TEXT類型。
修改的列上不存在任何索引。
字符集轉(zhuǎn)換前后,列的最大存儲(chǔ)長(zhǎng)度均小于256或均大于255。
您可以通過(guò)指定ALGORITHM=INSTANT 來(lái)強(qiáng)制使用非重建表的方式執(zhí)行DDL,如果需要使用COPY算法才能執(zhí)行時(shí),會(huì)立刻返回報(bào)錯(cuò)。示例如下:
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = INSTANT; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
僅當(dāng)數(shù)據(jù)類型的存儲(chǔ)大小不發(fā)生改變,且向ENUM或SET的末尾追加元素時(shí),才可以僅修改元數(shù)據(jù),不重建整張表。否則需要使用COPY算法進(jìn)行表重建。
Table操作
操作 | 重建表 | 僅修改元數(shù)據(jù) |
開(kāi)啟META | 是 | 否 |
關(guān)閉META | 否 | 是 |
聲明Character Set | 否 | 是 |
轉(zhuǎn)換Character Set | 是 | 否 |
重命名表 | 否 | 是1 |
修改表注釋 | 否 | 是 |
重命名表不會(huì)全部重寫表的數(shù)據(jù),但是會(huì)對(duì)該表對(duì)應(yīng)的OSS數(shù)據(jù)文件做RENAME操作,因此rename速度和表大小呈正相關(guān),略慢于其他的INSTANT操作。