PolarDB-X 1.0-SQL 手册-DDL任务管理-最佳实践

简介: 本文将介绍一些对PENDING任务进行合适处理的最佳实践。

本文将介绍一些对PENDING任务进行合适处理的最佳实践。

背景介绍

新的DDL任务引擎启用时,当DDL执行失败或者被意外中断后,对应的DDL任务会处于PENDING待处理的状态,此时必须对该PENDING状态进行合适的任务处理,才能解除PENDING状态并恢复正常访问,否则后续的DDL将会被禁止执行并报错。

处理原则

  • 您可以通过SHOW [FULL] DDL语句查看DDL任务的信息和失败原因(即REMARK字段记录的异常信息)。
  • 您也可以参见如下常用的处理方式(建议您请根据实际情况选择最适合的方式):
  • 分析失败原因,修复或排除导致失败的因素(例如是由于数据问题导致的任务失败,则您可以通过去重等方式订正数据。如果是由于其它约束导致的失败,请确认是否能够去掉约束等)。修复完成后,使用RECOVER DDL恢复该PENDING 任务。
  • 如果导致失败的因素无法解除,并且DDL因失败而不能真正执行,您可以使用REMOVE DDL删除任务(务必确认DDL没有真正执行才可删除,否则可能造成不一致状态),删除后恢复可访问状态。
  • 如果您想直接删除DDL任务失败的表(比如表中无数据,可以直接删除重建),您可以使用REMOVE DDL删除任务,然后再执行DROP TABLE IF EXISTS删除表(务必确认表中无数据,或者数据可以丢弃,并且DROP TABLE一定要指定IF EXISTS语法,确保强制删除)。

示例

