欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL的变量分类总结

程序员文章站 2022-03-23 17:16:09
在MySQL中,my.cnf是参数文件(Option Files),类似于ORACLE数据库中的spfile、pfile参数文件,照理说,参数文件my.cnf中的都是系统参数(这种称呼比较符合思维习惯),但是官方又称呼其为系统变量(system variables),那么到底这个叫系统参数或系统变量... ......

 

在MySQL中,my.cnf是参数文件(Option Files),类似于ORACLE数据库中的spfile、pfile参数文件,照理说,参数文件my.cnf中的都是系统参数(这种称呼比较符合思维习惯),但是官方又称呼其为系统变量(system variables),那么到底这个叫系统参数或系统变量(system variables)呢? 这个曾经是一个让我很纠结的问题,因为MySQL中有各种类型的变量,有时候语言就是这么博大精深;相信很多人也对这个问题或多或少有点困惑。其实抛开这些名词,它们就是同一个事情(东西),不管你叫它系统变量(system variables)或系统参数都可,无需那么纠结。 就好比王三,有人叫他王三;也有人也叫他王麻子绰号一样。

 

另外,MySQL中有很多变量类型,确实有时候让人有点混淆不清,本文打算总结一下MySQL数据库的各种变量类型,理清各种变量类型概念。能够从全局有个清晰思路。MySQL变量类型具体参考下图:

 

MySQL的变量分类总结

 

 

 

 

Server System Variables(系统变量)

 

 

MySQL系统变量(system variables)是指MySQL实例的各种系统变量,实际上是一些系统参数,用于初始化或设定数据库对系统资源的占用,文件存放位置等等,这些变量包含MySQL编译时的参数默认值,或者my.cnf配置文件里配置的参数值。默认情况下系统变量都是小写字母。官方文档介绍如下:

 

The MySQL server maintains many system variables that indicate how it is configured. Each system variable has a default value. System variables can be set at server startup using options on the command line or in an option file. Most of them can be changed dynamically at runtime using the SET statement, which enables you to modify operation of the server without having to stop and restart it. You can also use system variable values in expressions.

 

 

系统变量(system variables)按作用域范围可以分为会话级别系统变量和全局级别系统变量。如果要确认系统变量是全局级别还是会话级别,可以参考官方文档,如果Scope其值为GLOBAL或SESSION,表示变量既是全局级别系统变量,又是会话级别系统变量。如果其Scope其值为GLOBAL,表示系统变量为全局级别系统变量。

 

--查看系统变量的全局值

 

select * from information_schema.global_variables;

select * from information_schema.global_variables

  where variable_name='xxxx';

select * from performance_schema.global_variables;

 

 

--查看系统变量的当前会话值

 

select * from information_schema.session_variables;

    select * from information_schema.session_variables

  where variable_name='xxxx';

select * from performance_schema.session_variables;

 

 

 

 

SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;

 

mysql> show variables like '%connect_timeout%'; 

mysql> show local variables like '%connect_timeout%';

mysql> show session variables like '%connect_timeout%';

mysql> show global variables like '%connect_timeout%';

 

注意:对于SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值,如果要区分系统变量是全局还是会话级别。不能使用下面方式,如果某一个系统变量是全局级别的,那么在当前会话的值也是全局级别的值。例如系统变量AUTOMATIC_SP_PRIVILEGES,它是一个全局级别系统变量,但是 show session variables like '%automatic_sp_privileges%'一样能查到其值。所以这种方式无法区别系统变量是会话级别还是全局级别。

 

mysql> show session variables like '%automatic_sp_privileges%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| automatic_sp_privileges | ON    |
+-------------------------+-------+
1 row in set (0.00 sec)
 
mysql> select * from information_schema.global_variables
    -> where variable_name='automatic_sp_privileges';
+-------------------------+----------------+
| VARIABLE_NAME           | VARIABLE_VALUE |
+-------------------------+----------------+
| AUTOMATIC_SP_PRIVILEGES | ON             |
+-------------------------+----------------+
1 row in set, 1 warning (0.00 sec)
 
mysql> 

 

 

如果要区分系统变量是全局还是会话级别,可以用下面方式:

 

方法1: 查官方文档中系统变量的Scope属性。

方法2: 使用SET VARIABLE_NAME=xxx; 如果报ERROR 1229 (HY000),则表示该变量为全局,如果不报错,那么证明该系统变量为全局和会话两个级别。

   

 

mysql> SET AUTOMATIC_SP_PRIVILEGES=OFF;
 
ERROR 1229 (HY000): Variable 'automatic_sp_privileges' is a GLOBAL variable and should be set with SET GLOBAL

 

 

 

可以使用SET命令修改系统变量的值,如下所示:

 

修改全局级别系统变量:

 

SET GLOBAL max_connections=300;
 
SET @@global.max_connections=300;

 

注意:更改全局变量的值,需要拥有SUPER权限

 

修改会话级别系统变量:

 

   SET @@session.max_join_size=DEFAULT;

  SET max_join_size=DEFAULT;  --默认为会话变量。如果在变量名前没有级别限定符,表示修改会话级变量。

   SET SESSION max_join_size=DEFAULT;

 

如果修改系统全局变量没有指定GLOBAL或@@global的话,就会报Variable 'xxx' is a GLOBAL variable and should be set with SET GLOBAL这类错误。

 

mysql> set max_connections=300;
ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
mysql> set global max_connections=300;
Query OK, 0 rows affected (0.00 sec)
 
mysql> 

 

 

 

系统变量(system variables)按是否可以动态修改,可以分为系统动态变量(Dynamic System Variables)和系统静态变量。怎么区分系统变量是动态和静态的呢? 这个只能查看官方文档,系统变量的"Dynamic"属性为Yes,则表示可以动态修改。Dynamic Variable具体可以参考https://dev.mysql.com/doc/refman/5.7/en/dynamic-system-variables.html

 

另外,有些系统变量是只读的,不能修改的。如下所示:

 

mysql>

mysql> set global innodb_version='5.6.21';

ERROR 1238 (HY000): Variable 'innodb_version' is a read only variable

mysql>

 

 

另外,还有一个Structured System Variables概念,其实就是系统变量是一个结构体(Strut),官方介绍如下所示:

 

Structured System Variables

 

A structured variable differs from a regular system variable in two respects:

 

Its value is a structure with components that specify server parameters considered to be closely related.

 

There might be several instances of a given type of structured variable. Each one has a different name and refers to a different resource maintained by the server.

 

 

 

 

Server Status Variables(服务器状态变量)

 

 

MySQL状态变量(Server Status Variables)是当前服务器从启动后累计的一些系统状态信息,例如最大连接数,累计的中断连接等等,主要用于评估当前系统资源的使用情况以进一步分析系统性能而做出相应的调整决策。这个估计有人会跟系统变量混淆,其实状态变量是动态变化的,另外,状态变量是只读的:只能由MySQL服务器本身设置和修改,对于用户来说是只读的,不可以通过SET语句设置和修改它们,而系统变量则可以随时修改。状态变量也分为会话级与全局级别状态信息。有些状态变量可以用FLUSH STATUS语句重置为零值。