开发者社区 问答 正文

DDL 常见问题处理在哪里?

建表的时候执行出错怎么办?

DRDS DDL 的执行是一个分布式处理过程,出错可能导致各个分片表结构不一致,所以需要进行手动清理。

步骤如下:

DRDS 会提供基本的错误描述信息,比如语法错误等。如果错误信息太长,则会提示用户调用 SHOW WARNINGS 的 SQL 命令来查看每个分库执行失败的原因。

可以通过 SHOW TOPOLOGY 命令来查看物理表的拓扑结构。SHOW TOPOLOGY的具体用法请参考 DRDS 控制指令。

SHOW TOPOLOGY FROM multi_db_multi_tbl;
+------+-----------------+-----------------------+
| ID   | GROUP_NAME      | TABLE_NAME            |
+------+-----------------+-----------------------+
|    0 | corona_qatest_0 | multi_db_multi_tbl_00 |
|    1 | corona_qatest_0 | multi_db_multi_tbl_01 |
|    2 | corona_qatest_0 | multi_db_multi_tbl_02 |
|    3 | corona_qatest_1 | multi_db_multi_tbl_03 |
|    4 | corona_qatest_1 | multi_db_multi_tbl_04 |
|    5 | corona_qatest_1 | multi_db_multi_tbl_05 |
|    6 | corona_qatest_2 | multi_db_multi_tbl_06 |
|    7 | corona_qatest_2 | multi_db_multi_tbl_07 |
|    8 | corona_qatest_2 | multi_db_multi_tbl_08 |
|    9 | corona_qatest_3 | multi_db_multi_tbl_09 |
|   10 | corona_qatest_3 | multi_db_multi_tbl_10 |
|   11 | corona_qatest_3 | multi_db_multi_tbl_11 |
+------+-----------------+-----------------------+
12 rows in set (0.21 sec)
使用 CHECK TABLE tablename指令来查看逻辑表是否创建成功。比如下面的例子展示了 multi_db_multi_tbl 的某个物理分表没有创建成功。

mysql> check table multi_db_multi_tbl;
+-------------------------------------------------+-------+----------+---------------------------------------------------------------------------+
| TABLE                                           | OP    | MSG_TYPE | MSG_TEXT                                                                  |
+-------------------------------------------------+-------+----------+---------------------------------------------------------------------------+
| andor_mysql_qatest. multi_db_multi_tbl | check | Error    | Table 'corona_qatest_0. multi_db_multi_tbl_02' doesn't exist |
+-------------------------------------------------+-------+----------+---------------------------------------------------------------------------+
1 row in set (0.16 sec)
使用幂等的方式继续执行建表操作或删表操作,会创建或删除剩余的物理表。

CREATE TABLE IF NOT EXISTS table1
(id int, name varchar(30), primary key(id))
dbpartition by hash(id);  
DROP TABLE IF EXISTS table1;
建索引失败、加列失败怎么办?

建索引失败、加列失败的处理方法跟上面建表失败的处理类似。具体请参考 DDL 异常处理文档。

展开
收起
猫饭先生 2017-10-30 11:27:15 1693 分享 版权
阿里云 AI 助理回答

当您在使用阿里云分布式关系型数据库(DRDS)时,如果遇到建表、建索引或修改表结构(如加列)操作执行出错的情况,可以按照以下步骤进行处理:

1. 查看错误信息

  • 首先,查看DRDS返回的错误描述。这通常会提供一些基础的错误原因,比如语法错误。
  • 如果错误信息提示太长,可以通过执行SHOW WARNINGS;命令来获取详细的错误日志,了解每个分库执行失败的具体原因。

2. 检查表结构

  • 使用SHOW TOPOLOGY FROM 表名;命令来查看逻辑表在各个物理分片上的分布情况,确认哪些分片上的表结构可能未正确创建或已损坏。
  • 进一步通过CHECK TABLE 表名;指令检查逻辑表的状态,以识别哪些物理表存在异常。

3. 清理与修复

  • 对于未成功创建的表或索引,根据错误信息分析原因后,可以尝试重新执行相应的DDL语句。由于DRDS支持幂等性操作,重复执行相同的建表或建索引语句,理论上只会对尚未成功执行的分片生效,避免对已成功的分片造成影响。

    • 建表示例:CREATE TABLE IF NOT EXISTS table_name (...) [partitioning strategy];
    • 删除不存在的表:DROP TABLE IF EXISTS table_name;
  • 如果是添加列或索引失败,同样需要根据具体情况分析,并尝试重新执行正确的ALTER TABLE语句。

4. 参考官方文档

  • 阿里云DRDS提供了详细的DDL异常处理文档,其中包含了更多具体的故障排查和解决方法,请参考该文档进行深入处理。

5. 联系技术支持

  • 如果以上步骤无法解决问题,或者问题复杂难以自行解决,建议联系阿里云的技术支持团队,他们能提供更专业的帮助和指导。

记得在进行任何操作前备份重要数据,以防不测。在处理这类问题时,耐心和细致地分析每一步操作的结果是非常关键的。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答