1. 程式人生 > >MySQL 大表資料歸檔解決辦法

MySQL 大表資料歸檔解決辦法

當資料庫有一張表資料量很大,真正專案只用到一個月內的資料,因此把一個月前的舊資料定期歸檔。

解決方案如下:

1 - 建立一個新表,表結構和索引與舊錶一模一樣

create table table_archive like table_name;

2 - 新建儲存過程,查詢30天的資料並歸檔進新資料庫,然後把30天前的舊資料從舊錶裡刪除

delimiter $
create procedure sp()
begin
insert into table_archive select * from table_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