MySQL Table RENAME、重建作法

MySQL 刪除資料後,空間並不會釋放出來,可以使用 OPTIMIZE TABLE 來釋放空間,OPTIMIZE 等同於 TABLE Copy & RENAME,所以會有大量 IO。

我是採用兩種方式來做,依照資料量大小來做選擇。(一樣會有大量IO,但是可以自己掌握,缺點是執行時會有短暫的時間可能漏資料)

不過資料量過大的,還是建議另外處理,這種作法是非常不得已的。

MySQL Table RENAME、重建作法

資料量小,可以瞬間新增完畢(大概10萬筆以下)

  1. CREATE TABLE table_new LIKE table_now;
  2. RENAME TABLE table_now TO table_old;
  3. RENAME TABLE table_new TO table_now;
  4. INSERT table_now SELECT * FROM table_new;

資料量中大,資料先新增後,再來 RENAME,再來補中間漏的資料

  1. CREATE TABLE table_new LIKE table_now;
  2. INSERT table_new SELECT * FROM table_now;
  3. RENAME TABLE table_now TO table_old;
  4. RENAME TABLE table_new TO table_now;
  5. INSERT table_new SELECT * FROM table_now WHERE id > xxx;
  6. 可能需要用:INSERT IGNORE table_new SELECT * FROM talbe_now WHERE id > xxx;

上述 INSERT table_new SELECT * FROM table_now; 可能會遇到下述錯誤訊息:

  • ERROR 1062 (23000): Duplicate entry 'AA' for key 'PRIMARY'

預設遇到 Duplicate Key (ERROR 1062 (23000): Duplicate entry 'AA' for key 'PRIMARY') 就會停止 INSERT,遇到 Duplicate Key 跳過繼續寫入其它語法,可以使用下述(INSERT IGNORE):

  • INSERT IGNORE table_new SELECT * FROM talbe_now;

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料