在MySQL级联复制架构中,主库的数据变更会先同步到从库1,再从从库1同步到从库2,以此类推形成链式同步链路。当需要对大表进行字段扩容时,直接执行常规的ALTER TABLE语句很容易因为锁表、大量数据重写导致主从延迟,甚至让级联复制链路中断,因此需要采用更稳妥的操作方案。

核心注意事项
在级联复制下做字段扩容前,需要先明确几个关键前提:
- 确认扩容字段是否允许默认值,若字段非空且无默认值,会触发全表数据回填,大表下耗时极长
- 评估级联复制链路的延迟容忍度,避免扩容操作产生的日志同步到下游从库时引发连锁延迟
- 提前在测试环境模拟扩容操作,记录操作耗时和对业务的影响范围
适用扩容方案对比
不同场景下的字段扩容方案差异较大,以下是常见方案的对比:
| 方案名称 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| pt-online-schema-change工具 | 亿级以内大表,允许短时间触发器开销 | 无锁表,业务无感知 | 需要安装工具,会创建临时表和触发器 |
| gh-ost工具 | 超大表,不希望使用触发器 | 无触发器,对主库压力小 | 需要解析binlog,配置相对复杂 |
| 直接ALTER TABLE | 小表,或可接受短暂停服 | 操作简单,无需额外工具 | 会锁表,大表下会导致业务不可用 |
pt-online-schema-change扩容操作步骤
该工具是生产环境中最常用的无锁扩容方案,操作逻辑是创建与原表结构一致的临时表,修改临时表结构,然后增量同步原表数据到临时表,最后替换原表。
1. 检查原表结构
先查询需要扩容的大表结构,确认当前字段情况:
-- 查看原表结构,假设表名为order_info,数据库为test_db SHOW CREATE TABLE test_db.order_info;
2. 执行扩容命令
在级联复制的主库上执行扩容命令,注意需要指定从库地址,避免工具操作影响复制链路:
# 执行pt-online-schema-change命令,添加字段new_col,类型为VARCHAR(50),默认值为空 pt-online-schema-change --host=主库IP --port=3306 --user=管理员账号 --password=账号密码 --alter="ADD COLUMN new_col VARCHAR(50) DEFAULT NULL" --execute --chunk-size=1000 --max-lag=5 --check-replication-filter --recursion-method=processlist D=test_db,t=order_info
命令参数说明:
--chunk-size:每次处理的数据行数,避免一次性处理太多数据导致延迟--max-lag:允许的最大主从延迟秒数,超过该值会暂停操作--recursion-method:指定获取从库信息的方式,适配级联复制架构
3. 验证扩容结果
操作完成后,检查主库和各级从库的表结构是否一致:
-- 主库验证 USE test_db; DESC order_info; -- 从库1验证 USE test_db; DESC order_info; -- 从库2验证 USE test_db; DESC order_info;
gh-ost扩容操作步骤
如果不希望使用触发器,可以选择gh-ost工具,它通过解析binlog实现增量数据同步。
1. 准备gh-ost配置文件
创建配置文件ghost_config.txt,内容如下:
host=主库IP port=3306 user=管理员账号 password=账号密码 database=test_db table=order_info alter=ADD COLUMN new_col VARCHAR(50) DEFAULT NULL chunk-size=1000 max-lag-millis=5000 assume-rbr
2. 执行扩容命令
# 执行gh-ost命令,指定配置文件 gh-ost --conf=ghost_config.txt --execute --initially-drop-ghost-table --initially-drop-old-table --ok-to-drop-table
3. 验证结果
同样需要检查主库和所有级联从库的表结构,确认字段添加成功,且复制状态正常:
-- 查看从库复制状态,确认没有错误 SHOW SLAVE STATUSG
扩容后的检查工作
字段扩容完成后,还需要做以下检查:
- 检查级联复制链路的所有从库
SHOW SLAVE STATUS输出,确认Slave_IO_Running和Slave_SQL_Running都为YES,无复制错误 - 抽样查询大表数据,确认新增字段的值符合预期,没有数据丢失或异常
- 观察业务监控,确认扩容操作没有引发接口报错或响应时间上升
注意:如果扩容字段需要添加非空约束且无默认值,建议先添加允许为空的字段,再通过批量更新的方式回填数据,最后修改字段为非空,避免一次性全表回填导致长时间锁表或延迟。
MySQL级联复制大表字段扩容ALTER_TABLE修改时间:2026-06-27 23:06:32