文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  外部建立資料表

17.6.1.2 外部建立資料表

外部建立 InnoDB 資料表的原因有很多種;也就是說,在資料目錄之外建立資料表。這些原因可能包括空間管理、I/O 最佳化,或是將資料表放在具有特定效能或容量特性的儲存裝置上等等。

InnoDB 支援下列外部建立資料表的方法

使用 DATA DIRECTORY 子句

您可以在 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 已知的目錄。此要求允許資料庫管理員控制表空間資料檔案的建立位置,並確保可以在還原期間找到資料檔案(請參閱當機還原期間的表空間探索)。已知的目錄是由 datadirinnodb_data_home_dirinnodb_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)中建立每個資料表檔案表空間中建立的資料表。已知的目錄是由 datadirinnodb_data_home_dirinnodb_directories 變數定義的目錄。

使用 CREATE TABLE ... TABLESPACE 語法

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 方法相同。相同的用法說明適用。

在外部一般表空間中建立資料表

您可以在位於外部目錄中的一般表空間中建立資料表。