常见线上变更表结构的方法有两种,第一种是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 是因为操作过程中,没有增删改的记录,并没有触发。这里还可以做下压测,看记录插入速度如何。