背景
数据库:mysql8
一般情况下修改表字段的sql大家都会写。最近测试环境的表有个需求需要扩充表字段,我扩充了半个多小时还没扩充完。
原因是表数据71万,占空间1.4G。数据量太大,更新字段类型还会锁表。
解决方案
- 创建新表结构:
CREATE TABLE 新表名 LIKE 原表名;
ALTER TABLE 新表名 MODIFY COLUMN 字段名 新类型;
- 分批迁移数据:
-- 假设有主键id,分批插入,或者时间条件等其他条件也可以
INSERT INTO 新表名 SELECT * FROM 原表名 WHERE id BETWEEN 1 AND 10000;
INSERT INTO 新表名 SELECT * FROM 原表名 WHERE id BETWEEN 10001 AND 20000;
-- 继续分批...
- 切换表名:
RENAME TABLE 原表名 TO 原表名_old, 新表名 TO 原表名;
总结
用这些sql测试环境保留了近一年的数据
上面执行了半个多小时没解决的问题,这个方案几分钟就好了
基本不需要等待
但是这个方案仅限于测试环境解决问题,如果是生产环境,就要考虑整套归档方案。而不是简单的这样处理,
当然数据库停机之后,如果确保没有业务产生,也可以用这种方案把原表全量数据分批迁移