語法:
刪表
DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]
可一次刪除一張或多張表。需具有所刪除表上的DROP權限。表定義文件和數據文件均被移除。表被刪除後表上的用戶權限不會被自動刪除。參數裡表中指定的表名不存在則報錯,但對於存在的表仍會刪除。可通過指定IF EXISTS阻止表不存在時引發的錯誤(此時對於不存在的表僅產生一個NOTE)。對於分區表,除了移除表定義,分區、數據外還移除與之關聯的分區定義文件(.par)。在MySQL5.6中參數[RESTRICT | CASCADE]不做任何事情。[TEMPORARY] 關鍵字表明只刪臨時表,語句不會結束正在進行的事務(MySQL中DDL語句會隱式提交),不會進行權限檢查。
刪庫DROP DATABASE Syntax DROP {DATABASE | SCHEMA} [IF EXISTS] db_name...刪除指定庫中的表之後刪除庫。需具有庫上的DROP權限。庫被刪除後庫上存在的用戶權限不會被自動刪除。IF EXISTS用於阻止庫名不存在時引起的錯誤。庫被刪除後默認庫會被重置。若在使用了符號鏈接的庫上執行DROP DATABASSE 鏈接和原始數據庫都會被刪除。命令返回被移除的表數量。
sudo ls -lh /data/mysql/testdb -rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm -rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd該表有100G這麼大,直接使用DROP TABLE來完成刪表動作,那麼這條語句要執行很長時間。此時便可以通過在該表對應的數據文件上設置硬鏈接來進行刪除。
sudo ln /data/mysql/testdb/example_table.ibd /data/mysql/testdb/example_table.ibd.hdlk sudo ls -lh /data/mysql/testdb -rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm -rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd -rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk發現多了一個example_table.ibd.hdlk文件,且example_table.ibd.hdlk和example_table.ibd的innode均為2。也即當有多個文件名(如硬鏈接)指向同一innode時,這個innode的引用數大於1,此時,刪除其中任何一個文件名都只會刪除指向innode的指針而並不會直接刪除物理文件塊,因此會非常快,直至innode的引用計數等於1時才會真正刪除對應的物理文件塊,真正刪除物理文件塊時才會比較耗時。
DROP TABLE example_table;發現會很快的完成,查看對應的表定義和數據文件:
sudo ls -lh /data/mysql/testdb -rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk只剩下example_table.ibd.hdlk,且innode的引用計數變為了1。也即剛才的DROP TABLE操作實施刪除了物理文件的一個指針example_table.ibd ,因而非常快。
for i in `seq 100 -1 1 ` ;do sleep 2;sudo truncate -s ${i}G /data/mysql/testdb/example_table.ibd.hdlk;done sudo rm -rf /data/mysql/testdb/example_table.ibd.hdlk;從100G開始,每次縮減1G,停2秒,繼續,直到文件只剩1G,最後使用rm命令刪除剩余的部分。