您可以通过在服务器启动时 InnoDB启用配置选项来查询 MySQL 数据目录位于只读媒体上的表 。--innodb-read-only
如何启用
要为只读操作准备实例,请确保将所有必要信息刷新 到数据文件中,然后再将其存储在只读介质上。在禁用更改缓冲 ( innodb_change_buffering=0) 的情况下运行服务器并缓慢关闭。
要为整个 MySQL 实例启用只读模式,请在服务器启动时指定以下配置选项:
-
如果实例位于 DVD 或 CD 等只读媒体上,或者该
/var目录并非所有人都可写: 并且--pid-file=*path_on_writeable_media*--event-scheduler=disabled -
--innodb-temp-data-file-path. 此选项指定InnoDB临时表空间数据文件的路径、文件名和文件大小。默认设置是ibtmp1:12M:autoextend,它在数据目录中创建ibtmp1临时表空间数据文件。要为只读操作准备实例,请将其设置innodb_temp_data_file_path为数据目录之外的位置。路径必须相对于数据目录。例如:--innodb-temp-data-file-path=../../../tmp/ibtmp1:12M:autoextend
从 MySQL 8.0 开始,启用 innodb_read_only会阻止所有存储引擎的表创建和删除操作。这些操作修改 mysql系统数据库中的数据字典表,但这些表使用 存储引擎,启用InnoDB后无法修改。innodb_read_only相同的限制适用于修改数据字典表的任何操作,例如ANALYZE TABLE和 。 ALTER TABLE *tbl_name* ENGINE=*engine_name*
此外,mysql系统数据库中的其他表使用InnoDBMySQL 8.0 中的存储引擎。将这些表设为只读会限制修改它们的操作。例如, CREATE USER、 GRANT、 REVOKE和 INSTALL PLUGIN操作在只读模式下是不允许的。
使用场景
这种操作模式适用于以下情况:
- 在只读存储介质(如 DVD 或 CD)上分发 MySQL 应用程序或一组 MySQL 数据。
- 多个 MySQL 实例同时查询同一个数据目录,通常在数据仓库配置中。您可以使用这种技术来避免 负载过重的 MySQL 实例可能出现的 瓶颈,或者您可以为各种实例使用不同的配置选项来调整每个实例以用于特定类型的查询。
- 查询出于安全或数据完整性原因而被置于只读状态的数据,例如归档的备份数据。
笔记
此功能主要用于分发和部署的灵活性,而不是基于只读方面的原始性能。有关调整只读查询性能的方法,请参阅 第 8.5.3 节,“优化 InnoDB 只读事务”,这不需要将整个服务器设为只读。
这个怎么运作
当服务器通过该选项以只读模式运行时 --innodb-read-only,某些InnoDB功能和组件会减少或完全关闭:
- 没有进行更改缓冲,特别是没有从更改缓冲区进行合并。为确保在准备实例以进行只读操作时更改缓冲区为空,请禁用更改缓冲 (
innodb_change_buffering=0) 并先缓慢关闭。 - 启动时没有崩溃恢复阶段。实例必须在进入只读状态之前 执行缓慢关闭。
- 由于重做日志不用于只读操作,因此您可以
innodb_log_file_size在将实例设为只读之前将其设置为可能的最小大小 (1 MB)。 - 大多数后台线程都已关闭。保留 I/O 读取线程,以及用于写入临时文件的 I/O 写入线程和页面刷新协调器线程,这在只读模式下是允许的。缓冲池大小调整线程也保持活动状态,以启用缓冲池的在线大小调整。
- 有关死锁、监视器输出等的信息不会写入临时文件。因此,
SHOW ENGINE INNODB STATUS不会产生任何输出。 - 对配置选项设置的更改通常会更改写入操作的行为,但在服务器处于只读模式时无效。
- 强制隔离级别 的MVCC处理已关闭。所有查询都读取最新版本的记录,因为无法进行更新和删除。
- 不使用 撤消日志。
innodb_undo_tablespaces禁用和innodb_undo_directory配置选项 的任何设置 。




