#### 15.8.3.7 从核心文件中排除缓冲池页面

[](<>)[](<>)[](<>)[](<>)

核心文件记录了正在运行的进程的状态和内存映像。由于缓冲池驻留在主内存中，并且正在运行的进程的内存映像被转储到核心文件中，因此具有大缓冲池的系统在[**mysqld**](mysqld.html)进程死亡。

由于多种原因，大型核心文件可能会出现问题，包括写入它们所需的时间、它们消耗的磁盘空间量以及与传输大型文件相关的挑战。

要减小核心文件大小，您可以禁用[`innodb_buffer_pool_in_core_file`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)变量以从核心转储中省略缓冲池页面。这[`innodb_buffer_pool_in_core_file`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)变量是在 MySQL 8.0.14 中引入的，默认启用。

如果您担心将数据库页面转储到可能在组织内部或外部共享以进行调试的核心文件，则从安全角度来看，排除缓冲池页面也可能是可取的。

笔记

访问当时存在于缓冲池页面中的数据[**mysqld**](mysqld.html)process dead 在某些调试场景中可能是有益的。如果不确定是否包含或排除缓冲池页面，请咨​​询 MySQL 支持。

禁用[`innodb_buffer_pool_in_core_file`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)只有当[`核心文件`](server-system-variables.html#sysvar_core_file)变量已启用且操作系统支持`MADV_DONTDUMP`非 POSIX 扩展[疯狂的（）](http://man7.org/linux/man-pages/man2/madvise.2.html)系统调用，在 Linux 3.4 及更高版本中受支持。这`MADV_DONTDUMP`扩展会导致指定范围内的页面从核心转储中排除。

假设操作系统支持`MADV_DONTDUMP`扩展，启动服务器[`--核心文件`](server-options.html#option_mysqld_core-file)和[`--innodb-buffer-pool-in-core-file=OFF`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)生成没有缓冲池页面的核心文件的选项。

```
$> mysqld --core-file --innodb-buffer-pool-in-core-file=OFF
```

这[`核心文件`](server-system-variables.html#sysvar_core_file)变量是只读的，默认禁用。它通过指定[`--核心文件`](server-options.html#option_mysqld_core-file)启动时的选项。这[`innodb_buffer_pool_in_core_file`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)变量是动态的。它可以在启动时指定或在运行时使用[`放`](set-variable.html)陈述。

```
mysql> SET GLOBAL innodb_buffer_pool_in_core_file=OFF;
```

如果[`innodb_buffer_pool_in_core_file`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)变量被禁用但`MADV_DONTDUMP`操作系统不支持，或者`疯狂的（）`发生故障时，将向 MySQL 服务器错误日志写入警告，并且[`核心文件`](server-system-variables.html#sysvar_core_file)变量被禁用以防止写入无意中包含缓冲池页面的核心文件。如果只读[`核心文件`](server-system-variables.html#sysvar_core_file)变量被禁用，必须重新启动服务器才能再次启用它。

下表显示了配置和`MADV_DONTDUMP`支持确定是否生成核心文件以及它们是否包含缓冲池页面的方案。

[](<>)

**表 15.4 核心文件配置方案**

| [`核心文件`](server-system-variables.html#sysvar_core_file)多变的 | [`innodb_buffer_pool_in_core_file`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)多变的 | madvise()\_不要转储支持 | 结果 |
| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------- | --- |
| 关闭（默认） | 与结果无关 | 与结果无关 | 未生成核心文件 |
| 在 | 开（默认） | 与结果无关 | 使用缓冲池页面生成核心文件 |
| 在 | 离开 | 是的 | 核心文件是在没有缓冲池页面的情况下生成的 |
| 在 | 离开 | 不 | 没有生成核心文件，[`核心文件`](server-system-variables.html#sysvar_core_file)被禁用，并且向服务器错误日志写入警告 |

通过禁用[`innodb_buffer_pool_in_core_file`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)变量取决于缓冲池的大小，但它也受`InnoDB`页面大小。较小的页面大小意味着相同数量的数据需要更多的页面，更多的页面意味着更多的页面元数据。下表提供了大小缩减示例，您可能会看到具有不同页面大小的 1GB 缓冲池。

[](<>)

**表 15.5 包含和排除缓冲池页面的核心文件大小**

| [`innodb_page_size`](innodb-parameters.html#sysvar_innodb_page_size)环境 | 包括缓冲池页（[`innodb_buffer_pool_in_core_file=ON`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)) | 已排除的缓冲池页面 ([`innodb_buffer_pool_in_core_file=OFF`](innodb-parameters.html#sysvar_innodb_buffer_pool_in_core_file)) |
| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| 4KB | 2.1GB | 0.9GB |
| 64KB | 1.7GB | 0.7GB |
