mysql innodb索引底層數據結構?InnoDB 在數據目錄之外創建表有不同的原因這些原因可能包括空間管理、I/O 優化或将表放置在具有特定性能或容量特征的存儲設備上,我來為大家科普一下關于mysql innodb索引底層數據結構?以下内容希望對你有幫助!
mysql innodb索引底層數據結構
InnoDB 在數據目錄之外創建表有不同的原因。這些原因可能包括空間管理、I/O 優化或将表放置在具有特定性能或容量特征的存儲設備上。
InnoDB支持以下外部建表方式:
- 使用DATA DIRECTORY子句
- 使用 CREATE TABLE ... TABLESPACE 語法
- 在外部通用表空間中創建表
您可以通過在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 |
-------------------------
當您在CREATE TABLE語句中指定DATA DIRECTORY子句時 ,将在指定目錄下的模式目錄中創建表的數據文件 (table_name.ibd)。
從 MySQL 8.0.21 開始,使用DATA DIRECTORY子句在數據目錄之外創建的表和表分區僅限于InnoDB。此要求允許數據庫管理員控制在何處創建表空間數據文件,并确保在恢複期間可以找到數據文件。
已知目錄是由 datadir、 innodb_data_home_dir和 innodb_directories變量定義的目錄。您可以使用以下語句檢查這些設置:
mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories;
如果您要使用的目錄未知, 請在創建表之前将其添加到innodb_directories設置中。innodb_directories變量是隻讀的。配置它需要重新啟動服務器。
以下示例演示了使用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子句需要完整的目錄路徑。在這種情況下複制路徑将導緻源和副本在同一位置創建表。
- 從 MySQL 8.0.21 開始,在獨立表空間中創建的表不能再在 undo 表空間目錄 ( innodb_undo_directory) 中創建,除非是InnoDB的已知目錄。
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方法等效。
在外部通用表空間中創建表您可以在存儲在外部目錄中的通用表空間中創建表。
,








