这是我想做的: 1. 将一个奴隶从我的生产主人身上吊下来。2. 停止复制 3. 调整一些数据类型并在从站上创建一些索引(无数据修改) 4. 重新启动复制 5. 一旦从站赶上,锁定数据库并交换从站和主站
-目标,obv。是在进行一些需要时间的更改(修改 200G 表)时没有明显的停机时间 - 这应该是可能的,因为我所做的 DDL 更改与缩小数据类型和添加约束有关 - 没有任何改变实际数据的价值。- 由于 GTID 复制是基于行的,我不知道复制是否会阻塞尝试插入,例如,将 11 位数字 ID 插入 5 位数字 ID 列,即使值在范围内。
您已经描述了进行 DDL 更改的常用方法。是的,它应该工作。但是...请进一步描述数据类型的变化。
如果您正在将当前 INT SIGNED 的 COLUMN 更改为 SMALLINT SIGNED,并且没有任何值大于 32767,则应该没有问题。如果您正在从 SIGNED 更改为 UNSIGNED,并且没有数字是负数,那么没问题。等等。一般来说,如果旧值适合新数据类型,那么就可以了。如果它不合适,那么就会丢失一些东西。100万变成一个SMALLINT UNSIGNED大概会变成65535。
至于应用程序,mysql 如何知道它正在获取一个11 位数字的 ID?它看到一些数字并将其推入目标大小。
SHOW WARNINGS;
在 DDL 之后执行。