以前在做MySQL DBA 的时候,常遇到这样的场景:在数据库运行状态下动态修改了某些配置,但是忘了修改配置文件,结果后面数据库重启之后,之前的修改丢失了。对于做过 Oracle DBA 的同学来说,就完全可以在数据库运行过程中自行控制修改的参数属否要持久化到配置文件中。MySQL8.0 中对这一方面也做了很好的借鉴,学习 Oracle ,也可以针对参数修改做持久化控制了。用户可以选择性的将配置进行持久化。
如果需要启用这个功能,可以通过执行 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)z
但是有同学可能会发现,这时候如果检查my.cnf文件,好想并没有找到这个修改。其实MySQL是在数据目录下,多了个和之前MySQL版本不一样的文件:
$ls -lh mysqld-auto.cnf
-rw-r----- 1 Sky users 81 Oct 16 15:09 mysqld-auto.cnf
文件是JSON格式的, 可以直接用内置的解析器进行解析
$cat mysqld-auto.cnf
{ "mysql_server": {"innodb_flush_log_at_trx_commit": "1" , "sync_binlog": "1" } }
MySQL通过控制 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" } }
你可以通过新的performance_schema.variables_info来确定配置项的值的来源,共有几类:
enum enum_variable_source
{
COMPILED= 1,
GLOBAL,
SERVER,
EXPLICIT,
EXTRA,
MYSQL_USER,
LOGIN,
COMMAND_LINE,
PERSISTED,
DYNAMIC
};
mysql> select * from performance_schema.variables_info where variable_source = 'PERSISTED'\G
*************************** 1. row ***************************
VARIABLE_NAME: sync_binlog
VARIABLE_SOURCE: PERSISTED
VARIABLE_PATH: /data/mysqldata/mydata/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中的配置项了。
参考文档: