pt-osc需主键或唯一非空索引支持分块与同步,否则报错;加字段/索引均通过建影子表+增量同步+原子切换实现,参数如--chunk-size、--max-load等须显式配置;mysql 5.6+简单变更优先用原生online ddl。

MySQL 大表加字段或加索引时,用 pt-online-schema-change(简称 pt-osc)能基本避免锁表,但不是“一跑就完事”,关键在前提条件和参数控制。
必须有主键或唯一非空索引
pt-osc 依赖这个索引来分块(chunk)拷贝数据,并通过触发器精准同步增量变更。如果表没有满足条件的索引,它会直接报错:
Cannot chunk the table because no suitable index exists
- 主键定义为
id INT PRIMARY KEY NULL—— 语法允许,但语义上失效,不被认可 - 用
UNIQUE KEY (a,b),但 a 列大量为 NULL —— 分片扫描失败 - 只有普通二级索引(如
INDEX idx_xxx(col))—— 不唯一、可为空,不能用
加字段和加索引的操作写法
两者都走同一流程:建影子表 → 改影子表结构 → 增量同步 → 原子切换。区别只在 --alter 参数内容:
- 加字段示例:
pt-online-schema-change --alter "ADD COLUMN remark VARCHAR(255) DEFAULT ''" D=mydb,t=order_data --execute - 加索引示例:
pt-online-schema-change --alter "ADD INDEX idx_user_id(user_id)" D=mydb,t=user_log --execute
注意:不要写 CREATE INDEX,统一用 ADD INDEX 或 ADD COLUMN 等 ALTER 子句形式。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
几个关键参数要设对
默认行为可能在高并发下出问题,建议显式指定:
-
--chunk-size=1000:控制每次拷贝行数,避免单次事务过大 -
--max-load="Threads_running=25":当 MySQL 正在运行线程超限时暂停拷贝,保护业务 -
--critical-load="Threads_running=50":达到该阈值直接退出,防雪崩 -
--lock-wait-timeout=6:避免因锁等待太久卡住整个流程 -
--set-vars="innodb_lock_wait_timeout=6,wait_timeout=10000":调优会话级超时
优先考虑原生 Online DDL
如果是 MySQL 5.6+,且只是加二级索引或加可空字段,原生命令更轻量:
ALTER TABLE t ADD INDEX idx_xxx(col), ALGORITHM=INPLACE, LOCK=NONE;ALTER TABLE t ADD COLUMN c1 INT NULL, ALGORITHM=INPLACE;
pt-osc 是 fallback 方案,不是默认首选。它适合复杂变更(如改列类型、加 NOT NULL 字段)、旧版本 MySQL,或你明确需要全程可控、可中断、可监控的场景。










