pt-online-schema-change 实现在线DDL

参考文章: http://seanlook.com/2016/05/27/mysql-pt-online-schema-change/

上面的文章写的很详细,在这篇文章中,想要再补充一些自己的理解。

一、在原表创建的三个触发器,在copy数据时,如何保证数据的一致?

  • insert:在原表发生insert时,同时也会将数据插入新表;
  • update:使用于replace……into的方式,若新表中没有该数据,则触发插入数据,若新表中已有该数据,则将旧数据删除,插入更新的数据。但是replace……into只能应用于表中有主键或唯一键时使用,否则replace……into会和insert一样,无法实现更新的功能。
  • delete:在新表中无相关数据,就删完原表数据,触发器会忽略在触发器内部定义的delete语句,若新表中早已复制了数据,则就出发删除该数据。具体解释:
    • create trigger db_tb_del after delete on db.tb for each row delete ignore from db._tb_new where db._tb_new.id <=> OLD.id;删除触发器操是使用after delete,即先执行删除,再触发删除触发器,执行触发器中定义的SQL(该SQL的含义为:在where条件中,若新表的id 等于 上步delete操作原表的id,则执行该delete语句,若不符合条件,则忽略删除这条语句);

二、在线DDL的几种选择

在MySQL5.6中,在线DDL的效率很低,有时会严重锁表,percona中的pt-osc可以较高效率的做在线DDL,但是注意pt-osc的使用限制。

  • 在一个表中符合以下任意条件的情况,都无法使用pt-osc:
    • 表中没有主键或唯一键;
    • 表中已存在触发器;
    • 表中有外键
  • 判断是否可以使用MySQL5.6 原生的在线DDL:
    • 创建一个和原表相同结构的表,导入少量数据,执行想要操作的DDL,检查“rows affected”是否为0,若为0,则可以使用,若非零,则意味着该操作会重建整个表,不可使用。
  • 在无法使用pt-osc工具,而且原生的在线DDL也严重影响业务时,还有一种办法:
    • 在从库上执行DDL,然后将从库升级为主库,再在旧主库上DDL。

猜你喜欢

转载自my.oschina.net/starglm/blog/1631663
今日推荐