理解Mysql(二)服务器的配置信息

138 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

启动Mysql服务器的时候,它是有默认配置的。例如:默认的存储引擎、允许同时连接的客户端数等等。

Mysql是支持我们在启动服务器时去修改这些默认配置的,了解一下如何配置Mysql启动配置。

命令行启动配置

禁用TCP/IP的方式连接

通过mysql -hIP -P3306 -uroot -p是以TCP/IP的方式连接客户端的。

如果要禁止客户端使用TCP/IP通信,启动时输入以下指令:

mysqld --skip-networking

两个单词之间用-或者_都是可以的。

修改默认的存储引擎

mysqld --default-storage-engine=默认引擎的名字

注意=号左右不能有空格。

帮助

mysql --help

mysqld_safe --help

mysqld --verbose --help

配置文件

命令行启动配置只对当次设置有效,配置文件可以使启动服务器时每次都加载配置文件中的启动选项,不用再使用命令行配置了。

路径

首先我们需要了解配置文件的路径。

Windows

Mysql是通过读取本地的配置文件的,它和SpringBoot的配置文件有异曲同工之妙,Mysql也可将配置文件放在不同的路径下,让Mysql服务器去读取。

路径名
%WINDIR%\my.ini, %WINDIR%\my.cnf
C:\my.ini, C:\my.cnf
BASEDIR\my.ini, BASEDIR\my.cnf
defaults-extra-file
%APPDATA%\MySQL\.mylogin.cnf

这里我们了解前四个用的比较多的:

  1. %WINDIR%

在Windows中可以使用echo %WINDIR%看它具体指向哪

image.png

  1. BASEDIR

指的是Mysql的安装目录

  1. defaults-extra-file

是在输入命令行的时候,手动指向配置文件的路径

mysqld --defaults-extra-file=C:\...\...txt

Unix

列出几个路径方便回顾一下

路径
/etc/my.cnf
/etc/mysql/my.cnf

配置文件里的内容

首先它的大致样子是这样的:

[mysqld]
配置内容

[mysql]
配置内容

...

分组

我们会发现,它有[],这个扩是表示分组。这个分组对应启动Mysql命令时前的指令,比如前面我们使用 mysql -h..这个命令时,前缀是以mysql打头的,如果我们写了配置文件后,使用命令会直接读取该组下的配置。清楚分组之后,我们再看配置内容。

不过有两个分组是比较特殊的,其他过多的我们也不了解啦(脑子有限~),就把这两个分组作为公共配置就行。

  • [server]:作用于所有服务器程序
  • [client]:作用于所有客户端程序

既然说了服务器程序和客户端程序,还是有必要说明一下哪些是服务器程序,哪些是客户端程序。

启动命令类别
mysqld服务器
mysqld_safe服务器
mysql.server服务器
mysql客户端
mysqladmin客户端
mysqldump客户端

配置内容

之前命令行我们写配置时是这样的--P3306,这个配置端口的内容。-P是一种缩写的性质,它完整的写法是--Port=3306,在命令行中我们可以使用缩写,但是在配置内容中是需要使用完整的写法

但是它并不需要--,如果有赋值的配置项,也是允许=两边有空格存在的。

此外,配置内容还允许我们添加注释,使用#即可。

例子 我希望服务器启动时将默认引擎设置成MyISAM

[server]
default-storage-engine = MyISAM #将默认引擎改为MyISAM

优先级

不同路径下配置文件优先级

读取顺序是从上到下的,结果按照最后一个被读到的配置文件为主。

路径名
%WINDIR%\my.ini, %WINDIR%\my.cnf
C:\my.ini, C:\my.cnf
BASEDIR\my.ini, BASEDIR\my.cnf
defaults-extra-file
%APPDATA%\MySQL\.mylogin.cnf

同配置文件不同组的优先级

也是按照分组的位置顺序有关,例如[server][mysqld]设置了相同的内容,谁在后面听谁的。

命令行和配置文件

两个设置了相同的内容,以命令行为主。

系统变量

Mysql服务器中很多设置需要读取一些预先设定好的变量值,比如说允许同时连接的客户端数量就是其中之一,它是属于Mysql系统变量控制的。

查看系统变量

不要轻易尝试下面指令,它会输出所有的系统变量。

这里查看的是SESSION作用范围的系统变量

SHOW VARIABLES;

我们查找特定的系统变量,加上LIKE关键字即可,比如说看同时连接的客户端数量:

SHOW VARIABLES LIKE 'max_connections';

image.png

设置系统变量

设置方法就如上文讲的使用命令行或者配置文件的方式指定即可。例如修改同时连接数为50:

mysqld --max-connections=50

配置文件的方式省略。

在运行过程中设置

这里有一个概念需要先了解一下:配置的核心在于系统变量的修改,比如说A客户端想设置默认存储引擎为InnoDB,B客户端想设置默认存储引擎为MyISAM,在于设置我们感觉是合理的。

但是如果A客户端想设置连接数:100;B客户端想设置连接数50。都是对服务器的系统变量设置话,感觉就有点不对了。

因为系统变量不是只有一个吗?

那么Mysql的开发者提供了这样的解决方案。

系统变量的作用范围

  • GLOBAL:全局变量,影响服务器的整体操作。
  • SESSION:会话变量,影响某个客户端连接的操作。

这个是什么意思呢,简单一点可以这样去理解:一个系统变量在服务器启动时会预制好两个作用域:全局变量、会话变量。全局变量是服务器启动时已经设置好的,其值是固定的了,然后有客户端连接到服务器时,系统变量会为这个客户端生成一份会话变量,客户端可以自定义一些系统变量,但不会去影响其他客户端的使用。

这就实现了刚刚说的A客户端想设置连接数:100;B客户端想设置连接数50。

初始化问题

SESSION的值初始化会默认选取GLOBAL中的值。如果GLOABAL作用范围的系统变量改动后,当前在系统中的客户端并不会被改变,而后续加入服务器的系统变量会被改变。

具体设置

语法:

SET [GLOBAL|SESSION] 系统变量名 = 值;
SET [@@(GLOBAL|SESSION).]var_name = XXX;

例如:在运行期间设置所有客户端的存储引擎

SET GLOBAL default_storage_engine = InnoDB;
SET @@GLOBAL.default_storage_engine = InnoDB;

补充

并不是所有变量都具有GLOBAL和SESSION作用范围,具体情况可以搜索查询。

状态变量

状态变量是用于了解服务器运行状况的。