17.8.3.7 排除或包括缓冲池页面从核心文件
核心文件记录了运行进程的状态和内存映像。由于缓冲池位于主内存中,而运行进程的内存映像被dump到核心文件中,因此具有大缓冲池的系统可能在mysqld进程死后生成大的核心文件。
大核心文件可能会出现多种问题,包括写入时间、磁盘空间占用和传输大文件的挑战。
排除缓冲池页面也可能是出于安全考虑的原因,如果您对将数据库页面dump到核心文件中有疑虑,这些文件可能会被共享在您的组织内部或外部用于调试目的。
在mysqld进程死后访问缓冲池页面中的数据可能在某些调试场景中非常有用。如果您对是否包括或排除缓冲池页面存在疑虑,请咨询MySQL支持。
只有在core_文件
变量启用且操作系统支持madvise()系统调用中的MADV_DONTDUMP
非 POSIX 扩展时,innodb_ buffer_pool_in_core_file
选项才是有意义的。该扩展在 Linux 3.4 及更高版本中支持,导致指定范围内的页面被排除在核心dump中。innodb_ buffer_pool_in_core_file
选项默认禁用,在支持 MADV_DONTDUMP 的系统上否则默认为 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_文件
变量是只读的,且默认禁用。可以通过在启动时指定--核心文件
选项来启用它。innodb_缓冲池在核心文件中
变量是动态的,可以在启动时或使用SET
语句在运行时配置。
mysql> SET GLOBAL innodb_buffer_pool_in_core_file=OFF;
如果innodb_缓冲池在核心文件中
变量被禁用,但操作系统不支持 MADV_DONTDUMP
,或出现madvise()
失败,MySQL 服务器错误日志中将写入警告,并禁用core_文件
变量,以防止意外包含缓冲池页的核心文件。如果只读core_文件
变量被禁用,服务器必须重新启动以启用它。
以下表格显示了配置和 MADV_DONTDUMP
支持方案,该方案确定是否生成核心文件,以及它们是否包含缓冲池页。
Table 17.4 核心文件配置方案
core_file variable |
innodb_buffer_pool_in_core_file variable |
madvise() MADV_DONTDUMP Support | Outcome |
---|---|---|---|
OFF (default) | 不相关的结果 | 不相关的结果 | 不生成核心文件 |
ON | 在没有MADV_ DONTDUMP 支持的系统上(默认) |
不影响结果 | 生成核心文件时包括缓冲池页 |
ON | OFF(在有MADV_ DONTDUMP 支持的系统上默认) |
是 | 生成核心文件时不包括缓冲池页 |
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 |