PolarDB-X 1.0-最佳实践-如何处理DDL异常

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 本文介绍如何处理使用PolarDB-X 1.0时出现的DDL异常情况。

DDL原理简介

PolarDB-X 1.0的DDL指令会在所有分表上执行对应的DDL操作。失败的情况可以分为两类:

  • DDL在分库执行失败。DDL在任意分库执行出错都可能导致各分表结构不一致。分库执行报错的原因多种多样,如建表时表已存在、加列时列已存在等各类冲突、磁盘空间不足等。
  • 执行长时间无响应。在对大表执行DDL操作时,有可能由于分库的执行时间过长导致DDL长时间无响应。长时间无响应一般是由分库的执行时间过长导致的。以MySQL为例,DDL的耗时大部分取决于该操作是In-Place(直接在源表修改)还是Copy Table(拷贝表数据)。In-Place只需要修改元数据就可以了,而Copy Table需要重建整张表数据,此外还涉及日志和buffer操作。各类操作与这两项因素的关系详见MySQL官方文档Online DDL Operations

判断DDL操作是In-place还是Copy Table操作,可以查看操作结束后rows affected这一项的返回值。示例如下:

  • 改变某列的默认值(非常快,完全不会影响表数据)。
Query OK, 0 rows affected (0.07 sec)
  • 增加一个索引(需要一点时间 ,但是0 rows affected说明表数据没有被复制)。
Query OK, 0 rows affected (21.42 sec)
  • 改变某列的数据类型(耗费大量时间并且需要重建表中的所有数据行)。
Query OK, 1671168 rows affected (1 min 35.54 sec)

因此,执行一个大表DDL操作前,可以先通过以下步骤判定这是一个快速还是慢速的操作:

  1. 复制表结构生成一张克隆表。
  2. 插入一些数据。
  3. 在克隆表上执行目标DDL操作。
  4. 检查操作完成后rows affected值是否为0。非0的值意味着该操作需要重建整张表,这时可能需要考虑在业务低峰期执行该操作。

PolarDB-X 1.0 DDL操作会将所有SQL分发到所有分库上并行执行。任一分库上执行失败不会影响其他分库。另外,PolarDB-X 1.0还提供了CHECK TABLE指令来检测分表结构的一致性。因此,失败的DDL操作可以重新执行,已经执行成功的分库上失败报错并不会影响其他分库。只需保证最终所有分表结构一致即可。

DDL失败处理步骤

  1. 使用CHECK TABLE指令检查表结构。如果返回结果只有一行且为状态正常则可认为表状态一致。此时进行步骤2,否则进行步骤3。
  2. 使用SHOW CREATE TABLE指令检查表结构。如果显示的表结构符合DDL执行后的预期则可认为DDL执行成功,否则继续进行步骤3。
  3. 使用SHOW PROCESSLIST指令观察所有当前执行的SQL状态。如有仍在执行的DDL操作,请等候其执行完成后再进行步骤1、2,检查表结构是否符合预期,否则进行步骤4。
  4. PolarDB-X 1.0上重新执行DDL操作。如果出现Lock conflict的报错请进行步骤5,否则进行步骤3。
  5. 使用RELEASE DBLOCK指令释放DDL操作锁,然后进行步骤4。

详细操作如下:

  1. 检查表结构一致性。使用CHECK TABLE指令检查表结构,示例如下:
mysql> check table `xxxx`;

  1. 说明 如果在DMS上执行CHECK TABLE没有返回结果,请在命令行下重试。
    若返回结果只有一行且显示状态OK时,表明表结构一致。示例如下:
+----------------------------+-------+----------+----------+
| TABLE                      | OP    | MSG_TYPE | MSG_TEXT |
+----------------------------+-------+----------+----------+
| TDDL5_APP.xxxx             | check | status   | OK       |
+----------------------------+-------+----------+----------+
1 row in set (0.05 sec)
  1. 检查表结构。使用SHOW CREATE TABLE指令检查表结构,示例如下:
mysql> show create table `xxxx`;
  1. 若表结构一致且表结构无误时,可认为DDL已执行成功,返回结果示例如下:
+---------+------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                     |
+---------+------------------------------------------------------------------------------------------------------------------+
|  xxxx   | CREATE TABLE `xxxx` (
`id` int(11) NOT NULL DEFAULT '0',
`NAME` varchar(1024) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`id`) tbpartition by hash(`id`) tbpartitions 3                      |
+---------+------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
  1. 观察当前正在执行的SQL语句。有些DDL执行速度过慢,发现DDL长时间无响应后,可执行SHOW PROCESSLIST指令观察所有当前执行的SQL状态,示例如下:
mysql> SHOW PROCESSLIST WHERE COMMAND != 'Sleep';
  1. 返回结果示例如下:
