生產環境資料庫磁碟快滿了,此時:
需要完全刪除乙個記錄歷史資料的大表(約160gb);
需要將一張大表中7月之前的資料全部刪除。
mysql中,drop和truncate是ddl(data define language)操作,操作立即生效,原資料不放到 rollback segment中,無法回滾;而delete語句為dml(data maintain language),這個操作會被放到 rollback segment中,事務可以回滾。執行效率方面,drop>truncate>delete。
我的實際情況是,要刪除的表很大(約160gb),如果使用delete可能要執行數天,且刪除表中資料後需要保留表結構,所以選擇使用truncate table即可。
truncate table huge_table;
由於表很大,排除delete方案(可能要執行數天)。可以分三步進行:
把原表重新命名為備份表;
建立乙個表結構和原表一樣的新錶;
提取原表中需要保留的資料,儲存到新錶中;
對備份表進行truncate。
-- 原表重新命名為備份表
rename table huge_table to huge_table_backup;
-- 建立新錶
create table huge_table like huge_table_backup;
-- 提取需要的資料插入
insert into huge_table select * from huge_table_backup where create_time >= "2020-10-01 00:00:00";
insert into huge_table select * from huge_table_backup where create_time >= "2020-09-01 00:00:00" and create_time < "2020-10-01 00:00:00";
-- truncate備份表
truncate table huge_table_backup;
MySQL 儲存過程刪除大表
1 許可權問題 alter routine 編輯或刪除儲存過程 create routine 建立儲存過程 execute 建立儲存過程 2 儲存過程相關的一些命令 show procedure status g 檢視資料庫中有哪些儲存過程 show procedure status where d...
mysql刪除大表更快的drop table辦法
曾經發文介紹過,drop table 特別是碰到大表時,在drop table 過程中,所有操作都會被hang住。這是因為innodb會維護乙個全域性獨佔鎖 在table cache上面 直到drop table完成才釋放。在我們常用的ext3,ext4,ntfs檔案系統,要刪除乙個大檔案 幾十g,...
mysql刪除大表更快的drop table辦法
利用硬鏈結和truncate降低drop table對線上環境的影響 在drop table的時候,所有程序不管是ddl還是dml都被hang起 直到drop結束才繼續執行 這是因為innodb會維護乙個全域性獨佔鎖 在table cache上面 直到drop table完成才釋放。在我們常用的ex...