核心文件记录正在运行的进程的状态和内存映像。因为缓冲池驻留在主内存中,并且正在运行的进程的内存映像被转储到核心文件,所以具有大缓冲池的系统可以在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_file
MADV_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 |