Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DM: update optimistic shard ddl #9317

Merged
merged 8 commits into from
May 25, 2022
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Apply suggestions from code review
  • Loading branch information
ran-huang authored May 25, 2022
commit 5e8f6e2fbda52328509b7ddd2e8146f76e36171f
18 changes: 9 additions & 9 deletions dm/feature-shard-merge-optimistic.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,23 @@ DM 支持在线上执行分库分表的 DDL 语句(通称 Sharding DDL),
- 例如:在分表执行过 `ADD COLUMN A INT; DROP COLUMN A; ADD COLUMN A FLOAT;`,在其他分表直接执行 `ADD COLUMN A FLOAT` 即可,不需要三条 DDL 都执行一遍。
- 执行 DDL 时要注意观察 DM 迁移状态。当迁移报错时,需要判断这个批次的 DDL 是否会造成数据不一致。

“乐观协调”模式下,上游执行的大部分 DDL 无需特别关注,将自动同步,本文使用“一类 DDL” 指代。同时,还有一部分改变列名、列属性或列默认值的 DDL,称为“二类 DDL”,上游执行时需要特别注意: 上游在执行时必须**保证该 DDL 在各分表中按相同的顺序**执行。
“乐观协调”模式下,上游执行的大部分 DDL 无需特别关注,将自动同步,本文使用“一类 DDL” 指代。同时,还有一部分改变列名、列属性或列默认值的 DDL,称为“二类 DDL”,上游执行时要注意必须**保证该 DDL 在各分表中按相同的顺序**执行。

“二类 DDL” 举例如下:

- `ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(20)`(修改列的类型)
- `ALTER TABLE table_name RENAME COLUMN column_1 TO column_2;`(重命名列)
- `ALTER TABLE table_name ADD COLUMN column_1 NOT NULL;`(增加没有默认值且非空的列)
- `ALTER TABLE table_name RENAME INDEX index_1 TO index_2;`(重命名索引)
- 修改列的类型:`ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(20)`。
- 重命名列:`ALTER TABLE table_name RENAME COLUMN column_1 TO column_2;`。
- 增加没有默认值且非空的列:`ALTER TABLE table_name ADD COLUMN column_1 NOT NULL;`。
- 重命名索引:`ALTER TABLE table_name RENAME INDEX index_1 TO index_2;`。

各分表在执行以上 DDL 时,若顺序不同将导致同步中断,例如下述场景:

- 分表 1 先重命名列,再修改列类型
1. `ALTER TABLE table_name RENAME COLUMN column_1 TO column_2;`(重命名列)
2. `ALTER TABLE table_name MODIFY COLUMN column_3 VARCHAR(20);`(修改列类型)
1. 重命名列:`ALTER TABLE table_name RENAME COLUMN column_1 TO column_2;`。
2. 修改列类型:`ALTER TABLE table_name MODIFY COLUMN column_3 VARCHAR(20);`。
- 分表 2 先修改列类型,再重命名列
1. `ALTER TABLE table_name MODIFY COLUMN column_3 VARCHAR(20)`(修改列类型)
2. `ALTER TABLE table_name RENAME COLUMN column_1 TO column_2;`(重命名列)
1. 修改列类型:`ALTER TABLE table_name MODIFY COLUMN column_3 VARCHAR(20)`。
2. 重命名列:`ALTER TABLE table_name RENAME COLUMN column_1 TO column_2;`。

此外,不论是使用“乐观协调”或“悲观协调”,DM 仍是有以下限制:

Expand Down