MySQL大表数据归档问题的解决办法
当有一张表数据量很大,真正项目只用到一个月内的数据,因此把一个月前的旧数据定期归档。
解决方案如下:
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
推荐阅读
-
MySQL 删除大表的性能问题解决方案
-
Mysql数据库名和表名在不同系统下的大小写敏感问题
-
Mysql数据库名和表名在不同系统下的大小写敏感问题
-
使用cmd运行mysql数据库的时候,报错:"不是内部命令也不是可有运行的程序"问题的解决办法
-
oracle数据库锁表问题的解决办法
-
mysql修改密码、找不到mysql数据库、mysql1045等问题的解决办法
-
从云数据迁移服务看MySQL大表抽取模式的原理解析
-
在PHP+Apache+MySQL环境下(windows系统),连接SQLServer数据出现“can not find driver”问题的解决办法
-
数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题
-
mysql关联两张表时的编码问题及解决办法