全部产品
云市场

常见场景与限制

更新时间:2019-09-18 15:52:24

新 DDL 执行引擎引入任务管理,外部行为与之前版本相比有所变化,典型的应用场景如下:

  • DDL 正常执行成功时,无需关注 DDL 任务的状态,已成功完成的 DDL 任务会被自动清理

  • 建议执行 DDL 成功后,立即执行 CHECK TABLE 检查确认逻辑表的一致性

  • DDL 执行失败时,会返回导致失败的错误码和错误信息,也可以通过 SHOW DDL 查看 PENDING 状态的 DDL 任务失败的原因(REMARK 字段中记录的信息),应该在排除导致 DDL 执行错误的因素后,再尝试执行 DDL 任务管理语句进行恢复、回滚或者删除操作,否则仍然可能继续失败

  • 若 DDL 执行失败,对应的 DDL 任务处于 PENDING 状态时,出于保护目的,目标表会处于不可访问状态(SHOW TABLES 等操作无法显示,DML 等操作可能会收到 Unknown table 或 doesn’t exist 之类的报错),直到 DDL 任务通过恢复或回滚等方式使目标表达到一致性的状态后,该表才可以正常访问

  • 当为 CREATE TABLE 指定 IF NOT EXISTS 或者为 DROP TABLE 指定 IF EXISTS 时,一些执行过程中的错误不会导致 DDL 失败,但会记录在 warning 警告中,请注意 DDL 执行后是否返回 warning 数量的消息(例如 1 warning),并用 SHOW WARNINGS 语句检查警告,避免遗漏重要的信息

  • 通过 DMS 等客户端工具执行 DDL 时,若无法评估 DDL 需要的执行时间,并且客户端工具本身带有超时中断连接(客户端与 DRDS 之间的连接)的设置,为了避免 DDL 被超时中断,可启用 PURE_ASYNC_DDL_MODE 异步模式(使用方法请参考参数说明文档),执行后立即返回,继续通过 SHOW DDL 查看 DDL 任务状态

  • 通过 DDL 任务管理语句恢复、回滚或者删除 DDL 任务后,也建议执行 CHECK TABLE 检查确认逻辑表的一致性

DDL 任务管理的限制:

  • 仅支持 CREATE TABLE 和 RENAME TABLE 两种 DDL 操作的回滚(ROLLBACK DDL)

  • 不支持对处于 PENDING 状态的任务执行恢复(RECOVER DDL)和回滚(ROLLBACK DDL)的组合重复操作,比如先回滚(ROLLBACK DDL)失败任务,回滚失败后再对任务进行恢复(RECOVER DDL)操作;此类组合操作有可能造成逻辑表的不一致状态,如果遇到此类复杂场景,请与 DRDS 技术支持联系

  • REMOVE DDL 要在非常确定安全性的前提下谨慎使用,若不确定则不应执行 REMOVE DDL,误用可能造成 DDL 任务的中间状态暴露,出现逻辑表不一致的情况;如果因为误用 REMOVE DDL 产生问题或不确定的状态,请与 DRDS 技术支持联系

  • 默认拆分表的单个物理库允许创建最多 128 个分表,可通过参数调整上限,例如:

  1. 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;
  2. 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.
  3. 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;
  4. Query OK, 0 rows affected (2.64 sec)
  • DDL 执行引擎内部的任务队列,最多允许堆积 65535 个 PENDING 的 DDL 任务,超过此上限则无法执行 DDL,需要通过 REMOVE DDL 谨慎清理可删除的遗留任务,该数量限制无法通过参数调整