在项目开发中,如果遇到一张表在后期的迭代中,发现需要进行DDL操作如加索引、增删列以满足需求。
数据量不大
数据量小的时可以直接在线修改表结构,这样影响不大;
数据量较大
但是数据量很大有百万甚至千万级的数据,要如何修改表字段呢?直接执行使用ALTER语句肯定是不现实的,这涉及到锁表以及重建表结构等操作,耗时严重并且影响线上业务。
1、备份原始数据
select * from t_goods into outfile ‘/bak/goods.txt’;
2、复制原表物理结构
create table t_goods_new like t_goods;
3、执行表结构修改,这里是增加索引
alter table t_goods_new
add index ( good_code
);
4、把原表数据导入新表
mysql> insert into t_goods_new select * from t_goods ;
5、删除原表
drop table t_goods;
6、新表重命名原表
rename table t_goods_new to t_goods;
注意:
1、这种方式在数据拷贝-新表改名使用期间,会存在少部分的数据写入存储到旧表中,这里事后需要根据时间节点做一次手动数据同步
2、这种方法仍然会影响业务运行,建议使用在线DDL工具:pt-online-schema-change,且在访问量少时进行
3、大多数的alter table操作都会涉及lock–>copy to new table–>rename–>unlock的过程,锁表时间会很长,而且alter table 的process不可被kill,一旦执行就不可回退。