背景
MySQL 5.7 及之前版本下修改配置,如果能动态修改的,可以用 set global 语法,不能动态修改的,只能修改 /etc/my.cnf
配置文件,之后重启生效。如果需要持久化动态修改的参数,也只能同时修改 /etc/my.cnf
配置文件。
这个对云上环境不友好,毕竟云数据库上,大家无法直接远程底层虚拟机修改配置文件。针对如何持久化参数配置,在 MySQL 8.0,有一个新特性,可以实现轻松修改配置文件,那就是 set persist 和 set persist_only 语法。前者用于修改并持久化动态参数,后者用于持久化静态参数。
修改并持久化动态参数一例
mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.01 sec)
mysql> set persist innodb_buffer_pool_size=134217728*2;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 268435456 |
+-------------------------+-----------+
1 row in set (0.00 sec)
在数据目录里,会生成一个持久化参数的 json 格式文件,内容如下:
[root@pxc1 data]# cat mysqld-auto.cnf |jq
{
"Version": 1,
"mysql_server": {
"innodb_buffer_pool_size": {
"Value": "268435456",
"Metadata": {
"Timestamp": 1570678719890919,
"User": "root",
"Host": "localhost"
}
}
}
点评:
居然有时间戳,还有谁修改了参数!
持久化静态参数一例
# 我们先模拟没有权限
mysql> revoke SYSTEM_VARIABLES_ADMIN, PERSIST_RO_VARIABLES_ADMIN on *.* from 'root'@'localhost';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show variables like 'innodb_log_file_size';