核心文件记录了正在运行的进程的状态和内存映像。因为缓冲池驻留在主内存中,并且正在运行的进程的内存映像被转储到核心文件中,所以具有大缓冲池的系统可以在mysqld进程死亡时产生大的核心文件。
由于许多原因,大型核心文件可能会出现问题,包括写入它们所需的时间、它们消耗的磁盘空间量以及与传输大型文件相关的挑战。
要减小核心文件大小,您可以禁用该 innodb_buffer_pool_in_core_file 变量以从核心转储中省略缓冲池页面。该 innodb_buffer_pool_in_core_file 变量是在 MySQL 8.0.14 中引入的,默认情况下是启用的。
如果您担心将数据库页面转储到可能在组织内部或外部共享以进行调试的核心文件,则从安全角度来看,排除缓冲池页面也可能是可取的。
笔记
在某些调试场景中,访问mysqld进程终止 时存在于缓冲池页面中的数据可能是有益的。如果不确定是否包含或排除缓冲池页面,请咨询 MySQL 支持。
仅当启用该变量并且操作系统支持 madvise()系统调用的非 POSIX 扩展时, 禁用 innodb_buffer_pool_in_core_file 才会生效 ,Linux 3.4 及更高版本支持该扩展。该 扩展会导致指定范围内的页面从核心转储中排除。 core_fileMADV_DONTDUMP``MADV_DONTDUMP
假设操作系统支持 MADV_DONTDUMP扩展,使用--core-file和 --innodb-buffer-pool-in-core-file=OFF 选项启动服务器以生成没有缓冲池页面的核心文件。
$> mysqld --core-file --innodb-buffer-pool-in-core-file=OFF
该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了确定是否生成核心文件以及它们是否包含缓冲池页面的配置和支持方案。
表 15.4 核心文件配置场景
core_file多变的 |
innodb_buffer_pool_in_core_file 多变的 |
madvise() MADV_DONTDUMP 支持 | 结果 |
|---|---|---|---|
| 关闭(默认) | 与结果无关 | 与结果无关 | 未生成核心文件 |
| 在 | 开(默认) | 与结果无关 | 使用缓冲池页面生成核心文件 |
| 在 | 离开 | 是的 | 核心文件是在没有缓冲池页面的情况下生成的 |
| 在 | 离开 | 不 | 核心文件未生成,core_file 被禁用,并且向服务器错误日志写入警告 |
通过禁用该 innodb_buffer_pool_in_core_file 变量来减小核心文件大小取决于缓冲池的大小,但它也受InnoDB页面大小的影响。较小的页面大小意味着相同数量的数据需要更多的页面,更多的页面意味着更多的页面元数据。下表提供了大小缩减示例,您可能会看到具有不同页面大小的 1GB 缓冲池。
表 15.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 |




