核心文件记录运行进程的状态和内存映像。由于缓冲池驻留在主内存中,并且运行进程的内存映像被转储到核心文件中,因此当 mysqld 进程死亡时,具有大型缓冲池的系统可能会生成大型核心文件。
大型核心文件可能在多个方面造成问题,包括写入它们所需的时间、它们消耗的磁盘空间量以及与传输大型文件相关的挑战。
如果您担心将数据库页面转储到可能在您的组织内部或外部共享以进行调试目的的核心文件中,那么从安全角度考虑,排除缓冲池页面也可能是有利的。
在 mysqld 进程死亡时访问缓冲池页面中存在的数据可能在某些调试情况下是有益的。如果您不确定是否要包含或排除缓冲池页面,请咨询 MySQL 支持。
innodb_buffer_pool_in_core_file
选项仅在 core_file
变量已启用并且操作系统支持 MADV_DONTDUMP
对 madvise() 系统调用的非 POSIX 扩展时才相关,该扩展在 Linux 3.4 及更高版本中受支持。MADV_DONTDUMP
扩展会导致指定范围内的页面从核心转储中排除。默认情况下,在支持 MADV_DONTDUMP 的系统上,innodb_buffer_pool_in_core_file
选项处于禁用状态,否则默认为 ON。
在 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=ON
core_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 支持 | 结果 |
---|---|---|---|
OFF(默认) | 与结果无关 | 与结果无关 | 核心文件未生成 |
ON | ON(在没有 MADV_DONTDUMP 支持的系统上默认为 ON) |
与结果无关 | 核心文件生成,包含缓冲池页面 |
ON | 关闭 (在支持 MADV_DONTDUMP 的系统上默认开启) |
是 | 生成的核心文件不包含缓冲池页 |
ON | 关闭 | 否 | 不会生成核心文件,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 |