一些我们已经知道的默认设置,服务器允许同时连入的客户端的默认数量是151
,表的默认存储引擎是InnoDB
,我们可以在程序启动的时候去修改这些默认值,对于这种在程序启动时指定的设置项也称之为启动选项(startup options),这些选项控制着程序启动后的行为。在MySQL
安装目录下的bin
目录中的各种可执行文件,不论是服务器相关的程序(比如mysqld
、mysqld_safe
)还是客户端相关的程序(比如mysql
、mysqladmin
),在启动的时候基本都可以指定启动参数。这些启动参数可以放在命令行中指定,也可以把它们放在配置文件中指定。
在命令行上使用选项
如果我们在启动客户端程序时在-h
参数后边紧跟服务器的IP地址,这就意味着客户端和服务器之间需要通过TCP/IP
网络进行通信。因为我的客户端程序和服务器程序都装在一台计算机上,所以在使用客户端程序连接服务器程序时指定的主机名是127.0.0.1
的情况下,客户端进程和服务器进程之间会使用TCP/IP
网络进行通信。如果我们在启动服务器程序的时候就禁止各客户端使用TCP/IP
网络进行通信,可以在启动服务器程序的命令行里添加skip-networking
启动选项,就像这样:
mysqld --skip-networking
可以看到,我们在命令行中指定启动选项时需要在选项名前加上--
前缀。另外,如果选项名是由多个单词构成的,它们之间可以由短划线-
连接起来,也可以使用下划线_
连接起来,也就是说skip-networking
和skip_networking
表示的含义是相同的。所以上边的写法与下边的写法是等价的:
mysqld --skip_networking
在按照上述命令启动服务器程序后,如果我们再使用mysql
来启动客户端程序时,再把服务器主机名指定为127.0.0.1
(IP地址的形式)的话会显示连接失败:
mysql -h127.0.0.1 -uroot -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)
这就意味着我们指定的启动选项skip-networking
生效了!
再举一个例子,我们前边说过如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用InnoDB
作为表的存储引擎。如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
mysqld --default-storage-engine=MyISAM
我们现在就已经把表的默认存储引擎改为MyISAM
了,在客户端程序连接到服务器程序后试着创建一个表:
mysql> CREATE TABLE sys_var_demo(
-> i INT
-> );
Query OK, 0 rows affected (0.02 sec)
这个定义语句中我们并没有明确指定表的存储引擎,创建成功后再看一下这个表的结构:
mysql> SHOW CREATE TABLE sys_var_demo\G
*************************** 1. row ***************************
Table: sys_var_demo
Create Table: CREATE TABLE `sys_var_demo` (
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
可以看到该表的存储引擎已经是MyISAM
了,说明启动选项default-storage-engine
生效了。
所以在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
也就是说我们可以将各个启动选项写到一行中,各个启动选项之间使用空白字符隔开,在每一个启动选项名称前边添加--
。对于不需要值的启动选项,比方说skip-networking
,它们就不需要指定对应的值。对于需要指定值的启动选项,比如default-storage-engine
我们在指定这个设置项的时候需要显式的指定它的值,比方说InnoDB
、MyISAM
啦什么的~ 在命令行上指定有值的启动选项时需要注意,选项名、=、选项值之间不可以有空白字符,比如写成下边这样就是不正确的:
mysqld --default-storage-engine = MyISAM
--help选项,
使用mysql --help
可以看到mysql
程序支持的启动选项,mysqld_safe --help
可以看到mysqld_safe
程序支持的启动选项。查看mysqld
支持的启动选项有些特别,需要使用mysqld --verbose --help
。
配置文件
由于命令行启动选项只对只对当次启动生效,而且对于windows选手,配置文件是我们熟悉和推荐的方式
1.前三个后缀名可以是ini,cnf
2 %WINDIR%指的是你机器上Windows
目录的位置 .
3.BASEDIR
指的是MySQL
安装目录的路径
4. 第四个路径指的是我们在启动程序时可以通过指定defaults-extra-file
参数的值来添加额外的配置文件路径,比方说我们在命令行上可以这么写:
mysqld --defaults-extra-file=C:\Users\cxy\my_extra_file.txt
这样MySQL
服务器启动时就可以额外在C:\Users\xiaohaizi\my_extra_file.txt
这个路径下查找配置文件。
5. %APPDATA%
表示Windows
应用程序数据目录的值,可以使用下列命令查看:
echo %APPDATA%
配置文件的内容
与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]
扩起来,像这样:
[server]
option1 #这是option1,该选项不需要选项值
option2 = value2 #这是option2,该选项需要选项值
格式:
= 周围可以有空格,命令行不行
不能以--开头,一行只能设置一个启动选项
特定MySQL版本的专用选项组
我们可以在选项组的名称后加上特定的MySQL
版本号,比如对于[mysqld]
选项组来说,我们可以定义一个[mysqld-5.7]
的选项组,它的含义和[mysqld]
一样,只不过只有版本号为5.7
的mysqld
程序才能使用这个选项组中的选项。
优先级
1.不同文件,依次遍历,如果出现相同的组,以最后一个为主
2.同一文件,
[server] default-storage-engine=InnoDB
[mysqld] default-storage-engine=MyISAM
都能设置服务端的启动选项,还是以后面的为准
3.既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准
`defaults-extra-file`(增加扫描路径,原来的也扫)和`defaults-file`(不存在或无法访问报错)
查看常用的系统变量,支持通配符%,必须以 _ 连接
SHOW VARIABLES LIKE 'default_storage_engine'; (默认存储引擎)
SHOW VARIABLES LIKE 'max_connections'; (最多同时连接客户端数)
服务器程序运行过程中设置
对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器。不过系统变量有作用范围之分,
设置不同作用范围的系统变量
我们前边说过,多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,我们有时想让不同的客户端有不同的值。比方说狗哥使用客户端A,他想让当前客户端对应的默认存储引擎为InnoDB
,所以他可以把系统变量default_storage_engine
的值设置为InnoDB
;猫爷使用客户端B,他想让当前客户端对应的默认存储引擎为MyISAM
,所以他可以把系统变量default_storage_engine
的值设置为MyISAM
。这样可以使狗哥和猫爷的的客户端拥有不同的默认存储引擎,使用时互不影响,十分方便。但是这样各个客户端都私有一份系统变量会产生这么两个问题:
-
有一些系统变量并不是针对单个客户端的,比如允许同时连接到服务器的客户端数量
max_connections
,查询缓存的大小query_cache_size
,这些公有的系统变量让某个客户端私有显然不合适。 -
一个新连接到服务器的客户端对应的系统变量的值该怎么设置?
为了解决这两个问题,设计MySQL
的大叔提出了系统变量的作用范围
的概念,具体来说作用范围
分为这两种:
-
GLOBAL
:全局变量,影响服务器的整体操作。 -
SESSION
:会话变量,影响某个客户端连接的操作。(注:SESSION
有个别名叫LOCAL
)
以default_storage_engine
举例,在服务器启动时会初始化一个名为default_storage_engine
,作用范围为GLOBAL
的系统变量。之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个名为default_storage_engine
,作用范围为SESSION
的系统变量,该作用范围为SESSION
的系统变量值按照当前作用范围为GLOBAL
的同名系统变量值进行初始化。
所以,通过启动选项设置的系统变量的作用范围都是GLOBAL
的,也就是对所有客户端都有效的,
那么如何在服务端运行时修改global会话变量,使之后连接的客户端都使用新设置的系统变量呢
SET [GLOBAL|SESSION] 系统变量名 = 值;
或者写成这样也行:
SET [@@(GLOBAL|SESSION).]var_name = XXX;
比如我们想在服务器运行过程中把作用范围为GLOBAL
的系统变量default_storage_engine
的值修改为MyISAM
,也就是想让之后新连接到服务器的客户端都用MyISAM
作为默认的存储引擎,进行设置:
SET GLOBAL default_storage_engine = MyISAM;
SET @@GLOBAL.default_storage_engine = MyISAM;
如果只想在本客户端生效,即设置Session变量
SET SESSION default_storage_engine = MyISAM;
SET @@SESSION.default_storage_engine = MyISAM;
SET default_storange_engine = MyISAM; 如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION
问:既然系统变量
有作用范围
之分,那我们的SHOW VARIABLES
语句查看的是什么作用范围
的系统变量
呢?
答:默认查看的是SESSION
作用范围的系统变量。
show session variables; show global variables;
如果某个客户端改变了某个系统变量在`GLOBAL`作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为`SESSION`的值,只会影响后续连入的客户端在作用范围为`SESSION`的值。
注意事项
-
并不是所有系统变量都具有
GLOBAL
和SESSION
的作用范围。-
有一些系统变量只具有
GLOBAL
作用范围,比方说max_connections
,表示服务器程序支持同时最多有多少个客户端程序进行连接。 -
有一些系统变量只具有
SESSION
作用范围,比如insert_id
,表示插入值时使用的AUTO_INCREMENT
修饰的列的值。 -
有一些系统变量的值既具有
GLOBAL
作用范围,也具有SESSION
作用范围,比如我们前边用到的default_storage_engine
,而且其实大部分的系统变量都是这样的,
-
-
有些系统变量是只读的,并不能设置值。
比方说
version
,表示当前MySQL
的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES
语句里查看。
启动选项和系统变量的区别
启动选项
是在程序启动时我们程序员传递的一些参数,而系统变量
是影响服务器程序运行行为的变量,它们之间的关系如下:
-
大部分的系统变量都可以被当作启动选项传入。
-
有些系统变量是在程序运行过程中自动生成的,是不可以当作启动选项来设置,比如
auto_increment_offset
、character_set_client
啥的。 -
有些启动选项也不是系统变量,比如
defaults-file
。
状态变量
为了让我们更好的了解服务器程序的运行情况,MySQL
服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变量
。比方说Threads_connected
表示当前有多少客户端与服务器建立了连接,Handler_update
表示已经更新了多少行记录吧啦吧啦,像这样显示服务器程序状态信息的状态变量
还有好几百个
由于状态变量
是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是不能设置的。与系统变量
类似,状态变量
也有GLOBAL
和SESSION
两个作用范围的,所以查看状态变量
的语句可以这么写:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
类似的,如果我们不写明作用范围,默认的作用范围是SESSION
,比方说这样: