共计 2273 个字符,预计需要花费 6 分钟才能阅读完成。
导读 | 如果我们想要查看 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 级别的变量:仅对当前会话有效,且立即生效;
如果想要使设定永久有效,需要设置配置文件。
但是在不确定的情况下,不要随便修改配置文件,否则将可能会出现无法预计的问题。