赞
踩
参考:
声明:加索引可以不锁表,MySQL 5.6 以上的新特性,可参考:MySQL 5.6版本新特性之Online DDL:在线变更表结构且不阻塞数据库服务
背景:
大家在日常工作中,往往需要对数据库的表结构做变更,一般涉及到增删字段,修改字段属性等ALTER的操作。然而,在大表场景下,特别是千万级、亿级的大表,如果处理不当,这些操作往往会引发锁表的巨大隐患,特别是在生产环境中,一旦在变更表结构过程中,出现了长时间锁表,会导致用户产生的数据长时间无法正常变更到表中,进而导致服务功能异常,结果将是灾难性的。
一般执行这种Alter类型的变更,我们可能有以下的想法:
具体操作步骤:
创建一个临时的新表,首先复制旧表的结构(包含索引)
create table new_table like old_table;
给新表加上新增的字段
把旧表的数据复制过来(需注意复制过程也需要时间,这时如果有已经复制完的数据又被用户修改后,可能会导致复制后的数据不能保持最新的。所以原表如果有记录了数据的写入时间字段就最好了(比如modify_time),可以找到执行这一步操作之后的数据,并重复导入到新表,直到数据差异很小。不过还是会可能损失极少量的数据。)
insert into new_table(filed1,filed2…) select filed1,filed2,… from old_table;
删除旧表,重命名新表的名字为旧表的名字
建议:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。