外部建立 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 掛載的磁碟區之前,請檢閱在 MySQL 中使用 NFS中概述的潛在問題。
如果使用 LVM 快照、檔案複製或其他基於檔案的機制來備份資料表的資料檔案,請務必先使用
FLUSH TABLES ... FOR EXPORT
陳述式,以確保在備份發生之前,所有緩衝在記憶體中的變更都已清除到磁碟。使用
DATA DIRECTORY
子句在外部目錄中建立資料表是使用符號連結的替代方案,而InnoDB
不支援符號連結。在來源和複本位於同一主機的複製環境中,不支援
DATA DIRECTORY
子句。DATA DIRECTORY
子句需要完整目錄路徑。在這種情況下複製路徑會導致來源和複本在相同位置建立資料表。除非
InnoDB
知道該目錄,否則無法在 undo 表空間目錄(innodb_undo_directory
)中建立每個資料表檔案表空間中建立的資料表。已知的目錄是由datadir
、innodb_data_home_dir
和innodb_directories
變數定義的目錄。
CREATE TABLE ... TABLESPACE
語法可以與 DATA DIRECTORY
子句結合使用,以在外部目錄中建立資料表。若要執行此操作,請將 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
方法相同。相同的用法說明適用。
您可以在位於外部目錄中的一般表空間中建立資料表。
如需在外部目錄中建立一般表空間的相關資訊,請參閱建立一般表空間。
如需在一般表空間中建立資料表的相關資訊,請參閱將資料表新增至一般表空間。