常见线上变更表结构的方法有两种,第一种是online ddl ,alter, 第二种是用类似工具percona。本文主要用实例描述下第二种方式的基本原理。

原理 

 percona  等工具的原理比较简单。1,copy 一个新表;2,alter 表结构; 3,添加 update, delete, insert 三个触发器;4,insert igonore 原表的数据;5,删掉触发器。这里不用加锁就是因为有触发器在同步新增的改动,所有,一旦以前表有触发器,就不适合这种方式。

操作实例

1, 新建一个表


create table person(id int ,name varchar(8), PRIMARY KEY (id)) ;

2, 插入1条记录


insert person (id, name) values (1, "zhangsan");

3,  变更表结构


pt-online-schema-change --alter 'add column sex varchar(100)' p='123456',u=root,D=test,t=person --no-check-replication-filters --execute

4, 日志解析:


No slaves found.  See --recursion-method if host didi has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `test`.`person`...
Creating new table...
Created new table test._person_new OK.
Altering new table...
Altered `test`.`_person_new` OK.
2019-08-29T20:05:34 Creating triggers...
2019-08-29T20:05:34 Created triggers OK.
2019-08-29T20:05:34 Copying approximately 1 rows...
2019-08-29T20:05:34 Copied rows OK.
2019-08-29T20:05:34 Analyzing new table...
2019-08-29T20:05:34 Swapping tables...
2019-08-29T20:05:34 Swapped original and new tables OK.
2019-08-29T20:05:34 Dropping old table...
2019-08-29T20:05:34 Dropped old table `test`.`_person_old` OK.
2019-08-29T20:05:34 Dropping triggers...
2019-08-29T20:05:34 Dropped triggers OK.
Successfully altered `test`.`person`.

这里没有insert ignore 是因为操作过程中,没有增删改的记录,并没有触发。这里还可以做下压测,看记录插入速度如何。

09-01 20:49