欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL大表数据归档问题的解决办法

程序员文章站 2022-06-21 20:54:30
当有一张表数据量很大,真正项目只用到一个月内的数据,因此把一个月前的旧数据定期归档。 解决方案如下: 1 - 创建一个新表,表结构和索引与旧表一模一样 create table table_arch...

当有一张表数据量很大,真正项目只用到一个月内的数据,因此把一个月前的旧数据定期归档。

解决方案如下:

1 - 创建一个新表,表结构和索引与旧表一模一样

create table table_archive like table_name;

2 - 新建存储过程,查询30天的数据并归档进新数据库,然后把30天前的旧数据从旧表里删除

delimiter $

create procedure sp()

begin

insert into table_archiveselect * fromtable_name where rectime < now() - interval 30 day;

delete from db_smc.table_name where rectime < now() - interval 30 day;

end

3 - 创建event,每天晚上凌晨00:00定时执行上面的存储过程

create event if not exists event_temp

on schedule every 1 day

on completion preserve

do call sp();

备注:

第一次执行存储过程的时候因为历史数据过大, 可能发生意外让该次执行没有成功。重新执行时会遇到报错error 1205 (hy000): lock wait timeout exceeded; try restarting transaction,应急解决方案如下:

1、执行show full processlist;查看所有mysql线程

2、执行select * from information_schema.innodb_trx\g; 查看是否有错误线程,线程id在show full processlist;的结果中状态为sleep

3、kill 进程id