關於 InnoDB
配置的首要決策涉及資料檔案、日誌檔案、頁面大小和記憶體緩衝區的配置,這些應在初始化 InnoDB
之前配置。在初始化 InnoDB
後修改配置可能涉及複雜的程序。
本節提供關於在設定檔中指定 InnoDB
設定、檢視 InnoDB
初始化資訊,以及重要的儲存考量的資訊。
由於 MySQL 使用資料檔案、日誌檔案和頁面大小設定來初始化 InnoDB
,建議您在 MySQL 啟動時讀取的選項檔案中定義這些設定,然後再初始化 InnoDB
。通常,當首次啟動 MySQL 伺服器時會初始化 InnoDB
。
您可以將 InnoDB
選項放在伺服器啟動時讀取的任何選項檔案的 [mysqld]
群組中。MySQL 選項檔案的位置在第 6.2.2.2 節「使用選項檔案」中說明。
若要確保 mysqld 只從特定檔案 (和 mysqld-auto.cnf
) 讀取選項,請在啟動伺服器時,將 --defaults-file
選項作為命令列上的第一個選項。
mysqld --defaults-file=path_to_option_file
若要在啟動期間檢視 InnoDB
初始化資訊,請從命令提示字元啟動 mysqld,這會將初始化資訊列印到主控台。
例如,在 Windows 上,如果 mysqld 位於 C:\Program Files\MySQL\MySQL Server 9.0\bin
中,請像這樣啟動 MySQL 伺服器
C:\> "C:\Program Files\MySQL\MySQL Server 9.0\bin\mysqld" --console
在類 Unix 系統上,mysqld 位於 MySQL 安裝的 bin
目錄中
$> bin/mysqld --user=mysql &
如果您不將伺服器輸出傳送到主控台,請在啟動後檢查錯誤日誌,以查看 InnoDB
在啟動過程中列印的初始化資訊。
如需使用其他方法啟動 MySQL 的相關資訊,請參閱第 2.9.5 節「自動啟動和停止 MySQL」。
InnoDB
在啟動時並不會開啟所有使用者表格和相關的資料檔案。然而,InnoDB
會檢查資料字典中引用的表格空間檔案是否存在。如果找不到表格空間檔案,InnoDB
會記錄錯誤並繼續啟動程序。在崩潰恢復期間,為了進行重做應用,可能會開啟重做日誌中引用的表格空間檔案。
在繼續進行啟動配置之前,請檢閱以下與儲存相關的考量事項。
在某些情況下,您可以通過將資料和日誌檔案放置在不同的實體磁碟上來提高資料庫效能。您還可以將原始磁碟分割區(原始裝置)用於
InnoDB
資料檔案,這可能會加快 I/O 速度。請參閱使用原始磁碟分割區作為系統表格空間。InnoDB
是一個具有提交、回滾和崩潰恢復功能的事務安全(符合 ACID)儲存引擎,可以保護使用者資料。然而,如果底層作業系統或硬體無法按照其宣稱的方式運作,則它無法做到這一點。許多作業系統或磁碟子系統可能會延遲或重新排序寫入操作以提高效能。在某些作業系統上,應該等待直到檔案的所有未寫入資料都已刷新到穩定儲存的fsync()
系統呼叫,實際上可能會在資料刷新到穩定儲存之前返回。因此,作業系統崩潰或斷電可能會破壞最近提交的資料,或者在最壞的情況下,甚至會因為寫入操作被重新排序而損壞資料庫。如果資料完整性對您很重要,請在將任何東西用於生產環境之前執行「拔電源」測試。在 macOS 上,InnoDB
使用特殊的fcntl()
檔案刷新方法。在 Linux 下,建議停用回寫快取。在 ATA/SATA 磁碟機上,諸如
hdparm -W0 /dev/hda
之類的命令可能可以停用回寫快取。請注意,某些磁碟機或磁碟控制器可能無法停用回寫快取。關於保護使用者資料的
InnoDB
恢復功能,InnoDB
使用一種檔案刷新技術,該技術涉及一個稱為雙寫緩衝區的結構,該結構預設為啟用 (innodb_doublewrite=ON
)。雙寫緩衝區增加了在意外退出或斷電後恢復的安全性,並通過減少對fsync()
操作的需求,提高了大多數 Unix 變體上的效能。如果您關心資料完整性或可能發生的故障,建議保持啟用innodb_doublewrite
選項。有關雙寫緩衝區的資訊,請參閱第 17.11.1 節「InnoDB 磁碟 I/O」。在使用 NFS 和
InnoDB
之前,請檢閱將 NFS 與 MySQL 一起使用中概述的潛在問題。
innodb_data_file_path
選項定義了 InnoDB
系統表格空間資料檔案的名稱、大小和屬性。如果您在初始化 MySQL 伺服器之前未配置此選項,則預設行為是建立一個略大於 12MB 的自動擴展資料檔案,命名為 ibdata1
。
mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
完整的資料檔案規格語法包括檔案名稱、檔案大小、autoextend
屬性和 max
屬性。
file_name:file_size[:autoextend[:max:max_file_size]]
檔案大小以千位元組、百萬位元組或十億位元組指定,方法是在大小值後附加 K
、M
或 G
。如果以千位元組指定資料檔案大小,則應以 1024 的倍數指定。否則,千位元組值將四捨五入到最接近的百萬位元組 (MB) 邊界。檔案大小的總和必須至少略大於 12MB。
您可以使用分號分隔的列表指定多個資料檔案。例如:
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
autoextend
和 max
屬性只能用於最後指定的資料檔案。
當指定 autoextend
屬性時,資料檔案會根據需要自動以 64MB 的增量增加大小。innodb_autoextend_increment
變數控制增量大小。
要為自動擴展資料檔案指定最大大小,請在 autoextend
屬性後使用 max
屬性。僅在限制磁碟使用量至關重要的情況下使用 max
屬性。以下配置允許 ibdata1
成長到 500MB 的限制:
[mysqld]
innodb_data_file_path=ibdata1:12M:autoextend:max:500M
對第一個系統表格空間資料檔案強制執行最小檔案大小,以確保有足夠的空間容納雙寫緩衝區頁面。下表顯示了每個 InnoDB
頁面大小的最小檔案大小。預設的 InnoDB
頁面大小為 16384 (16KB)。
頁面大小 (innodb_page_size) | 最小檔案大小 |
---|---|
16384 (16KB) 或更小 | 3MB |
32768 (32KB) | 6MB |
65536 (64KB) | 12MB |
如果您的磁碟空間已滿,您可以在另一個磁碟上新增資料檔案。有關說明,請參閱調整系統表格空間大小。
單個檔案的大小限制由您的作業系統決定。您可以在支援大檔案的作業系統上將檔案大小設定為超過 4GB。您也可以使用原始磁碟分割區作為資料檔案。請參閱使用原始磁碟分割區作為系統表格空間。
InnoDB
不知道檔案系統的最大檔案大小,因此在最大檔案大小為較小值(例如 2GB)的檔案系統上要謹慎。
預設情況下,系統表格空間檔案會在資料目錄中建立 (datadir
)。要指定替代位置,請使用innodb_data_home_dir
選項。例如,要在名為 myibdata
的目錄中建立系統表格空間資料檔案,請使用以下配置:
[mysqld]
innodb_data_home_dir = /myibdata/
innodb_data_file_path=ibdata1:50M:autoextend
當為 innodb_data_home_dir
指定值時,需要尾隨斜線。InnoDB
不會建立目錄,因此請確保在啟動伺服器之前指定的目錄存在。此外,請確保 MySQL 伺服器具有在目錄中建立檔案的適當存取權限。
InnoDB
通過將 innodb_data_home_dir
的值以文字方式串連到資料檔案名稱來形成每個資料檔案的目錄路徑。如果未定義 innodb_data_home_dir
,則預設值為「./
」,即資料目錄。(MySQL 伺服器在開始執行時會將其目前的工作目錄變更為資料目錄。)
或者,您可以為系統表格空間資料檔案指定絕對路徑。以下配置與前面的配置等效:
[mysqld]
innodb_data_file_path=/myibdata/ibdata1:50M:autoextend
當您為 innodb_data_file_path
指定絕對路徑時,該設定不會與 innodb_data_home_dir
設定串連。系統表格空間檔案會在指定的絕對路徑中建立。指定的目錄必須在啟動伺服器之前存在。
InnoDB
雙寫緩衝區儲存區域駐留在雙寫檔案中,這為雙寫頁面的儲存位置提供了彈性。在之前的版本中,雙寫緩衝區儲存區域駐留在系統表格空間中。innodb_doublewrite_dir
變數定義了 InnoDB
在啟動時建立雙寫檔案的目錄。如果未指定目錄,則雙寫檔案會在 innodb_data_home_dir
目錄中建立,如果未指定,則預設為資料目錄。
要在innodb_data_home_dir
目錄以外的位置建立雙寫檔案,請配置innodb_doublewrite_dir
變數。例如:
innodb_doublewrite_dir=/path/to/doublewrite_directory
其他雙寫緩衝區變數允許定義雙寫檔案的數量、每個執行緒的頁數和雙寫批次大小。有關雙寫緩衝區配置的詳細資訊,請參閱第 17.6.4 節「雙寫緩衝區」。
重做日誌檔案佔用的磁碟空間量由 innodb_redo_log_capacity
變數控制,該變數可以在啟動時或執行時設定;例如,要在選項檔案中將變數設定為 8GiB,請新增以下條目:
[mysqld]
innodb_redo_log_capacity = 8589934592
有關在執行時配置重做日誌容量的資訊,請參閱配置重做日誌容量。
innodb_redo_log_capacity
變數取代了 innodb_log_file_size
和 innodb_log_files_in_group
變數,這些變數已被棄用。當定義 innodb_redo_log_capacity
設定時,會忽略 innodb_log_file_size
和 innodb_log_files_in_group
設定;否則,如果定義了其中一個或兩個已棄用的設定,則它們將用於計算 Innodb_redo_log_capacity_resized
為 (innodb_log_files_in_group
* innodb_log_file_size
)。如果未設定這些變數,則使用預設的 innodb_redo_log_capacity
值。
InnoDB
嘗試維護 32 個重做日誌檔案,每個檔案等於 1/32 * innodb_redo_log_capacity
。除非 innodb_log_group_home_dir
變數指定了不同的目錄,否則重做日誌檔案會駐留在資料目錄中的 #innodb_redo
目錄中。如果定義了 innodb_log_group_home_dir
,則重做日誌檔案會駐留在該目錄中的 #innodb_redo
目錄中。有關詳細資訊,請參閱第 17.6.5 節「重做日誌」。
您可以在初始化 MySQL 伺服器執行個體時,通過配置 innodb_log_files_in_group
和 innodb_log_file_size
變數來定義不同的重做日誌檔案數量和不同的重做日誌檔案大小。
innodb_log_files_in_group
定義了日誌群組中的日誌檔案數量。預設值和建議值為 2。
innodb_log_file_size
定義了日誌群組中每個日誌檔案的大小(以位元組為單位)。合併後的日誌檔案大小 (innodb_log_file_size
* innodb_log_files_in_group
) 不能超過最大值,該值略小於 512GB。例如,一對 255 GB 的日誌檔案接近限制,但不會超過它。預設的日誌檔案大小為 48MB。一般來說,日誌檔案的合併大小應該足夠大,以便伺服器可以平滑工作負載活動中的高峰和低谷,這通常意味著有足夠的重做日誌空間來處理超過一小時的寫入活動。較大的日誌檔案大小意味著緩衝池中的檢查點刷新活動較少,這減少了磁碟 I/O。有關其他資訊,請參閱第 10.5.4 節,「優化 InnoDB 重做日誌」。
innodb_log_group_home_dir
定義了 InnoDB
日誌檔案的目錄路徑。您可以使用此選項將 InnoDB
重做日誌檔案放在與 InnoDB
資料檔案不同的實體儲存位置,以避免潛在的 I/O 資源衝突;例如
[mysqld]
innodb_log_group_home_dir = /dr3/iblogs
InnoDB
不會建立目錄,因此請確保在啟動伺服器之前日誌目錄存在。使用 Unix 或 DOS mkdir
命令建立任何必要的目錄。
請確保 MySQL 伺服器具有在日誌目錄中建立檔案的適當存取權限。更廣泛地說,伺服器必須在任何需要建立檔案的目錄中具有存取權限。
預設情況下,Undo 日誌會駐留在 MySQL 實例初始化時建立的兩個 undo 表空間中。
innodb_undo_directory
變數定義了 InnoDB
建立預設 undo 表空間的路徑。如果該變數未定義,則會在資料目錄中建立預設的 undo 表空間。innodb_undo_directory
變數不是動態的。配置它需要重新啟動伺服器。
Undo 日誌的 I/O 模式使 undo 表空間非常適合 SSD 儲存。
有關配置其他 undo 表空間的資訊,請參閱第 17.6.3.4 節,「Undo 表空間」。
全域暫存表空間儲存對使用者建立的暫存表所做變更的回滾段。
預設情況下,在 innodb_data_home_dir
目錄中,有一個名為 ibtmp1
的單一自動擴展全域暫存表空間資料檔案。初始檔案大小略大於 12MB。
innodb_temp_data_file_path
選項指定全域暫存表空間資料檔案的路徑、檔案名稱和檔案大小。檔案大小以 KB、MB 或 GB 為單位指定,方法是在大小值後附加 K、M 或 G。檔案大小或合併檔案大小必須略大於 12MB。
若要指定全域暫存表空間資料檔案的替代位置,請在啟動時設定 innodb_temp_data_file_path
選項。
在 MySQL 9.0 中,InnoDB
始終用作內部暫存表的磁碟儲存引擎。
innodb_temp_tablespaces_dir
變數定義了 InnoDB
建立工作階段暫存表空間的位置。預設位置是資料目錄中的 #innodb_temp
目錄。
若要指定工作階段暫存表空間的替代位置,請在啟動時設定 innodb_temp_tablespaces_dir
變數。允許使用完整路徑或相對於資料目錄的路徑。
innodb_page_size
選項指定 MySQL 實例中所有 InnoDB
表空間的頁面大小。此值在建立實例時設定,之後保持不變。有效值為 64KB、32KB、16KB(預設值)、8KB 和 4KB。或者,您可以用位元組指定頁面大小 (65536、32768、16384、8192、4096)。
預設的 16KB 頁面大小適用於廣泛的工作負載,特別是涉及資料表掃描的查詢以及涉及大量更新的 DML 作業。對於涉及許多小型寫入的 OLTP 工作負載,較小的頁面大小可能更有效率,當單個頁面包含許多資料列時,可能會產生競爭問題。較小的頁面對於通常使用小型區塊大小的 SSD 儲存裝置也可能更有效率。讓 InnoDB
頁面大小接近儲存裝置區塊大小可將重新寫入磁碟的未變更資料量降至最低。
innodb_page_size
只能在初始化資料目錄時設定。有關更多資訊,請參閱此變數的描述。
MySQL 會將記憶體配置給各種快取和緩衝區,以提高資料庫作業的效能。為 InnoDB
配置記憶體時,請務必考慮作業系統所需的記憶體、配置給其他應用程式的記憶體以及配置給其他 MySQL 緩衝區和快取的記憶體。例如,如果您使用 MyISAM
資料表,請考慮配置給索引鍵緩衝區的記憶體量 (key_buffer_size
)。有關 MySQL 緩衝區和快取的概述,請參閱第 10.12.3.1 節,「MySQL 如何使用記憶體」。
使用以下參數設定特定於 InnoDB
的緩衝區
innodb_buffer_pool_size
定義了緩衝池的大小,緩衝池是保留InnoDB
資料表、索引和其他輔助緩衝區快取資料的記憶體區域。緩衝池的大小對於系統效能非常重要,通常建議將innodb_buffer_pool_size
配置為系統記憶體的 50% 到 75%。預設的緩衝池大小為 128MB。有關其他指導,請參閱第 10.12.3.1 節,「MySQL 如何使用記憶體」。有關如何配置InnoDB
緩衝池大小的資訊,請參閱第 17.8.3.1 節,「配置 InnoDB 緩衝池大小」。可以在啟動時或動態配置緩衝池大小。在具有大量記憶體的系統上,您可以通過將緩衝池分成多個緩衝池實例來提高並發性。緩衝池實例的數量由
innodb_buffer_pool_instances
選項控制。預設情況下,InnoDB
會建立一個緩衝池實例。可以在啟動時設定緩衝池實例的數量。有關更多資訊,請參閱第 17.8.3.2 節,「配置多個緩衝池實例」。innodb_log_buffer_size
定義了InnoDB
用於寫入磁碟上日誌檔案的緩衝區大小。預設大小為 64MB。較大的日誌緩衝區可以使大型交易在交易提交之前無需將日誌寫入磁碟即可執行。如果您有更新、插入或刪除許多資料列的交易,您可以考慮增加日誌緩衝區的大小以節省磁碟 I/O。innodb_log_buffer_size
可以在啟動時設定。有關相關資訊,請參閱第 10.5.4 節,「優化 InnoDB 重做日誌」。
在 32 位元 GNU/Linux x86 上,如果記憶體使用率設定過高,glibc
可能會允許處理程序堆疊在執行緒堆疊之上增長,從而導致伺服器失敗。如果為 mysqld 處理程序配置的全域和每個執行緒緩衝區和快取的記憶體接近或超過 2GB,這將存在風險。
可以使用類似於以下用於計算 MySQL 全域和每個執行緒記憶體配置的公式來估計 MySQL 記憶體使用率。您可能需要修改公式,以說明您的 MySQL 版本和組態中的緩衝區和快取。有關 MySQL 緩衝區和快取的概述,請參閱第 10.12.3.1 節,「MySQL 如何使用記憶體」。
innodb_buffer_pool_size
+ key_buffer_size
+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)
+ max_connections*2MB
每個執行緒都使用一個堆疊(通常為 2MB,但在 Oracle 公司提供的 MySQL 二進制檔案中僅為 256KB),並且在最壞的情況下還會使用 sort_buffer_size + read_buffer_size
的額外記憶體。
在 Linux 上,如果核心已啟用大頁面支援,InnoDB
可以使用大頁面來為其緩衝池配置記憶體。請參閱第 10.12.3.3 節,「啟用大頁面支援」。