使用 pt-online-schema-change 对大表执行非阻塞 ALTER
MySQL在线操作命令
# First --dry-run, then the same command with --execute; throttles on replica lag
pt-online-schema-change --alter "ADD COLUMN region CHAR(2) NULL, ADD INDEX ix_region (region)" \
D=shop,t=orders,h=db1,u=osc,p='Osc#2024',s=1 \
--max-lag=5 --check-replica-lag h=db2,u=osc,p='Osc#2024',s=1 \
--max-load Threads_running=50 --critical-load Threads_running=200 \
--set-vars lock_wait_timeout=5 --noversion-check --dry-run作用
创建一个新结构的空副本,分块复制行,在复制期间用触发器同步变更,最后用原子 RENAME 交换表。当负载或副本延迟超过阈值时,它会自行减速/暂停。
适用场景
用于需要 COPY 的 ALTER(列类型、字符集、PK 变更),或会造成长时间副本延迟的 ALTER。
注意
表需要有 PK 或唯一键。迁移期间触发器会给每次写入增加开销;在写入非常密集的表上,gh-ost 的影响更小。如果子表通过外键引用此表,需要 --alter-foreign-keys-method=auto。对于 caching_sha2_password 账户,请在 DSN 中添加 s=1(TLS);否则副本连接会因 'Authentication requires secure connection' 失败。--check-replica-lag 的 DSN 不会继承主 DSN 的 user / password;请单独指定。交换时会短暂获取元数据锁;请保持较低的 lock_wait_timeout,无法获取锁时它会重试。