最佳实践—如何正确处理DDL异常

简介: 本文介绍处理DDL异常的常用方法。

概述

作为一款分布式数据库,PolarDB-X中的一条DDL语句背后隐藏着复杂的数据处理流程。例如创建一张拆分表时,实际上会在多个数据节点上创建很多张物理MySQL表。PolarDB-X的DDL处理框架拥有一定的容错能力,会保证DDL的正确性和一致性。但在特殊情况下,需要手动处理DDL异常。

处理步骤

下面以创建全局唯一二级索引为例,介绍处理DDL异常的步骤。创建全局唯一二级索引时,会校验列中数据的全局唯一性,如果发现列中数据不唯一,则会导致DDL的执行失败。此时DDL的状态可能变为“PAUSED”或“ROLLBACK_PAUSED”。

  1. 查看DDL的执行状态执行SHOW DDL语句,查看DDL的执行状态。只有当DDL状态为“PAUSED”或“ROLLBACK_PAUSED”时,才需要手动处理。
mysql> show ddl\G;
*************************** 1. row ***************************
           JOB_ID: 1359992239576580096
    OBJECT_SCHEMA: d1
      OBJECT_NAME: t1
           ENGINE: DAG
         DDL_TYPE: ALTER_TABLE
            STATE: PAUSED
BACKFILL_PROGRESS: 0%
 PHY_DDL_PROGRESS: 100%
         PROGRESS: 80%
       START_TIME: 2021-08-05 13:57:57.852
         END_TIME: 2021-08-05 13:58:30.804
 ELAPSED_TIME(MS): 32952
      PHY_PROCESS: 
       CANCELABLE: true
1 row in set (0.03 sec)
  1. 判断错误原因通常DDL异常发生时,会直接返回错误信息。有时DDL的错误信息可能难以获取(例如DDL是异步执行的),可以通过SHOW DDL RESULT语句查看近期执行过的DDL。在本示例中,从返回的错误信息中看到出现了UNIQUE KEY的冲突。
mysql> alter table t1 add unique global INDEX `idx_c2`(`c2`) DBPARTITION BY HASH(`c2`) tbpartition by hash(c2) tbpartitions 3;
ERROR 3009 (HY000): [12dfa9bc5c800000][30.39.226.95:8527][d1]Failed to execute the DDL task. Caused by: ERR-CODE: [TDDL-5321][ERR_GLOBAL_SECONDARY_INDEX_BACKFILL_DUPLICATE_ENTRY] Duplicated entry '100018' for key 'PRIMARY'
mysql> show ddl result\G;
*************************** 1. row ***************************
        JOB_ID: 1359992239576580096
   SCHEMA_NAME: d1
   OBJECT_NAME: t1
      DDL_TYPE: ALTER_TABLE
   RESULT_TYPE: ERROR
RESULT_CONTENT: Failed to execute the DDL task. Caused by: ERR-CODE: [TDDL-5321][ERR_GLOBAL_SECONDARY_INDEX_BACKFILL_DUPLICATE_ENTRY] Duplicated entry '100018' for key 'PRIMARY'
  1. 恢复或取消DDL大多数情况下,DDL出错时都能够自动恢复或取消。特殊情况需要手动处理DDL异常。各个DDL的容错策略可能不同,例如CREATE TABLE语句的容错策略是:自动尝试恢复,多次失败则自动取消。可以手动恢复或取消DDL任务。
  • 手动恢复:使用CONTINUE DDL语句可以恢复DDL任务。
  • 手动取消:使用CANCEL DDL语句可以取消DDL任务。有些DDL任务可能是无法取消的,可以通过SHOW DDL语句返回的“CANCELABLE”字段查看是否可以取消。
-- 处理完UNIQUE KEY的数据冲突后,可以使用continue ddl语句继续执行
mysql> continue ddl 1359992239576580096;
Query OK, 1 row affected (1.63 sec)
-- 如果不想再继续添加这个全局唯一二级索引,则可以直接取消任务
mysql> cancel ddl 1359992239576580096;
Query OK, 1 row affected (0.03 sec)
  1. 检查表一致性和正确性DDL执行成功后,建议使用以下语句检查表的一致性和表结构的正确性:
  • 使用CHECK TABLE语句检查表的一致性:如果返回结果为OK,说明表已经处于一致性状态,可以正常使用;如果返回报错信息,提示表处于不一致状态,请联系阿里云技术支持。
  • 使用SHOW CREATE TABLE语句查看表结构的正确性。
