核心檔案會記錄正在執行的處理序的狀態和記憶體映像。因為緩衝池駐留在主記憶體中,而且正在執行的處理序的記憶體映像會傾印到核心檔案,因此當 mysqld 處理序終止時,具有大型緩衝池的系統可能會產生大型核心檔案。
大型核心檔案可能會因為許多原因而造成問題,包括寫入它們所需的時間、它們所消耗的磁碟空間以及與傳輸大型檔案相關的挑戰。
如果您擔心將資料庫頁面傾印到可能在您的組織內部或外部共用的核心檔案以進行偵錯,則從安全性角度來看,排除緩衝池頁面也是可取的。
在 mysqld 處理序終止時,存取緩衝池頁面中存在的資料在某些偵錯案例中可能很有用。如果您不確定是否包含或排除緩衝池頁面,請諮詢 MySQL 支援。
只有在啟用 core_file 變數,且作業系統支援 madvise() 系統呼叫的非 POSIX 擴充功能 MADV_DONTDUMP 時,innodb_buffer_pool_in_core_file 選項才相關,而 Linux 3.4 和更新版本支援此擴充功能。MADV_DONTDUMP 擴充功能會導致指定範圍中的頁面從核心傾印中排除。在支援 MADV_DONTDUMP 的系統上,預設會停用 innodb_buffer_pool_in_core_file 選項,否則預設為開啟。
在 MySQL 8.4 之前,預設會啟用 innodb_buffer_pool_in_core_file,而不是停用。
若要產生具有緩衝池頁面的核心檔案,請使用 --core-file 和 --innodb-buffer-pool-in-core-file=ON 選項啟動伺服器。
$> mysqld --core-file --innodb-buffer-pool-in-core-file=ONcore_file 變數為唯讀,且預設為停用。藉由在啟動時指定 --core-file 選項即可啟用它。innodb_buffer_pool_in_core_file 變數是動態的。它可以在啟動時指定,也可以使用 SET 陳述式在執行時進行設定。
mysql> SET GLOBAL innodb_buffer_pool_in_core_file=OFF;如果停用 innodb_buffer_pool_in_core_file 變數,但作業系統不支援 MADV_DONTDUMP,或者發生 madvise() 失敗,則會將警告寫入 MySQL 伺服器錯誤日誌,並停用 core_file 變數,以防止寫入意外包含緩衝池頁面的核心檔案。如果唯讀 core_file 變數變成停用,則必須重新啟動伺服器才能再次啟用它。
下表顯示組態和 MADV_DONTDUMP 支援情境,這些情境決定是否產生核心檔案,以及是否包含緩衝池頁面。
表 17.4 核心檔案組態情境
core_file 變數 |
innodb_buffer_pool_in_core_file 變數 |
madvise() MADV_DONTDUMP 支援 | 結果 |
|---|---|---|---|
| 關閉 (預設) | 與結果無關 | 與結果無關 | 不產生核心檔案 |
| 開啟 | 開啟 (在不支援 MADV_DONTDUMP 的系統上的預設值) |
與結果無關 | 產生包含緩衝池頁面的核心檔案 |
| 開啟 | 關閉 (在支援 MADV_DONTDUMP 的系統上的預設值) |
是 | 產生不包含緩衝池頁面的核心檔案 |
| 開啟 | 關閉 | 否 | 不產生核心檔案,core_file 已停用,並且在伺服器錯誤日誌中寫入警告 |
藉由停用 innodb_buffer_pool_in_core_file 變數所實現的核心檔案大小縮減取決於緩衝池的大小,但也受 InnoDB 頁面大小的影響。較小的頁面大小意味著相同數量的資料需要更多的頁面,而更多的頁面意味著更多的頁面元資料。下表提供您可能會看到的,針對不同頁面大小的 1GB 緩衝池所做的尺寸縮減範例。
表 17.5 包含和排除緩衝池頁面的核心檔案大小
innodb_page_size 設定 |
包含緩衝池頁面 (innodb_buffer_pool_in_core_file=ON) |
排除緩衝池頁面 (innodb_buffer_pool_in_core_file=OFF) |
|---|---|---|
| 4KB | 2.1GB | 0.9GB |
| 64KB | 1.7GB | 0.7GB |