外部建立 InnoDB
資料表的原因有很多種;也就是說,在資料目錄之外建立資料表。這些原因可能包括空間管理、I/O 最佳化,或將資料表放置在具有特定效能或容量特性的儲存裝置上等等。
InnoDB
支援以下外部建立資料表的方法
您可以在 CREATE TABLE
陳述式中指定 DATA DIRECTORY
子句,以在外部目錄中建立 InnoDB
資料表。
CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';
DATA DIRECTORY
子句支援在每個資料表檔案表空間中建立的資料表。當啟用 innodb_file_per_table
變數時,會在每個資料表檔案表空間中隱式建立資料表,預設情況下會啟用此變數。
mysql> SELECT @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
| 1 |
+-------------------------+
如需有關每個資料表檔案表空間的詳細資訊,請參閱章節 17.6.3.2,「每個資料表檔案表空間」。
當您在 CREATE TABLE
陳述式中指定 DATA DIRECTORY
子句時,資料表的資料檔案 (
) 會在指定目錄下的綱要目錄中建立。table_name
.ibd
使用 DATA DIRECTORY
子句在資料目錄之外建立的資料表和資料表分割區,會限制在 InnoDB
已知的目錄中。此要求允許資料庫管理員控制表空間資料檔案的建立位置,並確保可以在還原期間找到資料檔案(請參閱在當機還原期間探索表空間)。已知的目錄是由 datadir
、innodb_data_home_dir
和 innodb_directories
變數所定義。您可以使用以下陳述式來檢查這些設定
mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories;
如果您想要使用的目錄是未知的,請在建立資料表之前將其新增至 innodb_directories
設定。innodb_directories
變數是唯讀的。設定它需要重新啟動伺服器。如需設定系統變數的一般資訊,請參閱章節 7.1.9,「使用系統變數」。
以下範例示範如何使用 DATA DIRECTORY
子句在外部目錄中建立資料表。假設 innodb_file_per_table
變數已啟用,且該目錄是 InnoDB
已知的。
mysql> USE test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';
# MySQL creates the table's data file in a schema directory
# under the external directory
$> cd /external/directory/test
$> ls
t1.ibd
使用注意事項
MySQL 最初會保持表空間資料檔案開啟,防止您卸載裝置,但如果伺服器忙碌,最終可能會關閉檔案。請小心,不要在 MySQL 執行時意外卸載外部裝置,或在裝置斷線時啟動 MySQL。當相關資料檔案遺失時,嘗試存取資料表會導致嚴重的錯誤,需要重新啟動伺服器。
如果無法在預期的路徑找到資料檔案,重新啟動伺服器可能會失敗。在這種情況下,您可以從備份還原表空間資料檔案,或刪除資料表,以從資料字典中移除有關資料表的資訊。
將資料表放置在 NFS 掛載的磁碟區之前,請檢閱將 NFS 與 MySQL 搭配使用中概述的潛在問題。
如果使用 LVM 快照、檔案複製或其他基於檔案的機制來備份資料表的資料檔案,請務必先使用
FLUSH TABLES ... FOR EXPORT
陳述式,以確保所有緩衝在記憶體中的變更在備份發生之前都已刷新至磁碟。使用
DATA DIRECTORY
子句在外部目錄中建立資料表是使用符號連結的替代方案,而InnoDB
不支援符號連結。當來源和複本位於同一主機上時,複製環境中不支援
DATA DIRECTORY
子句。DATA DIRECTORY
子句需要完整的目錄路徑。 在這種情況下複製路徑會導致來源和複本在相同的位置建立資料表。除非
InnoDB
知道該目錄,否則在每個資料表檔案表空間中建立的資料表無法在撤銷表空間目錄 (innodb_undo_directory
) 中建立。 已知的目錄是由datadir
、innodb_data_home_dir
和innodb_directories
變數所定義的目錄。
可以結合 DATA DIRECTORY
子句使用 CREATE TABLE ... TABLESPACE
語法,在外部目錄中建立資料表。 為此,請指定 innodb_file_per_table
作為表空間名稱。
mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE = innodb_file_per_table
DATA DIRECTORY = '/external/directory';
此方法僅支援在每個資料表檔案表空間中建立的資料表,但不需要啟用 innodb_file_per_table
變數。 在所有其他方面,此方法等同於上述的 CREATE TABLE ... DATA DIRECTORY
方法。 相同的用法注意事項也適用。
您可以在位於外部目錄的通用表空間中建立資料表。
有關在外部目錄中建立通用表空間的資訊,請參閱建立通用表空間。
有關在通用表空間中建立資料表的資訊,請參閱將資料表新增至通用表空間。