可以通过在服务器启动时启用 --innodb-read-only
配置选项来查询 MySQL 数据目录位于只读介质上的 InnoDB
表。
如何启用
要准备一个实例进行只读操作,请确保在将数据存储在只读介质上之前,所有必要的信息都已刷新到数据文件。运行服务器,禁用变更缓冲 (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 9.0 中,mysql
系统数据库中的其他表使用 InnoDB
存储引擎。使这些表变为只读会限制修改它们的那些操作。例如,CREATE USER
、GRANT
、REVOKE
和 INSTALL PLUGIN
操作在只读模式下不允许。
使用场景
这种操作模式适用于以下情况:
在 DVD 或 CD 等只读存储介质上分发 MySQL 应用程序或一组 MySQL 数据。
多个 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
配置选项的任何设置。