MySQL 系统变量查看与设置(System Variables Configuration)

MySQL中有大量的系统变量控制服务器的行为,大部分的系统变量是不需要我们调整的,保持默认即可。但为了获得更高的性能和稳定性,有时需要适当对部分变量进行调整,本文总结了MySQL中系统变量的查看与设置方法。

目录

  • 一、变量的类型
  • 二、变量值的查看
    • [2.1 使用show命令查看变量](#2.1 使用show命令查看变量)
    • [2.2 使用select命令查看变量](#2.2 使用select命令查看变量)
    • [2.3 使用命令行工具mysqladmin查看](#2.3 使用命令行工具mysqladmin查看)
    • [2.4 通过performance_schema视图查看](#2.4 通过performance_schema视图查看)
  • 三、变量值的设置
    • [3.1 通过参数文件设置](#3.1 通过参数文件设置)
    • [3.2 通过命令行启动项设置](#3.2 通过命令行启动项设置)
    • [3.3 通过set命令设置](#3.3 通过set命令设置)
      • [3.3.1 使用persist/persist_only关键字持久化变更](#3.3.1 使用persist/persist_only关键字持久化变更)
      • [3.3.2 查询persist持久化变更信息](#3.3.2 查询persist持久化变更信息)

一、变量的类型

MySQL中根据变量的作用范围可以将其分为两种:

  • 全局变量:影响整个数据库
  • 会话变量:影响某个会话

大部分变量同时具有全局和会话两种作用范围,其中会话变量会在客户端连接到MySQL时会根据全局变量进行初始化。

而根据变量是否可以在数据库运行时动态修改,也可将变量分为两种:

  • 静态变量:数据库运行时不能修改,需要重启生效
  • 动态变量:可以数据库运行时修改,不需要重启

二、变量值的查看

系统变量有很多查询方式,以下为4种常用的查询变量值方法:

  • 通过show命令查看
  • 通过select命令查看
  • 通过命令行工具mysqladmin查看
  • 通过查询performance_schema视图查看

2.1 使用show命令查看变量

使用show [global | session] variables [like 'variable_name'];可以查看变量的值。global和session关键字指定查看全局或会话变量,省略时默认查看会话变量。like 'variable_name' 子句查看指定变量的值,可以使用通配符%和_,省略like子句则会输出所有变量。

示例:使用show命令查看autocommit(自动提交)变量的值,省略global/session时,默认返回会话变量的值(查看全局变量global不能省略):

sql 复制代码
show variables like 'autocommit';  -- 等于show session variables like 'autocommit';
show global variables like 'autocommit';

部分变量的范围只有全局,此时global/session关键字,无论用哪个关键字或省略,返回的都是全局变量值。例如max_connctions作用范围只有全局,下面的3个命令返回的都是全局的值:

sql 复制代码
show variables like 'max_connections';
show session variables like 'max_connections';
show global variables like 'max_connections';

2.2 使用select命令查看变量

使用select @@[global|session].variable_name; 可以查看指定变量的值,global/session省略时,默认查看会话变量。和show命令不同,select命令不能模糊匹配,只能查看某个具体变量的值。

示例:查看autocommit变量的值:

sql 复制代码
select @@autocommit;  -- 等于 select @@session.autocommit;
select @@global.autocommit;

2.3 使用命令行工具mysqladmin查看

使用MySQL自带的管理工具mysqladmin variables也可以查看系统变量,但这个命令只能输出全部的变量,通常配合grep过滤或重定向到文件后再查看。

powershell 复制代码
mysqladmin variables > variables.txt 

2.4 通过performance_schema视图查看

MySQL的performance_schema提供了几张视图可以直接用SQL查询变量信息:

  • global_variables 查询所有全局变量值
  • session_variables 查询所有会话变量值(当前会话)
  • variables_by_thread 查询每个会话的变量值(比session_variables多了一个thread_id)
  • variables_info 查询变量最近一次的设置信息,包括变量来源,范围,修改人,修改时间等

示例:查看全局变量autocommit的值:

sql 复制代码
select * from performance_schema.global_variables where variable_name='autocommit';

示例:查看最近一次autocommit变量的设置:

sql 复制代码
select * from performance_schema.variables_info where variable_name='autocommit';

三、变量值的设置

MySQL变量的设置有3种方式:

  • 通过参数文件设置
  • 通过命令行启动项设置
  • 通过set命令设置

MySQL启动时会根据参数文件初始化变量值,但MySQL的系统变量都有默认值,所以即使没有参数文件数据库也可以启动。这点和Oracle不同,Oracle如果没有初始化参数文件则无法启动。

3.1 通过参数文件设置

MySQL的参数文件是my.cnf,数据库在启动时会读取其[mysqld]和[server]模块下的内容并设置变量值。

可以通过下面的命令查看参数文件搜索路径,通常保留一个参数文件即可,后面的设置会覆盖前面的设置:

powershell 复制代码
mysqld --verbose --help | grep my.cnf

将需要设置的参数放在my.cnf中的[mysqld]或[server]模块下,变量名中的"-"和"_"是通用的。对于布尔类型的变量,1和on代表启用,0和off代表关闭。对于数值类型的变量,可以用数字,表达式或者K, M, G作为单位来设置,例如设置max_allowed_packet为8M,下面的3种设置方式是等价的:

sql 复制代码
max_allowed_packet=8388608
max_allowed_packet=8*1024*1024
max_allowed_packet=8M

3.2 通过命令行启动项设置

在MySQL启动时用--variables(前面有双横杠)的方式也可以设置系统变量,通过命令行启动参数设置变量比my.cnf文件中的设置优先级更高,但缺点是不能持久化,重启时容易忘记。因此这种设置方式不太建议(把重要的配置放到参数文件中)。

示例:下面通过命令行选项启动数据库,变量名中"_"和"-"是通用的:

powershell 复制代码
mysqld --user=mysql --port=3306 --max_allowed_packet=8M --lower-case-table-names=1 &

3.3 通过set命令设置

MySQL中set命令除了可以设置自定义变量,还可以在运行时修改系统变量的值。修改会话变量对当前会话立刻生效,修改全局变量只会影响后续新建会话,已存在的会话不受影响。

示例:全局变量设置,使用global或@@gloabl.限定全局变量,下面的2种设置方式是等价的:

sql 复制代码
set global max_connections=500;
set @@global.max_connections=500;

示例:会话变量设置使用session/@@session.,local/@@local.或省略,下面6种设置方式是等价的:

sql 复制代码
set session sql_mode='traditional';
set @@session.sql_mode='traditional';

set local sql_mode='traditional';
set @@local.sql_mode='traditional';

set sql_mode='traditional';
set @@sql_mode='traditional';

set命令还有个关键字default,可以将变量设置为初始值。会话变量会还原为全局变量的值,全局变量则设置为MySQL自己编译的默认值(不是启动时参数文件初始化的值):

sql 复制代码
set autocommit=default;
set global server_id=default;

3.3.1 使用persist/persist_only关键字持久化变更

上面的set命令都是动态修改变量,当会话退出,或者数据库重启,设置效果就消失了。MySQL8.0针对set命令做了持久化功能,通过persist/persist_only关键字可以将变更保存到数据目录下的mysqld-auto.cnf文件中,如此即使数据库重启设置也不会消失。

使用persist/persist_only持久化修改变量有如下优点:

  • 不需要修改my.cnf文件,意味着不需要登陆数据库服务器,通过远程会话即可持久化修改变量。
  • 自动语法校验,出现语法或变量值错误时,设置不会生效,而通过my.cnf文件,启动报错时才能知道错误。

示例:使用persist关键字修改全局变量同时持久化到mysqld-auto.cnf文件中(当前实例和重启都生效),下面2种方式是等价的:

sql 复制代码
set persist max_connections=500;
set @@persist.max_connections=500;

示例:使用persist_only关键字持久化到mysqld-auto.cnf文件中,但不修改当前系统全局变量(重启生效),下面2种方式是等价的:

sql 复制代码
set persist_only  server_id=32;
set @@persist_only.server_id=32;

持久化设置的变量可以通过reset persist [[if exists] variable_name];命令取消,if exists可以在未设置变量时不报错:

sql 复制代码
reset persist max_connections;  -- 取消指定的变量设置
reset persist;    -- 取消所有persist/persist_only设置的变量

3.3.2 查询persist持久化变更信息

mysqld-auto.cnf中的持久化变量会在参数文件my.cnf之后加载,相当于启动后对立刻数据库进行一次set global,因此可能覆盖my.cnf中的设置。而是否加载mysqld-auto.cnf由变量persisted_globals_load控制,设置为off则启动时会忽略mysqld-auto.cnf文件:

sql 复制代码
show variables like 'persisted_globals_load';

如果想知道有哪些变量通过set persist/persist_only命令做了持久化变更,可以通过下面两种方式查询:

  • 查看数据目录下的mysqld-auto.cnf文件内容
  • 通过select语句查询performance_schema.persisted_variables视图

示例:直接查看mysqld-auto.cnf内容,信息是以JSON格式存储的(不建议手动修改文件内容):

sql 复制代码
cat mysqld-auto.cnf

示例:通过performance_schema.persisted_variables查询:

sql 复制代码
select * from performance_schema.persisted_variables;

以上即是MySQL中系统变量的查询和修改方式,在修改变量前要熟悉变量的作用。在调整变量值之前最好通过mysqladmin variables命令将当前的服务器参数备份到文件中,如果调整后出现性能下降及时还原。

相关推荐
一个有温度的技术博主37 分钟前
Redis缓存预热:解决服务冷启动的“数据库杀手”问题
数据库·redis·缓存
ulias2127 小时前
Linux系统中的权限问题
linux·运维·服务器
沃尔威武8 小时前
数据库 Sinks(.net8)
数据库·.net·webview
青花瓷8 小时前
Ubuntu下OpenClaw的安装(豆包火山API版)
运维·服务器·ubuntu
Dreamboat¿9 小时前
SQL 注入漏洞
数据库·sql
Dream of maid9 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾9 小时前
统信系统UOS常用命令集
linux·运维·服务器
曹牧10 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星10 小时前
MySQL count()函数的用法
数据库·mysql
末央&10 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库