天天看點

mysql 生産庫大表delete

mysql 生産庫大表删除

一般線上業務增長較快,造成某些表達到分表的臨界值,表行數超過2000w且查詢頻繁,如表業務沒有較多的聚合查詢的話,可以考慮按時間歸檔部分曆史資料。現推薦2種本人之前使用過的删除方式。

  1. 按照主鍵或者索引拆分後分段執行,使用存儲過程

    需要注意這種大表删除,如果是在主庫執行,盡量把會話改成語句格式,以保證不會出現複制延遲

    語句如下: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

繼續閱讀