问题参考自: https://www.zhihu.com/question/440231149 ,mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?答案为个人原创
以前老版本 MySQL 添加一列的方式:
ALTER TABLE 你的表 ADD COLUMN 新列 char(128);
会造成锁表,简易过程如下:
新建一个和 Table1 完全同构的 Table2
对表 Table1 加写锁
在表 Table2 上执行 ALTER TABLE 你的表 ADD COLUMN 新列 char(128)
将 Table1 中的数据拷贝到 Table2
将 Table2 重命名为 Table1 并移除 Table1,释放所有相关的锁
如果数据量特别特别大,那么锁表时间很长,期间所有表更新都会阻塞,线上业务不能正常执行。
针对 MySQL 5.6(不包含)之前的版本,通过触发器将一个表的更新在另一个表上重复,并进行数据同步,当数据同步完成时,业务上修改表名为新表并发布。业务不会暂停。触发器设置类似于:
create trigger person_trigger_update AFTER UPDATE on 原有表 for each row
begin set @x = "trigger UPDATE";
Replace into 新表 SELECT * from 原有表 where 新表.id = 原有表.id;
END IF;
end;
MySQL 5