使用 pt-online-schema-change 拷贝表并保持同步

说明

  • pt-osc是percona公司下percona-toolkit中的一款 在线变更表结构 的工具
  • 实现原理是基于触发器
  • 变更表结构流程:
    • 先创建变更表结构后的新表,旧表绑定增、删、改的触发器
    • 分段加锁,将旧表的数据插入新表中
    • 数据拷贝完成后,新旧表加锁,更改新旧表表名,删除旧表及旧表触发器,完成数据拷贝
  • 可以通过 –no-swap-tables –no-drop-old-table –no-drop-triggers 参数,跳过新旧表变更表名,删除触发器,删除旧表这几步
  • 通过 –new-table-name 指定执行拷贝时生成的新表表名,实现自定义拷贝后新表表名的目的

参数说明

  • –max-load “Threads_running=25”:执行时,查询 Threads_running ,如果超过指定值,则 waiting ,等降低后在继续执行
    • Threads_running 查询:show global status like ‘Threads_running’
  • –no-drop-old-table:执行结束后,不删除旧表
  • –no-drop-triggers:拷贝结束后,不删除旧表触发器
  • –no-swap-tables:拷贝结束后,不切换新旧表
  • –new-table-name:指定生成的临时新表的表名,需为已存在的表,否则无法继续
  • –charset=utf8:指定使用 utf8 编码
  • –quiet:无死锁时仅打印 error 和 warning

实践

1
2
3
4
5
# 拷贝表并不删除触发器,保持数据实时同步
sudo pt-online-schema-change  --ask-pass --alter "engine=InnoDB"  \
h=127.0.0.1,P=3306,u=user,t=tbl_name,D=db_name \
--new-table-name=new_tbl_name --charset=utf8 \
--no-swap-tables --no-drop-old-table --no-drop-triggers --execute