MySql--系统变量

摘要

系统变量

可以设置在配置文件中,也可以通过set命令进行设置

mysql配置文件中大部分变量都可以通过set命令设置,注意重启mysql后会失效,要及时更新配置文件

  • 设置变量示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看全部全局变量
mysql> show global variables\G

# 查看指定变量,如wait_timeout,也可以使用%进行模糊匹配
# 默认8小时,客户端超过这个时间没有向服务端发送命令,服务器端会自动断开连接
mysql> show global variables like "wait_timeout";
# 定值查询可以使用如下sql形式
mysql> select @@wait_timeout;
# 模糊匹配
mysql> show variables like '%log_bin%';

# 设置全局变量,只要mysql不重启就会一直有效,注意,客户端需要重新连接才能生效
mysql> set global wait_timeout=288000;
mysql> set @@global.wait_timeout=288000;

# 当前会话有效
mysql> set session wait_timeout=288000;
# 当前会话可简写为如下形式
mysql> set wait_timeout=288000;
  • MySQL 8.0 版本支持在线修改全局参数持久化,通过加上 PERSIST 关键字,可以将调整持久化到新的配置文件中,再次重启 db 还可以应用到最新的参数。

1
mysql> set persist max_connections=300;
  • 这种方式并不会修改mysql的配置文件,而是在datadir路径下创建一个mysqld-auto.cnf文件,在数据库启动时,会首先读取它配置文件,最后才读取mysqld-auto.cnf文件。不要手工修改这个文件。

1
2
more mysqld-auto.cnf
{"Version": 2, "mysql_dynamic_parse_early_variables": {"max_connections": {"Value": "300", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1665567597776824}}}}
  • 可手动删除mysqld-auto.cnf文件或将persisted_globals_load变量设置为off来避免该文件的加载。

1
2
3
4
5
6
mysql> show variables like 'persisted_globals_load';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| persisted_globals_load | ON |
+------------------------+-------+
  • 持久化为默认值: 全局变量持久化为默认值。注意,是默认值,而不是修改前的值

1
mysql> set persist max_connections=default;
  • 清空持久化变量: 只会清空mysqld-auto.cnf中的配置,不会改变已经持久化的变量值

1
mysql> reset persist;
1
2
more mysqld-auto.cnf
{"Version": 2}
  • 修改只读变量,对于read only的参数,修改参数后需要重启才能生效

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> set persist innodb_log_file_size=2073741824;
ERROR 1238 (HY000): Variable 'innodb_log_file_size' is a read only variable
mysql> set persist_only innodb_log_file_size=2073741824;
ERROR 3630 (42000): Access denied; you need SYSTEM_VARIABLES_ADMIN and PERSIST_RO_VARIABLES_ADMIN privileges for this operation
# 先授权
mysql> GRANT SYSTEM_VARIABLES_ADMIN,PERSIST_RO_VARIABLES_ADMIN ON *.* TO 'root'@'%';
mysql> set persist_only innodb_log_file_size=2073741824;
mysql> show variables like 'innodb_log_file_size';
+----------------------+-----------+
| Variable_name | Value |
+----------------------+-----------+
| innodb_log_file_size | 268435456 |
+----------------------+-----------+
1
2
more mysqld-auto.cnf
{"Version": 2, "mysql_static_variables": {"innodb_log_file_size": {"Value": "2073741824", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1665568764002942}}}}