Skip to content

执行 ddl 的标准步骤 #3031

Answered by dcy10000
dcy10000 asked this question in Q&A
Discussion options

You must be logged in to vote

一共两种方案,根据优缺点挑选合适的方案,推荐第二种

一、直连 后端 MySQL 执行 DDL

缺点:

  • 比较麻烦。需要根据 dble 的配置,分别去不同的后端MySQL的 schema 去执行对应的 DDL。也就是说,如果是 12 分片的表,需要切换 12 个 schema 去分别执行DDL。(建议写个脚本)
  • dble 需要 用MySQL表的表结构信息(又称元数据,metadata) 进行 路由计算(比如需要把”*“解引用成所有列)。元数据是从 mysql 加载,执行完 DDL 后dble 并不知道表结构发生变化了,故还需通知 dble 去加载元数据(即执行reload @@metadata).
    如果没有加载元数据,绝大部分简单查询是可以正确查询的,因为他们不需要用到元数据即可正确下发。但是涉及插入语句(不带columns的需要dble补完的SQL)、多表的复杂查询等通常是需要用到元数据的,没有加载时,当匹配不到正确的列时就会报错:“字段不存在或者元数据不存在"。

优点:

  • DML不会报错 “TABLE[XXX] is dong DDL”

是否需要提前停业务

  • 由于执行过程中不同节点表结构存在不一致问题,以及执行前后表结构不相同。当执行一些特定的 DDL 时(比如删除表、删除列、修改列名、修改列类型等),使得原本工作正常的 DML 因为找不到正确的列 而报错,这种情况需要提前停业务。即:需要评估你的 DDL 是否影响 DML。

步骤

  1. 根据需要停业务
  2. 需要根据 dble 的配置,分别去不同的后端MySQL的 schema 去执行对应的 DDL
  3. 每台 dble 上执行

Replies: 1 comment

Comment options

dcy10000
Dec 24, 2021
Collaborator Author

You must be logged in to vote
0 replies
Answer selected by dcy10000
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
1 participant