MySql中大数据表的ALTER TABLE操作是非常耗时的。今天讨论下如何快速完成表结构的修改?
ALTER TABLE的原理是用新结构创建一张新表,然后将旧表的数据拷贝进新表,最后再删除旧表。ALTER TABLE会导致数据操作服务中断。常用的方式是主备切换和影子拷贝。
主备切换:先在一台不提供服务的机器上执行ALTER TABLE操作,然后和提供服务的主库进行切换。
影子拷贝:用要求的表结构创建一张和源表无关的新表,然后通过重命名和删除表操作交换两张表。
Hack手法
理论:由于MySql表中列的默认值实际上存在表的.frm文件中,所以可以直接修改这个文件而不需要改动表本身。MySql官方并没有采用这种优化方法,所有的MODIFY COLUMN操作都将导致表重建。或者我们可以使用ALTER COLUMN,这句话可以直接修改.frm文件而不涉及表数据。因此ALTER COLUMN操作比ALTER TABLE操作快很多。
方法:直接修改.frm文件的方法虽然可以快速修改表,但却存在一定的风险,所以在使用时应该考虑清楚。基本技术是创建一个新的.frm文件,然后替换掉旧的.frm文件。
步骤:
①创建一张有相同结构的空表,并进行所需要的修改;
②执行FLUSH TABLES WITH READ LOCK锁定所有正在使用的表