pt-online-schema-change 实如今线DDL

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

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

1、在原表建立的三个触发器,在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语句,若不符合条件,则忽略删除这条语句);

2、在线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。
相关文章
相关标签/搜索