各位好,公司的MySQL資料庫中有一個table因為資料筆數過多(每天新增3萬筆,已持續自2012年至今),所以決定將只保留三年內的資料,因此之前的歷史資料就使用delete指定篩選刪除,結果上週僅下指令刪除2012~2013共兩年約兩仟多萬筆,就此系統磁碟一直保持近100%的使用率,相當影響MySQL效能。
查了一下workbench connections,確認Delete sql已執行完畢,又查了Windows系統資源監視器,發現是 mysqld.exe 對那個 table 一直有讀寫動作,至今已持續了約5天仍降不下來,不知是否可以直接將這支 mysqld.exe砍掉或重新開機,但又怕資料庫crash,不知各位有沒有什麼建議?謝謝先!
insert into newtable
select *
from oldtable
where 你想保留的年度;
rename table oldtable to oldtable_bak;
rename table newtable to oldtable;
https://dev.mysql.com/doc/refman/8.3/en/rename-table.html
改用建立新的table, 然後改名. 這樣資料量搬移的部分較少的話,可能比較好.
不會是只有單一因素,例如你舉例的百分比,需要多方面考量.
嗨, 一級屠豬士
想再額外請教,這種操作,應該是要確保全服務停機的對吧!?
在我弱弱的理解上rename的過程或者搬移過程,和同時每天 3 萬筆同時新增,應該會出錯
然後停機時間,應該最大的時間成本會是,在第一步驟 insert into newtable
對嗎?
Tsai-jimmy
他這個是需要做搬移維護的情況,不是日常的作業.當然是需要停一下.
像是大量輸入的table,會使用partition table的方式,這樣要清理或搬移舊資料會方便多了.
當你執行 delete 完後,
Table 裡Record被刪除的位置會產生空隙,
這時 MySQL 會開始執行 Table 的 Compaction 動作,
有點類似 Windows 的磁碟重組,
他會開始把資料作搬移,將資料搬到前面的位,
把空隙留在後方,
這時 CPU 會執行搬移的指令,
你可以想像你一邊作磁碟重組,一邊播放影片的感覺
方法一:
REPAIR TABLE table_name;
方法二:
ALTER TABLE t1 ENGINE = InnoDB;
方法三:
mysqldump db_name t1 > dump.sql
mysql db_name < dump.sql
使用刪除指令要很小心。
因為刪除要運行的作業。遠遠比增加資料還要來的多。
尤其是在筆數非常大的表更是明顯。
基本建議可參照 @一級屠豬士 教的。
使用另外新增的方式來處理。