基于千万数据的在线表结构修改

   在系统正常运作一定时间后,随着市场、产品汪的需求不断变更,比较大的一些表结构面临不得不增加字段的方式来扩充满足业务需求;并且是不能停止服务器。在 MySQL 在体量上了千万、数据的时候,Alter Table 的操作,可以让你等一天,而且在高峰期执行这种 SQL ,会造成表被锁,增加字段的操作需要很长的时间 ,让你的数据库也承担着压力。 

方案: pt-online-schema-change 工具

       https://segmentfault.com/a/1190000014924677

方案二:土方法 rename;

1.       创建目的表结构的空表,A_new (新加的字段也有了);

2.       在A表上创建触发器,包括增、删、改触发器;这样在copy的过程中,有其他的操作的话可以同步进行处理;

3.       通过insert…select…limit N 语句分片拷贝数据到目的表 (这个可以通过一个定时器Job)去做这些事情。

4.       Copy完成后,将A_new表rename到A表。

触发器例子:

增加触发触发器;

DELIMITER   $$

 

USE   `demo_1`$$

 

DROP   TRIGGER /*!50032 IF EXISTS */ `user_insert`$$

 

CREATE

    /*!50017 DEFINER = 'root'@'localhost' */

    TRIGGER `user_insert` AFTER INSERT ON   `t_student_0`

    FOR EACH ROW

   BEGIN

          — 插入目标表

               INSERT INTO

                 `demo_1`.`t_student_1`

               VALUES

                 (new.id, new.student_id,new.name,new.age);

   END;

$$

DELIMITER ;

 

 

修改触发触发器:

DELIMITER $$

 

USE `demo_1`$$

 

DROP TRIGGER /*!50032 IF EXISTS */   `user_update`$$

 

CREATE

      /*!50017 DEFINER = 'root'@'localhost' */

      TRIGGER `user_update` AFTER UPDATE ON `t_student_0`

    FOR   EACH ROW

   BEGIN

       UPDATE `demo_1`.`t_student_1` SET   student_id=new.student_id,NAME=new.name, age=new.age WHERE id=old.id;

   END;

$$

 

DELIMITER ;

 

删除触发触发器:

 

DELIMITER   $$

 

USE   `demo_1`$$

 

DROP   TRIGGER /*!50032 IF EXISTS */ `user_delete`$$

 

CREATE

    /*!50017 DEFINER = 'root'@'localhost' */

    TRIGGER `user_delete` AFTER DELETE ON   `t_student_0`

    FOR EACH ROW

   BEGIN

     DELETE FROM `demo_1`.`t_student_1` WHERE   id=old.id;

   END;

$$

 

DELIMITER   ;