如下示例展示了对执行失败后处于PENDING状态的DDL任务进行处理的过程。

  1. 建表时没有指定主键,并且插入了带有重复值的数据行(ID=1有两行数据):
  1. mysql> create table test_pending (id intnotnull, age int) dbpartition by hash(id);
  2. Query OK,0 rows affected (0.33 sec)
  3. mysql> insert into test_pending values(1,10),(1,20),(2,20),(3,30);
  4. Query OK,4 rows affected (0.10 sec)
  5. mysql>select*from test_pending order by id;
  6. +------+------+
  7. | id   | age  |
  8. +------+------+
  9. |    1|   10|
  10. |    1|   20|
  11. |    2|   20|
  12. |    3|   30|
  13. +------+------+
  14. 4 rows inset(0.10 sec)
  1. 之后想为上述ID加上主键约束,但由于表中已有数据违反了唯一性约束,因此DDL执行失败:
  1. mysql> alter table test_pending add primary key (id);
  2. ERROR 4636(HY000):[f5be83373466000][10.81.69.55:3306][ddltest]ERR-CODE:[TDDL-4636][ERR_DDL_JOB_ERROR]Not all physical operations have been done successfully: expected 9,
  3. but done8.Causedby:1062:DDLTEST_1562056402230OYMK_7WW7_0001:Duplicate entry '1'for key 'PRIMARY' on `test_pending`;.
  1. 通过SHOW FULL DDL语句查看任务状态和失败原因,发现其中一个物理表中的数据有重复值导致了物理DDL执行失败:
  1. mysql> show full ddl\G
  2. ***************************1. row ***************************
  3.       JOB_ID:1106733441212637184
  4. PARENT_JOB_ID:0
  5.       SERVER:1:102:10.81.69.55
  6. OBJECT_SCHEMA: ddltest
  7.  OBJECT_NAME: test_pending
  8. NEW_OBJECT_NAME:
  9.     JOB_TYPE: ALTER_TABLE
  10.        PHASE: EXECUTE
  11.        STATE: PENDING
  12.     PROGRESS:77%
  13.   START_TIME:2019-09-0617:17:55.002
  14.     END_TIME:2019-09-0617:17:55.273
  15. ELAPSED_TIME(MS):271
  16.     DDL_STMT: alter table test_pending add primary key (id)
  17.       REMARK: ERR-CODE:[TDDL-4636][ERR_DDL_JOB_ERROR]Not all physical operations have been done successfully: expected 9, but done8.Causedby:1062:DDLTEST_1562056402
  18. 230OYMK_7WW7_0001:Duplicate entry '1'for key 'PRIMARY' on 'test_pending';.
  • REMARK字段中的详细信息解释如下:
  • Not all physical operations have been done successfully: expected 9, but done 8.:该逻辑表的DDL涉及到9个物理DDL的执行,完成了8个,有1个失败了,这个失败的物理DDL导致整个逻辑DDL失败,任务被置于PENDING状态。
  • Caused by: 1062:DDLTEST_1562056402 230OYMK_7WW7_0001:Duplicate entry '1' for key 'PRIMARY' on 'test_pending';:失败的根源在于DDLTEST_1562056402 230OYMK_7WW7_0001物理库的test_pending物理表中有ID字段的重复数据1,导致无法添加主键约束。
  1. 此时逻辑表处于不一致的状态:
  1. mysql> check table test_pending;
  2. +----------------------------------------+-------+----------+-------------------------------------------------------------------------------------------------------------+
  3. | TABLE                                  | OP    | MSG_TYPE | MSG_TEXT                                                                                                    |
  4. +----------------------------------------+-------+----------+-------------------------------------------------------------------------------------------------------------+
  5. | ddltest_1562056402230oymk.test_pending | check |Error    |Table'DDLTEST_1562056402230OYMK_7WW7_0001.test_pending' find incorrect columns 'id', please recreate table |
  6. +----------------------------------------+-------+----------+-------------------------------------------------------------------------------------------------------------+
  7. 1 row inset(0.04 sec)
  1. 执行其它 DDL 也会被禁止,收到相应的错误:
  1. mysql> drop table test_pending;
  2. ERROR 4644(HY000):[f5beae39d466000][10.81.69.55:3306][ddltest]ERR-CODE:[TDDL-4644][ERR_PENDING_DDL_JOB_EXISTS]Another DDL job '1106733441212637184'with operation 'ALTER_
  3. TABLE'is pending on ddltest.test_pending in ddltest.Pleaseuse SHOW DDL to check it,andthen recover or rollback it using RECOVER DDL or ROLLBACK DDL,or just remove it us
  4. ing REMOVE DDL if you confirm that the pending job can be discarded.
  1. 接下来,根据前面所述的常见的处理方式,有如下几种选择进行继续处理(分别展示它们的效果):
  • 去重(删除重复的数据)后,恢复DDL任务,继续完成添加主键约束的操作
  1. 删除重复数据(根据业务需要,仅保留一条数据),删除数据操作可以通过PolarDB-X执行,也可以根据报错信息,直接连接到PolarDB-X后端的RDS物理库中操作:
  1. mysql>deletefrom test_pending where id=1and age=20;
  2. Query OK,1 row affected (0.07 sec)
  3. mysql>select*from test_pending order by id;
  4. +------+------+
  5. | id   | age  |
  6. +------+------+
  7. |    1|   10|
  8. |    2|   20|
  9. |    3|   30|
  10. +------+------+
  11. 3 rows inset(0.02 sec)
  1. 确认表中已经没有重复数据后,恢复之前PENDING的DDL任务的执行(恢复成功,完成的任务被自动清理,主键添加成功):
  1. mysql> recover ddl 1106733441212637184;
  2. Query OK,0 rows affected (1.28 sec)
  3. mysql> show full ddl\G
  4. Emptyset(0.00 sec)
  5. mysql> show create table test_pending\G
  6. ***************************1. row ***************************
  7. Table: test_pending
  8. CreateTable: CREATE TABLE `test_pending`(
  9. `id`int(11) NOT NULL,
  10. `age`int(11) DEFAULT NULL,
  11. PRIMARY KEY (`id`),
  12. KEY `auto_shard_key_id`(`id`) USING BTREE
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`id`)
  14. 1 row inset(0.02 sec)
  15. mysql> check table test_pending;
  16. +----------------------------------------+-------+----------+----------+
  17. | TABLE                                  | OP    | MSG_TYPE | MSG_TEXT |
  18. +----------------------------------------+-------+----------+----------+
  19. | ddltest_1562056402230oymk.test_pending | check | status   | OK       |
  20. +----------------------------------------+-------+----------+----------+
  21. 1 row inset(0.10 sec)
  • 直接删除任务,然后删除表(测试数据可以丢弃),后续再根据需要重新创建该表
  1. mysql> remove ddl 1106733441212637184;
  2. Query OK,1 row affected (0.02 sec)
  3. mysql> drop table if exists test_pending;
  4. Query OK,0 rows affected (0.44 sec)
  5. mysql> show tables like 'test_pending';
  6. Emptyset(0.01 sec)
