背景:MySQL5.6在线DDL不锁表,现在我有一张1亿的表,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作?

操作如下:

1.注意磁盘空间(临时表目录) 

2.当前内存剩余量 

3.当前有没有大的事务在执行 

4.innodb_online_alter_log_max_size参数 

5.然后在从上添加,再在主上添加(不记录binlog),处理完成后再开启

如果直接先在主上操作,那么会导致主从延迟很大(在量比较大的情况下)。因为主从复制,从库的SQL线程是单进程,它接收到主库的BINLOG,要一条一条执行,一条SQL卡住了,后面的SQL就会排队等待,这时同步就延迟了

附注:

在之前的版本,InnoDB引擎是通过以下步骤来进行DDL的: 

1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)—-> create table tmp_table like original_table; 

2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等,一行行的把原表数据拷贝到临时表里,且更新索引) 

3 执行insert into tmp_table select * from original_table 

4 rename original_table和tmp_table,最后drop original_table 

5 释放 write lock。

如查采用第三方工具推荐使用pt-online-schema-change