MySQL8新特性-PERSIST

12月 25th, 2017

在以前是版本里我们set 一个参数的时候可以使用GLOBAL | SESSION和影响当前会话和全局的参数。但是即使是global的参数在重新启动实例以后也是会消失的。为此在MySQL8以后的版本引入了另外的两个语法参数,我们使用help set可以看到一共用了以下四个值。
[GLOBAL | SESSION | PERSIST | PERSIST_ONLY]
[@@global. | @@session. | @@persist. | @@persist_only. | @@]
简单来说PERSIST这是一个用来配置持续优化统计参数的语法。当我们set PERSIST system_var_name = expr的时候,我们可以在运行时进行配置更改并保存,在服务器重启后仍生效, 这个环境变量在修改的同时还会影响到数据文件目录的一个叫做mysqld-auto.cnf的文件,mysql在重新启动的时候,会优先使用这个文件里的参数值。mysql给我的建议是mysqld-auto.cnf文件应由管理服务器,而不是手动执行。我们先来简单的看一个例子

在修改之前我们先查看一下:
dba@(none) 10:39:24>select * from performance_schema.variables_info where VARIABLE_NAME=’mandatory_role;
+—————–+—————–+—————+———–+———–+———————+———-+———-+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME | SET_USER | SET_HOST |
+—————–+—————–+—————+———–+———–+———————+———-+———-+
| mandatory_roles | COMPILED | | 0 | 0 | 2017-11-08 10:58:40 | | |
+—————–+—————–+—————+———–+———–+———————+———-+———-+
1 row in set (0.00 sec)

然后我们修改这个值:
SET PERSIST mandatory_roles = ‘app_developer@%’;

然后查看一下这个值的确是被修改了:
dba@(none) 10:40:43>
dba@(none) 10:40:43>select * from performance_schema.variables_info where VARIABLE_NAME=’mandatory_roles’;
+—————–+—————–+—————+———–+———–+———————+———-+———–+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME | SET_USER | SET_HOST |
+—————–+—————–+—————+———–+———–+———————+———-+———–+
| mandatory_roles | DYNAMIC | | 0 | 0 | 2017-11-08 14:35:24 | dbadmin | localhost |
+—————–+—————–+—————+———–+———–+———————+———-+———–+
1 row in set (0.00 sec)

可以发现在我们的my.cnf文件里这个值并没有被修改。
$cat my.cnf | grep mandatory_roles

然后我们去数据文件所在的目录查看多出来的一个文件。
$cat mysqld-auto.cnf
{ “mysql_server”: {“mandatory_roles”: “app_developer@%”} }
可以看到是一个json格式的描述文件。
接下来我们重启数据库,然后查看当前参数的值。
dbadmin@(none) 10:52:49>show variables like ‘%mandatory_roles%’;
+—————–+—————–+
| Variable_name | Value |
+—————–+—————–+
| mandatory_roles | app_developer@% |
+—————–+—————–+
1 row in set (0.00 sec)

dba@(none) 10:55:11>select * from performance_schema.variables_info where VARIABLE_NAME=’mandatory_roles’\G
*************************** 1. row ***************************
VARIABLE_NAME: mandatory_roles
VARIABLE_SOURCE: PERSISTED
VARIABLE_PATH: /u01/my3306/data/mysqld-auto.cnf
MIN_VALUE: 0
MAX_VALUE: 0
SET_TIME: 2017-11-09 10:52:14
SET_USER:
SET_HOST:
1 row in set (0.00 sec)
可以发现还是修改过值。这也证明了我们的的配置进行了持久化。

那么我们怎么取消这个值设置呢。
有两种方法,它们略有一点不同
1.SET PERSIST mandatory_roles = DEFAULT;
2.RESET PERSIST IF EXISTS mandatory_roles;
在我们使用第一种方法的时候,mysqld-auto.cnf还是有这个值的,当我们再次重启的时候它还是读这个文件
$cat data/mysqld-auto.cnf
{ “mysql_server”: {“mandatory_roles”: “” } }
在我们使用第二种方法的时候就完全把这个参数的内容的去掉。
$cat data/mysqld-auto.cnf
{ “mysql_server”: { } }

使用第二种如果不存在的话:
dba@(none) 10:59:27>RESET PERSIST IF EXISTS mandatory_roles;
Query OK, 0 rows affected, 1 warning (0.00 sec)

dba@(none) 11:01:22>show warnings;
+———+——+——————————————————————+
| Level | Code | Message |
+———+——+——————————————————————+
| Warning | 3615 | Variable mandatory_roles does not exist in persisted config file |
+———+——+——————————————————————+
1 row in set (0.00 sec)

dba@(none) 11:01:27>RESET PERSIST mandatory_roles;
ERROR 3615 (HY000): Variable mandatory_roles does not exist in persisted config file

当然我们也可以只使用@@persist_only 来影响mysqld-auto.cnf的文件,在下次重启以后才生产。

整个的使用就像oralce的pfile和spfile。

如果你不想让mysqld-auto.cnf中的配置生效,可以在启动时关闭只读参数persisted_globals_load,这样在启动时就不会载入mysqld-auto.cnf中的配置项了

https://dev.mysql.com/doc/refman/8.0/en/set-variable.html?spm=5176.100239.blogcont60656.10.SVzv1S

标签:
目前还没有任何评论.