Mysql

如何將 MySql 表移動到另一個磁碟?

  • August 22, 2018

據此,不可能使用 alter table 來移動表。因此,如果我理解正確 - 移動桌子是必要的:

  1. 創建新表
  2. 從舊行複制所有行
  3. 丟棄舊表
  4. 重命名創建的新表。

首先 - 這些步驟是否正確?第二 - 這個操作有更漂亮的方法嗎?

  1. SHOW CREATE TABLE real; – 避免錯別字
  2. 編輯它更改名稱new和添加DATA_DIRECTORY= ...或其他
  3. 執行CREATE TABLE new ...
  4. INSERT INTO new SELECT * FROM real;——單、快、步。但不是瞬間的
  5. RENAME TABLE real TO old, new TO real;
  6. DROP TABLE old;

第5步是主要添加的“優雅”。它是原子的和瞬時的;它不會中斷實時系統。此外,它還讓您有機會測試新的realbefore DROP TABLE old

如果這是 InnoDB,則必須在第 3 步之前打開。創建innodb_file_per_table舊版本時是否打開real?如果沒有,ibdata1將不會釋放舊磁碟上的任何空間。解決這個問題還需要幾個步驟。

(我的步驟應該適用於 MyISAM 表。)

我自己處理過這個問題,最終找到了比“新建-複製-切換”更優雅的解決方案:分離、移動和重新導入底層表空間文件。這在大型和/或索引過多的表上效率更高,因為 MySQL 不必重做它已經完成的工作。


簡而言之,它歸結為以下步驟:

FLUSH TABLES `table_name` FOR EXPORT;

在保持連接打開的同時,在 shell 中移動表空間文件:

$ mv /var/lib/mysql/database_name/table_name.{ibd,cfg} ~

現在回到 MySQL 釋放鎖,刪除表,用正確的重新創建它DATA DIRECTORY並丟棄它的表空間:

UNLOCK TABLES;
SHOW CREATE TABLE `table_name`;
DROP TABLE `table_name`;
CREATE TABLE `table_name` /* ... */ DATA DIRECTORY='/path/to/desired/location';
ALTER TABLE `table_name` DISCARD TABLESPACE;

現在將移動的表空間文件複製到所需位置:

$ cp -a ~/table_name.{ibd,cfg} /path/to/desired/location

並導入它們:

ALTER TABLE `table_name` IMPORT TABLESPACE;

關於為什麼“創建新 - 複製 - 切換”效率低下的更多背景和動機可以在我寫的關於這個主題的博文中找到:https: //www.moxio.com/blog/28/moving-individual-mysql-tables-磁碟上

引用自:https://dba.stackexchange.com/questions/121827