InnoDB 儲存架構核心選擇:共享表空間(System Tablespace)與獨立表空間。本文深度對比兩者架構、優缺點、適用場景與線上遷移方案。
| 維度 | 共享表空間 (預設關閉 innodb_file_per_table) | 獨立表空間 (開啟 innodb_file_per_table=ON) |
|---|---|---|
| 檔案結構 | ibdata1, ibdata2... 所有表數據+索引混存 | 每表一個 .ibd 檔案(含數據+索引),.frm 存結構 |
| 空間回收 | 不支援,DELETE/TRUNCATE 釋放空間僅標記可重用,檔案不縮小 | 支援:DROP TABLE 立即釋放;TRUNCATE/ALTER TABLE ENGINE=InnoDB 回縮 |
| 備份/遷移 | 需備份整個 ibdata*,單表遷移困難 | 單表 .ibd 可獨立備份/匯入(Transportable Tablespace) |
| 效能隔離 | 熱表/冷表 IO 互相影響 | 可將熱表 .ibd 放高速磁碟/SSD |
| 碎片整理 | 極難,需全庫重建 | 單表 OPTIMIZE TABLE / ALTER TABLE ... ENGINE=InnoDB |
open_files_limit;ibdata1 仍存字典/Undo,冷備必須包含。方案 A:邏輯備份重建(推薦,零風險)
# 1. 邏輯備份 mysqldump --single-transaction --routines --all-databases > alldb.sql # 2. 修改配置 innodb_file_per_table = 1 # 3. 重啟 MySQL # 4. 匯入 mysql < alldb.sql
方案 B:原地 ALTER TABLE(僅新表生效,舊表數據仍在 ibdata1)
SET GLOBAL innodb_file_per_table = 1; ALTER TABLE table_name ENGINE=InnoDB; -- 每張表執行一次 # 注意:舊表數據未遷移,僅新數據進 .ibd
SHOW VARIABLES LIKE 'innodb_file_per_table'; -- ON = 獨立,OFF = 共享 ls /var/lib/mysql/db_name/ -- 看是否有 .ibd 檔案
MySQL 5.6+ 預設開啟 innodb_file_per_table=ON,**生產環境強烈建議使用獨立表空間**。共享表空間僅適合極簡單、唯讀、小體積場景。遷移請走邏輯備份重建路徑,確保數據零風險落地。