mysql服务器的系统变量,mysql server system viriables,其实我更愿意叫它为“系统参数”!
每一个系统变量都有一个默认值,这个默认值是在编译mysql系统的时候确定的。对系统变量的指定,一般可以在server启动的时候在命令行指定选项或者通过选项文件来指定,当然,大部分的系统变量,可以在系统的运行时,通过set命令指定其值。
mysql的系统参数(系统变量)一共分为2类,全局变量(global variables)和会话变量(session
variables),它们的含义与区别如其各占的名称所示。session
variables是在session级别的,对其的变更只会影响到本session。global
variables是系统级别的,对其的变更会影响所有新session(变更时已经存在session不受影响)至下次mysql
server重启动,注意它的变更影响不能跨重启,要想再mysql
server重启时也使用新的值,那么就只有通过在命令行指定变量选项或者更改选项文件来指定,而通过SET变更是达不到跨重启的。
当
系统启动是,它会初始化所有的global变量为它们对应的默认值,这些默认值可以通过命令行指定选项或者选项文件来改变。当一个新的连接建立后,系统也
会初始化一批session变量,把它们的值初始化对应的系统变量的值。可见任何一个session变量都有一个global变量与其对应,但是未必每个
global变量都有对应的session变量。
系统变量的变更,如果它的值是数字的,你可以通过简化使用K/M/G作为单位来指定。下面就来介绍一下几种变更系统变量的方法:
1、在mysql server启动的时候,命令行选项中指定
mysqld --query_cache_size=16M
--max_allowed_packet=1G
2、在mysql server启动的时候,通过选项文件中指定
[mysqld]
query_cache_size=16M
max_allowed_packet=1G
如果你想限制某个变量的最大值,那么在系统启动的时候通过–maximum-var_name=value方式来指定,如果假设我要限制
max_allowed_packet最多设置为4G,那么我只需要通过1、2方法指定:–maximum_allowed_packet=4G,就可以
了,这样在后面的动态改动中,都无法指定大于4G。
3、在mysql server运行的时候,通过SET命令动态指定
有很多的系统变量,都可以在mysql
server运行时,通过SET命令来动态指定她的值,这样的系统变量,我们又称之为“动态系统变量”(Dynamic System
Variables)。
我们首先来看看SET命令的语法:
SET variable_assignment [, variable_assignment] …
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| [@@global. | @@session. | @@]system_var_name = expr
i):如果要修改global系统变量值,你必须要显示指定“GLOBAL”或者“@@global.”,同时注意,你必须要有SUPER权限。
ii):如果要修改session变量值,可以指定“SESSION”或者“@@session.”或者“@@”或者“LOCAL”或者“@@local.”,或者什么都不使用。
有没有办法,将session变量值设置为对应的global变量值呢?有,采用如下方式:
SET @@session.var_name=@@global.var_name;
有没有办法,将session变量值设置为mysql编译时候的默认值呢?有,采用如下方式:
SET var_name=DEFAULT;
这里要注意的是,并不是所有的系统变量都能被设置为DEFAULT,如果你设置这些变量为DEFAULT则会返回错误。
上面说了如何设置变量,下面来介绍如何查询变量。
1、使用SELECT @@global.var_name等来查询。
mysql> select
@@session.table_type,@@local.table_type,@@table_type;
+----------------------+--------------------+--------------+
| @@session.table_type | @@local.table_type | @@table_type |
+----------------------+--------------------+--------------+
| InnoDB | InnoDB |
InnoDB |
+----------------------+--------------------+--------------+
1 row in set (0.00 sec)
mysql> select @@global.table_type;
+---------------------+
| @@global.table_type |
+---------------------+
| InnoDB |
+---------------------+
1 row in set (0.00 sec)
这里要注意的是,如果你查询session变量的值,如果没有这个session设置了值则返回其值,如果没有设置则其对应的global变量的值,这里与SET的时候是不一样滴。
2、使用SHOW VARIABLES语法:
SHOW [GLOBAL | SESSION] VARIABLES
[LIKE ‘pattern’ | WHERE expr]