文件首頁
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 參考手冊  /  ...  /  InnoDB 啟動配置

17.8.1 InnoDB 啟動配置

關於 InnoDB 配置的第一個決定涉及資料檔案、日誌檔案、頁面大小和記憶體緩衝區的配置,這些應該在初始化 InnoDB 之前配置。在 InnoDB 初始化之後修改配置可能涉及非簡單的程序。

本節提供有關在設定檔中指定 InnoDB 設定、檢視 InnoDB 初始化資訊和重要儲存考量的資訊。

在 MySQL 選項檔案中指定選項

由於 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 初始化資訊

若要在啟動期間檢視 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]]

檔案大小以千位元組、兆位元組或吉位元組指定,方法是在大小值後附加 KMG。如果以千位元組指定資料檔案大小,則應以 1024 的倍數指定。否則,千位元組值將四捨五入到最接近的兆位元組 (MB) 邊界。檔案大小的總和必須至少略大於 12MB。

您可以使用以分號分隔的清單來指定多個資料檔案。例如

[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

autoextendmax 屬性只能用於最後指定的資料檔案。

指定 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 雙寫緩衝區儲存區域位於雙寫檔案中,這提供了雙寫頁面的儲存位置彈性。在先前的版本中,雙寫緩衝區儲存區域位於系統表格空間中。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_sizeinnodb_log_files_in_group 變數。當定義了 innodb_redo_log_capacity 設定時,會忽略 innodb_log_file_sizeinnodb_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_groupinnodb_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 的緩衝區

警告

在 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 節,「啟用大頁面支援」