相关文章
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
996 3
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
SQL 存储 监控
SQL数据库安装指南:步骤详解与最佳实践
安装和配置SQL数据库可能是一个复杂的过程,但通过遵循本文提供的详细步骤和最佳实践,您可以确保数据库的成功安装和高效运行。无论您是初学者还是经验丰富的数据库管理员,掌握SQL数据库的安装和管理技能都是至关重要的。通过不断学习和实践,您将能够更好地利用SQL数据库来支持您的业务需求和数据分析工作。记住,定期维护和优化数据库是保证其长期性能和稳定性的关键。祝您在安装和配置SQL
|
NoSQL 关系型数据库 MySQL
阿里云PolarDB游戏场景最佳实践
阿里云PolarDB游戏场景最佳实践涵盖了数据库体系演进、行业优化、Redis解决方案、性能优化、备份还原及全球部署等内容。PolarDB通过共享存储、物理复制等技术提升读扩展和大容量支持,针对游戏行业的高IO需求进行优化,提供秒级备份与快速恢复能力。同时,PolarDB for Redis实现了一写多读架构,支持百TB级别的高性能存储,具备成本优势。该方案已在米哈游等大型游戏中广泛应用,确保了高并发下的稳定性和数据一致性,满足游戏行业的特殊需求。
777 36
|
人工智能 关系型数据库 分布式数据库
PolarDB-PG AI最佳实践3 :PolarDB AI多模态相似性搜索最佳实践
本文介绍了如何利用PolarDB结合多模态大模型(如CLIP)实现数据库内的多模态数据分析和查询。通过POLAR_AI插件,可以直接在数据库中调用AI模型服务,无需移动数据或额外的工具,简化了多模态数据的处理流程。具体应用场景包括图像识别与分类、图像到文本检索和基于文本的图像检索。文章详细说明了技术实现、配置建议、实战步骤及多模态检索示例,展示了如何在PolarDB中创建模型、生成embedding并进行相似性检索
|
SQL 人工智能 关系型数据库
PolarDB-PG AI最佳实践 2 :PolarDB AI X EAS实现自定义库内模型推理最佳实践
PolarDB通过POLAR_AI插件支持使用SQL调用AI/ML模型,无需专业AI知识或额外部署环境。结合阿里云EAS在线模型服务,可轻松部署自定义模型,在SQL中实现如文本翻译等功能。
|
SQL 人工智能 自然语言处理
PolarDB-PG AI最佳实践 1:基础能力实践
Polar_AI 是 PolarDB 数据库的 AI 扩展,集成了先进的人工智能模型和算法,使数据库能够执行机器学习和自然语言处理任务。它支持 PostgreSQL 及 Oracle 兼容版本,通过标准 SQL 轻松调用 AI 模型,具备简单易用、灵活可定制、无缝数据融合、数据安全和高性能等优势。用户可以通过 SQL 快速实现文本转向量、情感分类等功能,并能自定义扩展 AI 模型。
|
SQL 存储 数据库
SQL语句给予用户权限:技巧、方法与最佳实践
在数据库管理中,为用户分配适当的权限是确保数据安全性和操作效率的关键步骤
1046 5

热门文章

最新文章

相关产品

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