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