mysql 生産庫大表删除
一般線上業務增長較快,造成某些表達到分表的臨界值,表行數超過2000w且查詢頻繁,如表業務沒有較多的聚合查詢的話,可以考慮按時間歸檔部分曆史資料。現推薦2種本人之前使用過的删除方式。
-
按照主鍵或者索引拆分後分段執行,使用存儲過程
需要注意這種大表删除,如果是在主庫執行,盡量把會話改成語句格式,以保證不會出現複制延遲
語句如下:set session binlog_format='STATEMENT';
CREATE PROCEDURE sp_delete_data()
BEGIN
set session binlog_format='STATEMENT';
label:
WHILE (1 = 1)
DO
DELETE FROM table where aaa like 'bbb%' LIMIT 10000;
SET @a1 = ROW_COUNT();
IF @a1 = 0 THEN
LEAVE label;
END IF;
END WHILE;
END
limit使用的行數,可以線上測試下,在不影響業務庫性能的情況下最大化删除行數。
2.使用percona tools中的pt-archiver來清理過期資料,做資料歸檔,也可以二者可以同時進行
需要注意參數為--limit 5000 --txn-size 5000性能調優參數具體值可以測試調整優化,盡量多事務送出以提高執行效率.
1)清理過期資料
pt-archiver --source h=localhost,P=3306,u=ceshi,p=111111,D=test,t=example --charset=UTF8 --purge --where 'id<10000000' --progress 3000 --limit=3000 --txn-size=3000 --statistics