17.8.2 将 InnoDB 配置为只读操作
可以在 MySQL 数据目录位于只读媒体上时查询InnoDB
表,通过在服务器启动时启用--innodb-read-only
配置选项。
为只读操作准备实例,请在将其存储到只读媒体之前,确保所有必要信息已经flush到数据文件中。使用 change buffering disabled(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
防止所有存储引擎的表创建和drop操作。这些操作修改了数据字典表在 mysql
系统数据库中,但是那些表使用 InnoDB
存储引擎且不能在启用 innodb_read_only
时被修改。同样,任何修改数据字典表的操作都受到限制,例如 ANALYZE TABLE
和 ALTER TABLE
。tbl_name
ENGINE=engine_name
此外,MySQL 8.4中的mysql
系统数据库中其他表使用InnoDB存储引擎。将这些表设置为只读状态会对修改它们的操作施加限制。例如,CREATE USER
、GRANT
、REVOKE
和INSTALL PLUGIN
操作在只读模式下不可用。
这种操作模式适用于以下情况:
-
将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 写入线程和临时文件写入协调线程仍然活动,以便在只读模式下允许写入临时文件。缓冲池resize线程也保持活动状态,以启用在线缓冲池resize。
-
关于死锁、监控输出等信息不被写入临时文件。因此,
SHOW ENGINE INNODB STATUS
不会产生任何输出。 -
在服务器处于只读模式时,通常将写操作行为更改的配置选项设置无效。
-
为了强制隔离级别,MVCC 处理被关闭。所有查询都读取记录的最新版本,因为更新和删除操作不可能。
-
undo log 不被使用。禁用
innodb_undo_tablespaces
和innodb_undo_directory
配置选项的设置。