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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文介绍处理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[d1]Failed to execute the DDL task. Caused by: ERR-CODE: TDDL-5321 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 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)
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
1196 0
|
11月前
|
XML 设计模式 JSON
模板方法模式(Template Method Pattern)
模板方法模式是一种行为型设计模式,定义一个操作中的算法骨架,将某些步骤的实现延迟到子类。子类可以在不改变算法结构的情况下重新定义算法的某些步骤。适用于多个类有相似操作流程且部分步骤需要定制的场景。优点包括高复用性、扩展性强和清晰明确;缺点是灵活性降低和可能引入性能开销。示例包括文件解析和策略模式的对比。
模板方法模式(Template Method Pattern)
|
监控 数据可视化 API
Elasticsearch 的实时监控与告警
【9月更文第3天】随着数据量的不断增加和业务复杂度的提升,对数据系统的实时监控和告警变得至关重要。Elasticsearch 作为一个高性能的搜索和分析引擎,提供了丰富的工具和插件来帮助用户实现实时监控和自动化告警。本文将详细介绍如何配置 Elasticsearch 以实现实时数据监控,并自动触发告警机制。
1298 3
|
Docker 容器
Docker-compose停止并删除容器
Docker-compose停止并删除容器
1177 0
|
Java Linux Apache
设置 Maven 环境变量
配置Maven环境变量涉及Windows、Linux和Mac。在Windows上,需新建系统变量`MAVEN_HOME`指向Maven安装路径,编辑`Path`添加`%MAVEN_HOME%\bin`。在Linux和Mac,下载解压Maven后,将其移动到 `/usr/local/`,编辑`/etc/profile`,添加`MAVEN_HOME`和`PATH`变量。最后,通过运行`mvn -v`检查安装是否成功。示例显示了Maven 3.3.9的版本信息。
|
SQL 关系型数据库 MySQL
OceanBase 的 SQL 兼容性与优化
【8月更文第31天】随着分布式计算的发展,越来越多的企业开始采用分布式数据库来满足其大规模数据存储和处理的需求。OceanBase 作为一款高性能的分布式关系数据库,其设计旨在为用户提供与传统单机数据库类似的 SQL 查询体验,同时保持高可用性和水平扩展能力。本文将深入探讨 OceanBase 的 SQL 引擎特性、兼容性问题,并提供一些针对特定查询进行优化的方法和代码示例。
931 0
|
存储 缓存 分布式计算
高并发架构设计三大利器:缓存、限流和降级问题之缓存的应对策略问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之缓存的应对策略问题如何解决
205 2
|
存储 安全 网络安全
云计算与网络安全:技术演进与挑战
【8月更文挑战第30天】本文深入探讨了云计算与网络安全的紧密关系,并分析了云服务、网络安全、信息安全等技术领域的发展。文章通过实例和理论分析,阐述了如何利用云计算技术来提高网络安全性,同时指出了在云计算环境中面临的安全挑战和应对策略。
|
消息中间件 关系型数据库 MySQL
Flink CDC 最佳实践(以 MySQL 为例)
Flink CDC 最佳实践(以 MySQL 为例)
3644 0
|
SQL 算法 API
NiceGui:Python中的轻量级GUI框架初体验
NiceGui:Python中的轻量级GUI框架初体验
1433 0