InnoDB配置为只读操作
InnoDB
通过--innodb-read-only
在服务器启动时启用配置选项来查询MySQL数据目录位于只读介质上的表。
如何启用
要为只读操作准备实例,请确保将所有必需的信息刷新到数据文件,然后再将其存储在只读介质上。在禁用更改缓冲(innodb_change_buffering=0
)的情况下运行服务器,并执行慢速关机。
要为整个MySQL实例启用只读模式,请在服务器启动时指定以下配置选项:
--innodb-read-only=1
- 如果实例位于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
系统数据库中的其他表使用InnoDB
MySQL 8.0中的存储引擎。将这些表设为只读会导致对其进行修改的操作受到限制。例如,CREATE USER
,GRANT
,REVOKE
,和INSTALL PLUGIN
操作不在只读模式允许的。
使用场景
此操作模式适用于以下情况:
- 在只读存储介质(例如DVD或CD)上分发MySQL应用程序或一组MySQL数据。
- 通常在数据仓库配置中,多个MySQL实例同时查询同一数据目录。您可以使用此技术来避免在MySQL实例负载重的情况下可能出现的瓶颈,或者您可以对各种实例使用不同的配置选项以针对特定种类的查询调整每个实例。
- 查询出于安全性或数据完整性原因而处于只读状态的数据,例如已存档的备份数据。
注意此功能主要用于分发和部署中的灵活性,而不是基于只读方面的原始性能。有关调整只读查询性能的方法,请参见“优化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
配置选项的任何设置。