您可以在 MySQL 数据目录位于只读介质上时查询 InnoDB
表,方法是启用 --innodb-read-only
配置选项在服务器启动时。
如何启用
要准备实例以进行只读操作,请确保所有必要信息在将其存储在只读介质上之前被 flush 到数据文件中。使用禁用更改缓冲 (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
启用
innodb_read_only
防止所有存储引擎的表创建和删除操作。这些操作修改数据字典表在 mysql
系统数据库中,但这些表使用 InnoDB
存储引擎且无法在 innodb_read_only
启用时修改。同样的限制也适用于任何修改数据字典表的操作,例如 ANALYZE TABLE
和 ALTER TABLE
。tbl_name
ENGINE=engine_name
此外,
mysql
系统数据库中的其他表也使用 InnoDB
存储引擎在 MySQL 8.3 中。使这些表只读将限制修改它们的操作。例如,CREATE USER
、GRANT
、REVOKE
和 INSTALL PLUGIN
操作在只读模式下不允许。
使用场景
这种操作模式适用于以下情况:
-
在只读存储介质上分发 MySQL 应用程序或一组 MySQL 数据,例如 DVD 或 CD。
-
多个 MySQL 实例同时查询同一个数据目录,通常是在数据仓库配置中。您可能使用这种技术来避免 瓶颈,这些瓶颈可能会出现在高度加载的 MySQL 实例中,或者您可能使用不同的配置选项来调整每个实例以适应特定的查询类型。
-
查询已经被置于只读状态以确保安全或数据完整性的数据,例如存档备份数据。
该功能主要是为了在分发和部署方面提供灵活性,而不是基于只读方面的原始性能。请参阅 第 10.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
不产生任何输出。 -
对配置选项设置的更改,通常会改变写入操作的行为,但是在服务器处于只读模式时无效。
-
撤销日志不使用。禁用
innodb_undo_tablespaces
和innodb_undo_directory
配置选项的设置。