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