导读 如果我们想要查看mysql的某些属性或状态,我们可以查看mysql的变量,我们也可以通过改变这些变量的值,来设置mysql的工作属性,我们可以把mysql变量理解成mysql的参数,或者说属性值。

mysql中变量可以分为系统变量与状态变量。

系统变量配置了mysql的运行环境属性。

状态变量显示了mysql运行过程中的状态信息。

而系统变量从作用域划分,又可以分为全局变量和会话变量。

全局级别的变量:golbal variables,作用域为整个mysql服务器。

会话级别的变量:session variables,作用域为当前会话。

我们可以通过修改这些系统变量达到设置mysql属性的目的。

状态变量也分为全局级别与会话级别,但是用户无法设置状态变量,只能查看。

我们总结一些怎样查看这些变量,以及怎样设置这些变量。

查看变量方法如下

我们先来看看怎样查看全局级别的系统变量值。

show global variables \G;

从下图可以看出,我通过上述命令,能够查询出419个系统变量。

根据变量名查看变量值,比如我想查看所有跟”版本”相关的属性值

show global variables like ‘%version%’ \G;

比如想要查看字符集相关的全局设置。

show global variables where variable_name like ‘character%’;

比如想要查看某些日志是否开启或关闭。

show global variables where variable_name like ‘%log%’ and value=’off’;

查看会话级别的所有变量。

会话级别的所有参数往往比全局的更多,因为它不仅继承了全局的部分参数,可能还有一些额外的参数值。

使用如下语句查看会话级别的参数值。

show session variables \G;

当然,使用方法与全局的没有任何区别,只是将global关键字改为了session关键字。

注意:有些变量只存在于全局级别中,有些变量只存在于会话级别中。

如果不指明global或者session,则表示查看会话级别的变量值,如下语句表示显示会话级别的变量。

show variables;

我们也可以使用另一种语法,查看单个全局系统变量或者会话系统变量。

SELECT @@[global.|session.]system_var_name

但是使用上述语法,需要准确的指明变量名称,比如查看全局系统变量pid_file的值,示例如下。

select @@global.pid_file;

或者查看会话变量warning_count的值,示例语句如下。

select @@session.warning_count;

但是,我们不能在指明要查看全局变量时,却指定会话级别独有的变量,比如上例中的warning_count变量只存在于会话级别,但是我们偏偏却要使用如下方法查看,则会报错。

反之亦然

因为我们说过,有些变量只存在于全局级别,有些变量只存在于会话级别。

如果你并不清楚你要查询的变量具体属于哪个级别,可以不指明global或者session,如果不指明变量所在级别,则表示优先从会话级别查找对应的变量,如果对应变量存在,则显示其值,如果在会话级别中对应的变量不存在,则回去全局级别中查找对应的变量值,示例如下。

在写存储过程时,如果需要调用系统变量的值,可以通过如下方法调用。

@@GLOBAL.var_name

@@SESSION.var_name

同样 @@var_name 表示优先从会话级别获取变量值。

上述示例中的方法为怎样查看系统变量。

我们还可以查询mysql运行中的统计信息或状态数据,使用如下语句即可查看状态变量。

show status;

查询出的结果就是一个列表,易读性较高。

同理,也能够通过like过滤出我们想要查找的变量名称。

而且状态变量也分为全局级别与会话级别。

修改变量值/设定变量值 方法如下

我们可以通过两种方法修改数据库变量:

运行时修改,如果是运行时修改,修改是否立即生效取决于修改的变量类型:

运行时修改global级别的变量:对修改之前建立的会话没有影响,仅对修改后新建立的会话有效;

运行时修改session级别的变量:仅对当前会话有效,且立即生效;

通过配置文件修改:需重启后生效,但是永久有效。

我们可以通过set命令,运行时修改对应的变量。

比如,我们先查看一下session级别的某个变量。

会话级别中autocommit变量的值为1,我们现在将会话级别中的autocommit变量的值改为0

我们将设置系统变量的语法总结如下:

SET GLOBAL var_name = value;

SET @@GLOBAL.var_name = value;

SET SESSION var_name = value;

SET @@SESSION.var_name = value;

不指定级别表示默认为设置会话级别的变量。

SET var_name = value;

状态变量对于用户来说是只读的,所以,我们只要学会修改系统变量即可。

在修改系统变量时要记住如下注意点。

运行时修改的变量并非永久有效,重启后将会失效;

运行时修改global级别的变量:对修改之前建立的会话没有影响,仅对修改后新建立的会话有效;

运行时修改session级别的变量:仅对当前会话有效,且立即生效;

如果想要使设定永久有效,需要设置配置文件。

但是在不确定的情况下,不要随便修改配置文件,否则将可能会出现无法预计的问题。

原文来自:https://www.zsythink.net/archives/54

本文地址:https://www.linuxprobe.com/mysql-mariadb-variable.html编辑:倪家兴,审核员:逄增宝

Linux命令大全:https://www.linuxcool.com/

Linux系统大全:https://www.linuxdown.com/

红帽认证RHCE考试心得:https://www.rhce.net/