Pt Online Schema Change

调研背景

在 mysql 5.5 版本以前,修改表结构如添加索引、修改列,需要锁表,期间不能写入,对于大表这简直是灾难。从5.5特别是5.6里,情况有了好转,支持Online DDL,而在实际alter table过程中还是会引起 data meta lock 问题。pt-online-schema-change是Percona-toolkit一员,通过改进原生ddl的方式,达到不锁表在线修改表结构。

工作原理

  • 如果存在外键,根据 alter-foreign-keys-method 参数的值,检测外键相关的表,做相应设置的处理。没有使用 alter-foreign-keys-method 指定特定的值,该工具不予执行。

  • 创建一个新的空表,其命名规则是:下划线 + 原表名 +_new—-_原表名_new

  • 根据 alter 语句,更新新表的表结构。

  • 创建触发器,用于记录从拷贝数据开始之后,对源数据表继续进行数据修改的操作记录下来,用于数据拷贝结束后,执行这些操作,保证数据不会丢失。如果表中已经定义了触发器这个工具就不能工作了。

  • 拷贝数据,从源数据表中拷贝数据到新表中。

  • 修改外键相关的子表,根据修改后的数据,修改外键关联的子表。

  • rename 源数据表为 old 表,把新表 rename 为源表名,其通过一个 RENAME TABLE 同时处理两个表,实现原子操作。(RENAME TABLE dbteamdb.user TO dbteamdb._user_old, dbteamdb._user_new TO dbteamdb.user)。

  • 将 old 表删除、删除触发器。

对数据库影响

  • 操作过程中需要对原表更新的数据通过触发器写入新表,该过程中会对原表的读写有一定影响。

  • 虽然整个过程中可以不锁表操作,但是在新旧表进行rename操作时会进行加锁操作,该过程中客户端更新操作可能会失败。

数据量rename操作时间

30W

< 1s

2200W

≈3s

使用限制

  • 表必须有主键

  • 表之前不能有触发器

  • rename操作过程中用户操作数据库有可能失败

  • 操作过程中会创建临时表,mysql的binlog日志会有所增加

总结

可以使用,在使用时,应该尽量选择在业务相对空闲时,至少修改表上的数据操作较低时,执行较为妥当。 由于可能存在一定的风险,在操作之前,建议对数据表进行备份,可以使得操作更安全、可靠。

Last updated