一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

MySQL8.0新特性之持久化全局参数修改

时间:2016-09-19 编辑:简简单单 来源:一聚教程网

PS: 本文内容基于MySQL8.0.0版本,由于目前才Release了第一个开发版本,不排除后续行为会发生变化

相信很多朋友都有这样的体验,在实例启动的时候动态修改了某些配置,但是忘了修改配置文件,结果实例一重启修改就丢失了。或者对于诸如部署在云上的业务(例如RDS),通常用户是没有修改配置文件的权限的,这导致配置的设定不够灵活。从MySQL8.0开始,大家不用担心这个问题了,用户可以选择性的将配置进行持久化。

对应的Worklog: WL#8688

启用这个功能,使用特定的语法SET PERSIST来设定任意可动态修改的全局变量,例如:

mysql> SET PERSIST innodb_flush_log_at_trx_commit = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SET PERSIST sync_binlog = 1;
Query OK, 0 rows affected (0.00 sec)

此时检查默认的my.cnf文件并没有发生任何修改,但是数据目录下,多了个和之前MySQL版本不一样的文件:

$ls -lh mysqld-auto.cnf
-rw-r----- 1 zhaiwx users 81 Sep 17 18:09 mysqld-auto.cnf

文件的格式是JSON存储的,因此可以直接用内置的解析器进行解析

$cat mysqld-auto.cnf
{ "mysql_server": {"innodb_flush_log_at_trx_commit": "1" , "sync_binlog": "1" } }

mysqld-auto.cnf文件中的配置相比my.cnf文件具有高优先级,如果相同配置出现在两个文件中,就以mysqld-auto.cnf文件中的记录为主。

注意,即使你通过SET PERSIST修改配置的值并没有任何变化,也会写入到mysqld-auto.cnf文件中。但你可以通过设置成default值的方式将其从mysqld-auto.cnf文件中移走:

mysql> SET PERSIST innodb_flush_log_at_trx_commit = DEFAULT;
Query OK, 0 rows affected (0.00 sec)

=====
$cat mysqld-auto.cnf
{ "mysql_server": {"sync_binlog": "1" } }

你可以通过新的PS表performance_schema.variables_info来确定配置项的值的来源,共有几类:

enum enum_variable_source
{
  COMPILED= 1,
  GLOBAL,
  SERVER,
  EXPLICIT,
  EXTRA,
  MYSQL_USER,
  LOGIN,
  COMMAND_LINE,
  PERSISTED,
  DYNAMIC
};

系统表相关代码:storage/perfschema/table_variables_info.cc

==================

mysql> select * from performance_schema.variables_info where variable_source = 'PERSISTED'\G
*************************** 1. row ***************************
  VARIABLE_NAME: sync_binlog
VARIABLE_SOURCE: PERSISTED
  VARIABLE_PATH: /u01/my80/data/mysqld-auto.cnf
      MIN_VALUE: 0
      MAX_VALUE: 4294967295
1 row in set (0.00 sec)
如果你不想让mysqld-auto.cnf中的配置生效,可以在启动时关闭只读参数persisted_globals_load,这样在启动时就不会载入mysqld-auto.cnf中的配置项了。

主要代码:

Commit f2bc0f89b7f94cc8fe963d08157413a01d14d994

主要入口函数(8.0.0):

接口函数大多定义在sql/persisted_variable.cc文件中:
启动时载入mysqld-auto.cnf的内容: Persisted_variables_cache::load_persist_file(); 通过json解析合法性,并存入内存
将文件中读取的配置进行设置: Persisted_variables_cache::set_persist_options

运行SET PERSIST命令时,调用Persisted_variables_cache::set_variable 更新内存中存储的值
写入mysqld-auto.cnf文件中: Persisted_variables_cache::flush_to_file

热门栏目