在工作中,系统上线后数据日积月累将会使数据库表记录相当庞大。这时候需要我们进行部分数据迁移以及清理,下文讲讲述Mysql数据库上亿级表记录如何合理迁移以及清理。(其他数据库原理一致)
在讲述之前,我们需了解删除的效率级别,DROP > TRUNCATE > DELETE
TRUNCATE 速度快,DELETE 慢的原因是DELETE 需要额外的事务开销,防止删除异常时可及时回滚。然而TRUNCATE是事务不可回滚操作,也就意味着我们在线上实际操作时需在测试环境中反复校验咱们的语句以及条件的准确性,以及及时做好备份操作。
*********************************************************具体操作*************************************************************
第一步:新的表结构创建
CREATE TABLE TableName_old SELECT * FROM TableName WHERE 1=2;
第二步:将需要保留的数据迁移至新创建的表中
INSERT INTO TableName_old SELECT * FROM TableName t WHERE t.xxx = xxxx
第三步:清理旧表数据
TRUNCATE TABLE TableName;
第四步:回迁数据(无需写条件,全表回迁)
INSERT INTO TableName SELECT * FROM TableName_old
第五步:校验数据回迁完整性以及删除废表
*********************************************************注意事项*************************************************************
注意事项:
1、整理数据之前确保停止服务,避免同时操作表数据产生死锁。
2、在执行第三步之前确保无外键依赖,如果有清取消。(业务处理结束需再次生效外键约束)
#取消外键约束
SET foreign_key_checks = 0;
3、设置SQL语句事务执行超时时间,可动态设置不需重启数据库,但需要重新连接数据库使设置生效。在使用结束以后还原之前的设置。
#设置全局等待事务锁超时时间 (依据具体业务量设置,默认50)
SET GLOBAL innodb_lock_wait_timeout=100;