關於 InnoDB
配置的第一個決定涉及資料檔案、日誌檔案、頁面大小和記憶體緩衝區的配置,這些應該在初始化 InnoDB
之前配置。在 InnoDB
初始化之後修改配置可能涉及非簡單的程序。
本節提供有關在設定檔中指定 InnoDB
設定、檢視 InnoDB
初始化資訊和重要儲存考量的資訊。
由於 MySQL 使用資料檔案、日誌檔案和頁面大小設定來初始化 InnoDB
,因此建議您在 MySQL 啟動時讀取的選項檔案中定義這些設定,然後再初始化 InnoDB
。通常,InnoDB
會在第一次啟動 MySQL 伺服器時初始化。
您可以將 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 8.4\bin
中,請像這樣啟動 MySQL 伺服器
C:\> "C:\Program Files\MySQL\MySQL Server 8.4\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 伺服器具有在日誌目錄中建立檔案的適當存取權限。更一般地說,伺服器必須在任何需要建立檔案的目錄中具有存取權限。
預設情況下,復原日誌位於初始化 MySQL 執行個體時建立的兩個復原表格空間中。
innodb_undo_directory
變數定義 InnoDB
建立預設復原表格空間的路徑。如果該變數未定義,則預設復原表格空間會在資料目錄中建立。innodb_undo_directory
變數不是動態的。設定它需要重新啟動伺服器。
復原日誌的 I/O 模式使復原表格空間非常適合 SSD 儲存。
有關設定額外復原表格空間的資訊,請參閱第 17.6.3.4 節,「復原表格空間」。
全域暫存表格空間儲存對使用者建立的暫存表格所做變更的回滾區段。
預設情況下,在 innodb_data_home_dir
目錄中有一個名為 ibtmp1
的單個自動擴充全域暫存表格空間資料檔案。初始檔案大小略大於 12MB。
innodb_temp_data_file_path
選項指定全域暫存表格空間資料檔案的路徑、檔案名稱和檔案大小。檔案大小以 KB、MB 或 GB 為單位指定,方法是在大小值後面附加 K、M 或 G。檔案大小或合併的檔案大小必須略大於 12MB。
若要指定全域暫存表格空間資料檔案的替代位置,請在啟動時設定 innodb_temp_data_file_path
選項。
在 MySQL 8.4 中,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 Corporation 提供的 MySQL 二進位檔案中僅為 256KB),並且在最壞的情況下還會使用 sort_buffer_size + read_buffer_size
的額外記憶體。
在 Linux 上,如果核心啟用了大頁面支援,InnoDB
可以使用大頁面來為其緩衝池分配記憶體。請參閱第 10.12.3.3 節,「啟用大頁面支援」。