### 15.8.2 将 InnoDB 配置为只读操作

您可以查询`InnoDB`MySQL 数据目录位于只读媒体上的表，方法是启用[`--innodb-只读`](innodb-parameters.html#sysvar_innodb_read_only)服务器启动时的配置选项。

#### 如何启用

要为只读操作准备一个实例，请确保所有必要的信息都是[酡](glossary.html#glos_flush)在将数据文件存储在只读介质上之前。在禁用更改缓冲的情况下运行服务器（[`innodb_change_buffering=0`](innodb-parameters.html#sysvar_innodb_change_buffering)) 并做一个[缓慢关机](glossary.html#glos_slow_shutdown).

要为整个 MySQL 实例启用只读模式，请在服务器启动时指定以下配置选项：

-   [`--innodb-只读=1`](innodb-parameters.html#sysvar_innodb_read_only)

-   如果实例位于 DVD 或 CD 等只读媒体上，或者`/var`目录不是所有人都可以写的：[`--pid 文件=*`path_on_writeable_media`*`](server-system-variables.html#sysvar_pid_file)和[`--event-scheduler=禁用`](server-system-variables.html#sysvar_event_scheduler)

-   [`--innodb-temp-data-file-path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path).此选项指定路径、文件名和文件大小`InnoDB`临时表空间数据文件。默认设置是`ibtmp1:12M:自动扩展`，这创建了`ibtmp1`数据目录中的临时表空间数据文件。要为只读操作准备实例，请设置[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path)到数据目录之外的位置。路径必须相对于数据目录。例如：

    ```
    --innodb-temp-data-file-path=../../../tmp/ibtmp1:12M:autoextend
    ```

    从 MySQL 8.0 开始，启用[`innodb_read_only`](innodb-parameters.html#sysvar_innodb_read_only)防止所有存储引擎的表创建和删除操作。这些操作修改数据字典表`mysql`系统数据库，但这些表使用`InnoDB`存储引擎，不能修改时[`innodb_read_only`](innodb-parameters.html#sysvar_innodb_read_only)已启用。相同的限制适用于任何修改数据字典表的操作，例如[`分析表`](analyze-table.html)和[`更改表 *`tbl_name`*引擎=*`引擎名称`*`](alter-table.html).

    此外，该表中的其他表`mysql`系统数据库使用`InnoDB`MySQL 8.0 中的存储引擎。将这些表设为只读会限制修改它们的操作。例如，[`创建用户`](create-user.html),[`授予`](grant.html),[`撤销`](revoke.html)， 和[`安装插件`](install-plugin.html)只读模式下不允许操作。

#### 使用场景

这种操作模式适用于以下情况：

-   在只读存储介质（如 DVD 或 CD）上分发 MySQL 应用程序或一组 MySQL 数据。

-   多个 MySQL 实例同时查询同一数据目录，通常在数据仓库配置中。您可以使用此技术来避免[瓶颈](glossary.html#glos_bottleneck)这可能发生在负载很重的 MySQL 实例上，或者您可以为各种实例使用不同的配置选项来调整每个实例以用于特定类型的查询。

-   查询出于安全或数据完整性原因而被置于只读状态的数据，例如归档的备份数据。

笔记

此功能主要用于分发和部署的灵活性，而不是基于只读方面的原始性能。看[第 8.5.3 节，“优化 InnoDB 只读事务”](innodb-performance-ro-txn.html)用于调整只读查询性能的方法，不需要将整个服务器设为只读。

#### 这个怎么运作

当服务器通过只读模式运行时[`--innodb-只读`](innodb-parameters.html#sysvar_innodb_read_only)选项，确定`InnoDB`功能和组件被减少或完全关闭：

-   不[变化缓冲](glossary.html#glos_change_buffering)完成，特别是没有从更改缓冲区合并。要确保在准备实例进行只读操作时更改缓冲区为空，请禁用更改缓冲 ([`innodb_change_buffering=0`](innodb-parameters.html#sysvar_innodb_change_buffering)) 并做一个[缓慢关机](glossary.html#glos_slow_shutdown)第一的。

-   没有[崩溃恢复](glossary.html#glos_crash_recovery)启动阶段。该实例必须执行[缓慢关机](glossary.html#glos_slow_shutdown)在进入只读状态之前。

-   因为[重做日志](glossary.html#glos_redo_log)不用于只读操作，可以设置[`innodb_log_file_size`](innodb-parameters.html#sysvar_innodb_log_file_size)在将实例设为只读之前，将其设为可能的最小大小 (1 MB)。

-   大多数后台线程都已关闭。保留 I/O 读取线程，以及用于写入临时文件的 I/O 写入线程和页面刷新协调器线程，这在只读模式下是允许的。缓冲池大小调整线程也保持活动状态，以启用缓冲池的在线大小调整。

-   有关死锁、监视器输出等的信息不会写入临时文件。作为结果，[`显示引擎 INNODB 状态`](show-engine.html)不产生任何输出。

-   当服务器处于只读模式时，对通常会更改写入操作行为的配置选项设置的更改无效。

-   这[MVCC](glossary.html#glos_mvcc)处理强制执行[隔离级别](glossary.html#glos_isolation_level)已关闭。所有查询都读取最新版本的记录，因为无法进行更新和删除。

-   这[撤消日志](glossary.html#glos_undo_log)未使用。禁用任何设置[`innodb_undo_tablespaces`](innodb-parameters.html#sysvar_innodb_undo_tablespaces)和[`innodb_undo_directory`](innodb-parameters.html#sysvar_innodb_undo_directory)配置选项。
