mysql 清空 MySQL大表清空和刪除正確方法

2021-10-25 22:26:38 字數 2127 閱讀 1610

mysql大表清空和刪除正確方法

1 清空大表

1.1 truncate

刪除表中的資料的方法有delete,truncate, 其中truncate table用於刪除表中的所有行,而不記錄單個行刪除操作。truncate table 與沒有 where 子句的 delete 語句類似;但是,truncate table 速度更快,使用的系統資源和事務日誌資源更少。

truncate 清空表資料,50g的表大概需要20秒以上;

mysql> truncate table old_table;

1.2 rename

1.2.1 格式:

mysql> rename table 原表名 to 新錶名;

當你執行 rename 時,你不能有任何鎖定的表或活動的事務。你同樣也必須有對原初表的 alter 和 drop 許可權,以及對新錶的 create 和 insert 許可權。

1.2.2 例項

# 新建乙個空表(測試);

mysql> create table old_table(id int);

# new_table轉殖old_table的表結構;

mysql> create table new_table like old_table;

# old_table改名為backup_table,new_table改名為old_table;

mysql> rename table old_table to backup_table, new_table to old_table;

# 刪除舊表及資料;

mysql> drop table old_table;

2 刪除

2.1 背景

在生產環境有可能有刪除某個不重要大表的需求,因為大表占用的大量磁碟空間,如果我們直接drop掉此表,通常需要20秒以上的時間,總會覺得會卡主mysql,現在給大家乙個正確的刪除方法。

2.2 首先我們檢視此大表

# shell

[root@ras221 db]# du -shc old_table*

12k old_table.frm

49g old_table.ibd

[root@ras221 db]# ls -l old_table*

-rw-r----- 1 mysql mysql 9075 11月 8 11:39 old_table.frm

-rw-r----- 1 mysql mysql 52273610752 1月 10 14:12 old_table.ibd

[root@ras221 db]# ln old_table.ibd old_table.ibd.bak # 硬鏈結;

[root@ras221 db]# ls -l old_table*

-rw-r----- 1 mysql mysql 9075 11月 8 11:39 old_table.frm

-rw-r----- 1 mysql mysql 52273610752 1月 10 14:12 old_table.ibd

-rw-r----- 1 mysql mysql 52273610752 1月 10 14:12 old_table.ibd.bak

[root@ras221 db]#

# mysql

mysql> drop table old_table;

query ok, 0 rows affacted(0.92 sec)

通過這樣的操作,可以減少mysql drop大表hang住的時間,然後在業務低峰期再去刪除真實的那個.b文.bak件。

至於原理:

就是利用os hard link的原理,

當多個檔名同時指向同乙個inode時,這個inode的引用數n>1, 刪除其中任何乙個檔名都會很快.

因為其直接的物理檔案塊沒有被刪除.只是刪除了乙個指標而已;

當inode的引用數n=1時, 刪除檔案需要去把這個檔案相關的所有資料塊清除,所以會比較耗時;

對於大表操作操作的其實幾個tips:

可以先用rename table替代drop table

mysql> rename table old_table to old_table_bak;

這個動作也很快只是相當於改乙個檔名。

另外也可以考慮使用xfs檔案系統,對於drop表動作也比較快。

mysql清表資料

delete from 表名 truncatetable 表名 不帶where引數的delete語句可以刪除mysql表中所有內容,使用truncate table也可以清空mysql表中所有內容。效率上truncate比delete快,但truncate刪除後不記錄mysql日誌,不可以恢復資料。...

清空mysql表資料

delete from 表名 truncate table 表名 不帶where引數的delete語句可以刪除mysql表中所有內容,使用truncate table也可以清空mysql表中所有內容。效率上truncate比delete快,但truncate刪除後不記錄mysql日誌,不可以恢復資料...

Mysql定時清空表

1.設定開啟event scheduler set global event scheduler 1 2.驗證event scheduler是否已經開啟 show variables like event 值為 on 表明已開啟 show variables like event scheduler...