新DDL執(zhí)行引擎引入了任務(wù)管理功能,外部行為與之前版本相比有所變化。本文將介紹相關(guān)的注意事項(xiàng)與使用限制。

注意事項(xiàng)

  • DDL正常執(zhí)行成功時(shí),無需關(guān)注DDL任務(wù)的狀態(tài),已成功完成執(zhí)行的DDL任務(wù)會(huì)被自動(dòng)清理。
  • 建議DDL執(zhí)行成功后,立即執(zhí)行CHECK TABLE檢查邏輯表的一致性。
  • 通過DDL任務(wù)管理語句恢復(fù)、回滾或刪除DDL任務(wù)后,建議執(zhí)行CHECK TABLE檢查邏輯表的一致性。
  • DDL執(zhí)行失敗時(shí),會(huì)返回導(dǎo)致失敗的錯(cuò)誤碼和錯(cuò)誤信息,您可以通過SHOW DDL查看處于PENDING狀態(tài)的DDL任務(wù)失敗的原因(即REMARK字段中記錄的信息)。
    重要 建議您在找到并解決導(dǎo)致DDL任務(wù)失敗的因素后,再嘗試執(zhí)行DDL任務(wù)管理語句進(jìn)行恢復(fù)、回滾或刪除操作,否則DDL執(zhí)行可能仍會(huì)失敗。
  • 若DDL執(zhí)行失敗,對應(yīng)的DDL任務(wù)處于PENDING狀態(tài)時(shí),出于保護(hù)目的,目標(biāo)表會(huì)處于不可訪問狀態(tài)(SHOW TABLES等操作無法顯示,DML等操作可能會(huì)收到Unknown tabledoesn't exist之類的報(bào)錯(cuò)),直到DDL任務(wù)通過恢復(fù)或回滾等方式使目標(biāo)表達(dá)到一致性的狀態(tài)后,該表才可以被正常訪問。
  • 當(dāng)為CREATE TABLE指定IF NOT EXISTS或者為DROP TABLE指定IF EXISTS條件時(shí),一些執(zhí)行過程中的錯(cuò)誤不會(huì)導(dǎo)致 DDL失敗,但會(huì)記錄在warning警告中,請注意DDL執(zhí)行后是否返回warning數(shù)量的消息(例如1 warning),并用SHOW WARNINGS語句檢查警告,避免遺漏重要的信息。
  • 通過DMS等客戶端工具執(zhí)行DDL時(shí),若無法評(píng)估DDL需要的執(zhí)行時(shí)間且客戶端工具本身帶有超時(shí)中斷連接(客戶端與PolarDB-X 1.0之間的連接)的設(shè)置,為避免DDL由于超時(shí)中斷連接而無法被繼續(xù)執(zhí)行,您可以啟用PURE_ASYNC_DDL_MODE異步模式,執(zhí)行DDL后立即返回,并繼續(xù)通過SHOW DDL查看DDL任務(wù)狀態(tài)。

使用限制

  • 僅支持CREATE TABLE和RENAME TABLE兩種DDL回滾操作。
  • 不支持對處于PENDING狀態(tài)的任務(wù)執(zhí)行恢復(fù)(RECOVER DDL)和回滾(ROLLBACK DDL)的組合重復(fù)操作。例如,先回滾失敗任務(wù),回滾失敗后再對任務(wù)進(jìn)行恢復(fù)操作。
  • REMOVE DDL要在非常確定安全性的前提下謹(jǐn)慎使用,若不確定則不應(yīng)執(zhí)行REMOVE DDL,誤用可能造成DDL任務(wù)的中間狀態(tài)暴露,出現(xiàn)邏輯表不一致的情況。
  • 默認(rèn)拆分表的單個(gè)物理庫允許創(chuàng)建最多128個(gè)分表,您也可以通過如下參數(shù)調(diào)整上限。
    mysql> create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 129;
    ERROR 4647 (HY000): [f5bd90594800000][30.25.86.55:8527][JICHEN_LOCAL_APP]ERR-CODE: [TDDL-4647][ERR_TABLE_PARTITIONS_EXCEED_LIMIT] The number of table partitions '129' exceeds the upper limit '128'. Please specify less table partitions or adjust the value of the parameter MAX_TABLE_PARTITIONS_PER_DB.
    mysql> /*+TDDL:cmd_extra(MAX_TABLE_PARTITIONS_PER_DB=400)*/create table test_mdb_mtb (c1 int not null auto_increment primary key, c2 varchar(10), c3 date) dbpartition by hash(c1) tbpartition by hash(c1) tbpartitions 129;
    Query OK, 0 rows affected (2.64 sec)
  • DDL執(zhí)行引擎內(nèi)部的任務(wù)隊(duì)列,最多允許堆積65535個(gè)PENDING狀態(tài)的DDL任務(wù),超過此上限則無法執(zhí)行DDL,需要通過REMOVE DDL謹(jǐn)慎清理可刪除的遺留任務(wù),該數(shù)量限制無法通過參數(shù)調(diào)整上限。