14.8.2 将 InnoDB 配置为只读操作

您可以通过在服务器启动时启用--innodb-read-only配置选项来查询 MySQL 数据目录位于只读介质上的InnoDBtable。

如何启用

要为只读操作准备实例,请在将其存储在只读介质上之前,确保所有必需的信息都为数据文件的flushed。在禁用更改缓冲(innodb_change_buffering=0)的情况下运行服务器,并执行slow shutdown

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

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

Usage Scenarios

此操作模式适用于以下情况:

  • 在只读存储介质(例如 DVD 或 CD)上分发 MySQL 应用程序或一组 MySQL 数据。

  • 通常在数据仓库配置中,多个 MySQL 实例同时查询同一数据目录。您可能会使用此技术来避免在负载很重的 MySQL 实例中发生bottlenecks的情况,或者可能对各种实例使用不同的配置选项来针对特定种类的查询调整每个实例。

  • 查询出于安全性或数据完整性原因而处于只读状态的数据,例如已存档的备份数据。

Note

此功能主要用于分发和部署中的灵 Active,而不是基于只读方面的原始性能。有关调整只读查询性能的方法,请参见第 8.5.3 节“优化 InnoDB 只读事务”,该方法不需要将整个服务器设置为只读。

工作原理

通过--innodb-read-only选项以只读模式运行服务器时,某些InnoDB功能部件和组件将减少或完全关闭:

  • 没有完成change buffering,特别是没有来自更改缓冲区的合并。要确保实例准备只读操作时更改缓冲区为空,请禁用更改缓冲(innodb_change_buffering=0)并先执行slow shutdown

  • 启动时没有crash recovery阶段。实例必须先执行slow shutdown,然后才能进入只读状态。

  • 由于redo log不在只读操作中使用,因此您可以将innodb_log_file_size设置为可能的最小大小(1 MB),然后再将实例设为只读。

  • 大多数后台线程已关闭。保留 I/O 读取线程,以及 I/O 写入线程和用于向临时文件写入的页面清除器线程,这在只读模式下是允许的。

  • 有关死锁,监视器输出等的信息不会写入临时文件。结果,显示引擎的 INNODB 状态不产生任何输出。

  • 如果 MySQL 服务器以--innodb-read-only启动,但数据目录仍位于可写媒体上,则 root 用户仍可以执行DCL操作,例如GRANTREVOKE

  • 当服务器处于只读模式时,通常会更 Rewrite 操作行为的配置选项设置更改将无效。

  • 强制执行MVCCMVCC处理已关闭。所有查询都读取记录的最新版本,因为无法进行更新和删除。

  • undo log未使用。禁用innodb_undo_tablespacesinnodb_undo_directory配置选项的任何设置。