+---------------+-----------+--------------------+-------------+---------+-----------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+-----------+---------------+-----------+
| ID            | USER      | DB                 | COMMAND     | TIME    | STATE                                                                 | INFO                                                                                                 | ROWS_SENT | ROWS_EXAMINED | ROWS_READ |
+---------------+-----------+--------------------+-------------+---------+-----------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+-----------+---------------+-----------+
| 0-0-352724126 | ifisibhk0 | test_123_wvvp_0000 | Query       |      15 | Sending data                                                          | /*DRDS /42.120.74.88/ac47e5a72801000/ */select `t_item`.`detail_url`,SUM(`t_item`.`price`) from `t_i |      NULL |          NULL |      NULL |
| 0-0-352864311 | cowxhthg0 | NULL               | Binlog Dump |      13 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL                                                                                                 |      NULL |          NULL |      NULL |
| 0-0-402714566 | ifisibhk0 | test_123_wvvp_0005 | Query       |      14 | Sending data                                                          | /*DRDS /42.120.74.88/ac47e5a72801000/ */select `t_item`.`detail_url`,`t_item`.`price` from `t_i      |      NULL |          NULL |      NULL |
| 0-0-402714795 | ifisibhk0 | test_123_wvvp_0005 | Alter       |     114 | Sending data                                                          | /*DRDS /42.120.74.88/ac47e5a72801000/ */ALTER TABLE `Persons` ADD `Birthday` date                    |      NULL |          NULL |      NULL |
......
+---------------+-----------+--------------------+-------------+---------+-----------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+-----------+---------------+-----------+
12 rows in set (0.03 sec)
  1. TIME列代表该指令已经执行的秒数。发现耗时较长的指令(如示例中ID为0-0-402714795的指令)后,您可使用KILL '0-0-402714795'命令来取消该慢指令。

    说明PolarDB-X 1.0中一个逻辑SQL对应多条分库指令,因此为了停止一个逻辑DDL可能需要Kill多条指令。您可以从SHOW PROCESSLIST结果集的INFO列判断该指令归属的逻辑SQL。
  2. Lock conflict报错处理。PolarDB-X 1.0执行DDL操作先会加库级锁,操作完后再释放掉。KILL DDL操作很可能会导致该锁没有释放,此时再执行DDL会出现以下报错:
Lock conflict , maybe last DDL is still running
  1. 此时执行RELEASE DBLOCK命令释放该锁即可。指令取消及锁释放后,您可以选择在业务低谷或者停止期间,重新执行该 DDL。

常见问题

  • Q:为什么在DMS或其它客户端上无法显示修改后的表结构?A:为了兼容某些客户端从系统表(如COLUMNS或TABLES)中获取表结构的功能,PolarDB-X 1.0在您的0分库RDS里建立了一个影子库,影子库名与PolarDB-X 1.0逻辑库名一致,存储了逻辑库里所有的表结构等信息。
    DMS会从影子库系统表中获取PolarDB-X 1.0的表结构。在处理异常DDL过程中,由于种种原因可能会出现库表结构正常修改,但是影子库中的表结构却未修改的现象。此时您需连接到影子库,在该库中重新对表进行一次DDL操作即可。

    说明 CHECK TABLE不会检测影子库表结构与PolarDB-X 1.0逻辑库是否一致。
  • Q:执行DDL语句时出现错误码,如TDDL-4500 ERR_PARSER,该如何解决?A:关于PolarDB-X 1.0返回的常见错误码及解决方法,请参见错误代码
相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
SQL 关系型数据库 测试技术
PolarDB的Online DDL功能验证实验
本场景带您体验如何在PolarDB-X中进行Online DDL。
990 0
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了一种结合知识图谱与大型语言模型(LLM)的GraphRAG系统,利用PolarDB、通义千问及LangChain实现。知识图谱通过结构化信息、语义理解和推理等功能,增强了信息检索与自然语言处理效果。PolarDB具备图引擎与向量检索能力,适配知识图谱存储与查询。通义千问处理自然语言,LangChain则整合模型与应用。实战步骤包括环境准备、数据库配置与数据导入,并通过实例展示了图谱与向量联合检索的优越性,提升了问答系统的准确性和实用性。
|
2月前
|
监控 关系型数据库 分布式数据库
PolarDB 读写分离的最佳实践
【8月更文第27天】PolarDB 是阿里云推出的一款高度兼容 MySQL、PostgreSQL 和 Oracle 的云原生数据库服务。它支持读写分离,能够显著提高应用的性能和响应速度。本文将详细介绍如何在 PolarDB 中实施读写分离策略,并通过示例代码演示具体的配置步骤。
42 1
|
2月前
|
SQL 存储 关系型数据库
|
5月前
|
SQL canal 算法
PolarDB-X最佳实践:如何设计一张订单表
本文主要内容是如何使用全局索引与CO_HASH分区算法(CO_HASH),实现高效的多维度查询。
|
4月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之当使用DTS(数据传输服务)同步的表在目标库中进行LEFT JOIN查询时遇到异常,是什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
5月前
|
Kubernetes 关系型数据库 分布式数据库
【PolarDB开源】PolarDB与Kubernetes集成:容器化部署的最佳实践
【5月更文挑战第21天】本文介绍了将阿里云的高性能数据库PolarDB与容器编排工具Kubernetes集成的步骤。首先,需准备Kubernetes集群和PolarDB Docker镜像,安装Helm。然后,通过Helm部署PolarDB,设置存储类和副本数。接着,应用配置PolarDB连接信息,打包成Docker镜像并在K8s集群中部署。此外,调整PolarDB参数以优化性能,并使用Prometheus和Grafana监控。本文为PolarDB在Kubernetes中的最佳实践提供了指导。
121 4
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB-X最佳实践系列(五):使用通义千问和存储过程快速生成测试数据
我们在测试数据库性能的过程中,通常需要生成一批测试数据。 以前,一般要写一段程序或者脚本来完成这项工作,但现在是2024年啦!时代变了!
PolarDB-X最佳实践系列(五):使用通义千问和存储过程快速生成测试数据
|
5月前
|
关系型数据库 MySQL 分布式数据库
PolarDB-X最佳实践系列(三):如何实现高效的分页查询
分页查询是数据库中常见的操作。本文将介绍,如何在数据库中(无论是单机还是分布式)高效的进行翻页操作。
112834 10
PolarDB-X最佳实践系列(三):如何实现高效的分页查询

相关产品

  • 云原生分布式数据库 PolarDB-X