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