33
回答
mysql亿级表增加一个字段
华为云4核8G,高性能云服务器,免费试用   

mysql亿级表增加一个字段 ,例如;alter table table1 add id int

每次都执行失败,原表大约有5亿行数据,30G,在执行alter table 时创建的临时表到大约19G的时候就停止了,这是为什么

举报
共有33个答案 最后回答: 5天前

可以试试这种办法:

复制这个表的结构创建新的表xx_temp,然后在新的表增加你要的字段,然后再把数据一批批插入到新表xx_temp,最后旧表改为_bak,新表去掉_temp。

CREATE TABLE 新表
SELECT * FROM 旧表 WHERE 1=2

 

虽然只是一条语句,但必须锁表,然后涉及到几乎整张表的数据的重新存储。毕竟不是列式数据库。正确的做法就是,建立一样的空表,然后把字段加上去,然后回来把数据从旧表中插入新表中,最后删除旧表,把新表名字改成旧表名字。

--- 共有 3 条评论 ---
刘建业你可以写一个程序根据条件一批一批的导入,这样还不会影响现行业务。如果一直导肯定会卡死。 1周前 回复
mingzhongzhuding数据量太大 这样做要插入到什么时候? 2周前 回复
java_loser这个方法似曾相似,膜拜 2周前 回复

老哥,大批量连接,海量数据复制,我不知道你们复制的时候生产的5亿数据有没有卡死,理论上来讲是会卡死的,并不是在19G的问题,而是你的机器及数据库相关配置只能支撑到那个复制量级,我个人建议,你可以考虑修改原来表的文件参数,mysql都有一个表文件,不是表结构,你可以去查下资料,或者搞表复制,这个比较耗时

--- 共有 3 条评论 ---
零度以上 回复 @谁用了布衣 : 呵呵,只能说明你们公司对操作数据库太随便了,随便这么决定用alter这个方案了。。 2周前 回复
NickYoung 回复 @谁用了布衣 : 我觉得可能是死锁或者连接过多导致表卡死,你可以先通过show processlist查看下状态和执行sql,然后再继续深入,不过我觉得不应该把时间浪费在不可行的方案上 3周前 回复
谁用了布衣19G是我看alter table执行时产生的临时表的文件大小,每次都到19G就停止增长了,我就想知道这是为什么,不用考虑效率,正常生产环境下不会做这样的操作 3周前 回复
顶部