mysql> check table t1;
+-------+-------+----------+----------+
| TABLE | OP    | MSG_TYPE | MSG_TEXT |
+-------+-------+----------+----------+
| d1.t1 | check | status   | OK       |
+-------+-------+----------+----------+
1 row in set (0.05 sec)
mysql> show create table t1\G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
    `c1` bigint(20) NOT NULL AUTO_INCREMENT BY GROUP,
    `c2` bigint(20) DEFAULT NULL,
    `c3` bigint(20) DEFAULT NULL,
    PRIMARY KEY USING BTREE (`c1`),
    UNIQUE GLOBAL KEY `idx_c2` (`c2`) COVERING (`c1`) DBPARTITION BY HASH(`c2`) TBPARTITION BY HASH(`c2`) TBPARTITIONS 3
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`c1`) tbpartition by hash(`c1`) tbpartitions 3
1 row in set (0.02 sec)
相关文章
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
8626 0
Winform控件优化之TabControl控件的使用和常用功能
Pyside6-第七篇-QLineEdit文本行编辑(内设案例)
Pyside6-第七篇-QLineEdit文本行编辑(内设案例)
1886 0
|
NoSQL MongoDB
MongoDB compact 命令详解
为什么需要 compact 一图胜千言 remove 与 drop 的区别 MongoDB 里删除一个集合里所有文档,有两种方式 db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收 db.
|
7月前
|
传感器 人工智能 安全
物联网
万物互联,智启未来。物联网通过连接人、物、环境,重塑生活、城市与产业。从智能家居到智慧城市,从工业互联网到精准农业,数据驱动智能化变革。融合AI、5G等技术,构建高效、安全、可持续的智能世界,开启人类社会新篇章。(238字)
|
11月前
|
SQL Java 数据安全/隐私保护
发现问题:Mybatis-plus的分页总数为0,分页功能失效,以及多租户插件的使用。
总的来说,使用 Mybatis-plus 确实可以极大地方便我们的开发,但也需要我们理解其工作原理,掌握如何合适地使用各种插件。分页插件和多租户插件是其中典型,它们的运用可以让我们的代码更为简洁、高效,理解和掌握好它们的用法对我们的开发过程有着极其重要的意义。
1012 15
|
Java Spring
ij社区版如何创建spring项目
如何在IntelliJ IDEA社区版中创建Spring项目,包括安装Spring Boot Helper插件的步骤和创建过程。
448 1
ij社区版如何创建spring项目
|
消息中间件 存储 NoSQL
Celery:高效异步任务队列的深度解析与应用实践
Celery 是一个流行的 Python 分布式任务队列,用于处理耗时的异步任务,提升Web应用性能。它包括消息中间件(如RabbitMQ、Redis)、任务生产者和消费者。Celery支持异步处理、分布式执行、任务调度、结果存储和错误处理。通过一个发送邮件验证码的实例,展示了如何安装配置、定义任务、触发任务以及查看执行结果。Celery的使用能有效优化应用响应速度和资源管理。
2133 3
|
存储
十六进制是什么
【8月更文挑战第9天】 十六进制是什么
3626 1
|
存储 监控 安全
|
存储 缓存 网络协议
SYN Flood是什么?这篇给你讲明白!
SYN Flood是1994年发现的DDoS攻击方式,利用TCP三次握手的漏洞,通过发送大量伪造源IP的SYN报文,使服务器创建半连接,耗尽资源,导致服务中断。防御策略包括源认证、首包丢弃和使用Anti-DDoS系统。高防服务器和抗D盾等解决方案提供DDoS清洗和CC攻击防御,通过智能分布式云接入隐藏真实IP,保持TCP连接稳定,同时提供网络加速和防掉线功能。

热门文章

最新文章