核心文件记录了正在运行的进程的状态和内存映像。由于缓冲池驻留在主内存中,并且正在运行的进程的内存映像被转储到核心文件中,因此具有大缓冲池的系统在 mysqld 进程死亡时可能会生成大型核心文件。
大型核心文件可能会引发多种问题,包括写入时间、磁盘空间消耗和大型文件传输的挑战。
要减少核心文件的大小,可以禁用 innodb_buffer_pool_in_core_file
变量,以排除缓冲池页面从核心转储中。默认情况下,它是启用的。
从安全角度来看,排除缓冲池页面也可能是可取的,因为您可能不想将数据库页面转储到核心文件中,以便在组织内部或外部用于调试目的。
在 mysqld 进程死亡时,缓冲池页面中的数据可能对某些调试场景有益。如果您不确定是否包括或排除缓冲池页面,请咨询 MySQL 支持。
禁用 innodb_buffer_pool_in_core_file
只有在 core_file
变量启用且操作系统支持 MADV_DONTDUMP
非 POSIX 扩展到 madvise() 系统调用时才生效,该扩展支持在 Linux 3.4 及更高版本中。
假设操作系统支持 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
支持场景,这些场景确定了核心文件是否生成以及是否包含缓冲池页面。
表 17.4 核心文件配置场景
core_file variable |
innodb_buffer_pool_in_core_file variable |
madvise() MADV_DONTDUMP Support | Outcome |
---|---|---|---|
OFF (default) | 不相关于结果 | 不相关于结果 | 核心文件不生成 |
ON | ON (默认) | 不相关于结果 | 核心文件生成,包含缓冲池页面 |
ON | OFF | 是 | 核心文件生成,不包含缓冲池页面 |
ON | OFF | 否 | 核心文件不生成,core_file 被禁用,并写入警告到服务器错误日志 |
通过禁用 innodb_buffer_pool_in_core_file
变量,核心文件大小的减少取决于缓冲池的大小,但也受到 InnoDB
页大小的影响。较小的页大小意味着相同数据量需要更多页,更多页意味着更多页元数据。下表提供了 1GB 缓冲池不同页大小下的大小减少示例。
表 17.5 缓冲池页包含和排除时的核心文件大小
innodb_page_size Setting |
Buffer Pool Pages Included (innodb_buffer_pool_in_core_file=ON ) |
Buffer Pool Pages Excluded (innodb_buffer_pool_in_core_file=OFF ) |
---|---|---|
4KB | 2.1GB | 0.9GB |
64KB | 1.7GB | 0.7GB |