重学MySQL系列(二):一文让你了解MySQL启动整个过程

3,717 阅读10分钟

原创作者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。

平时我们在开发应用程序的时候,更多是以客户端(Client)的身份连接到一台已经启动好的MySQL服务器,因此我们对于如何启动一个MySQL服务器,如何设置启动参数,以及在启动完成后如何更改MySQL的行为等操作并没有太多的了解。

而实际上,MySQL服务器启动或运行过程中各项启动参数的设置,对MySQL的行为与性能有至关重要的影响,因此在这篇文章中,我们一起探究一下有关MySQL服务器启动和关闭、配置文件与系统变量一些细节。

在类Unix操作系统上启动与关闭MySQL

虽然MySQL支持多种不同的平台和操作系统,比如Windows,Mac OS,但作为数据库服务器,MySQL更多的时候还是运行在类Unix操作系统上,比如Centos、Ubuntu。

在类Unix操作系统中,有许多种方式来启动MySQL,我们既可以手动运行MySQL,也可以将MySQL设置为系统的标准服务,在系统启动时自动运行。

设置启动账号

在启动MySQL前,首先要考虑的是用哪一个登录账号来运行MySQL,如果不做设置的话,一般会把我们当前登录的账号作为MySQL的启动账号。

设置启动账号的注意事项

我们这里讲的是要自己设置启动账号的情况,其实有一些安装方式会自动帮我们设置好启动账号的,这时候我们就不需要再自己设置了。

不使用root账号作为MySQL启动账号

root在类Unix操作系统中是无所不能的存在,所以一般不要使用root去启动一些服务软件,不然的话,如果服务被黑客入侵,那么黑客便可以轻易获得root权限,进而完全控制我们的服务器,这是非常危险的。

应该始终用同一个账号来启动MySQL

应该以同一个账号来启动服务器软件,如果我们在启动服务软件时使用不同的账号,那么这个软件所生成的一些文件就属于不同的账号,这时候软件所管理的文件权限将变得乱七八糟,权限混乱。

应该使用低权限的账号来运行MySQL

不使用root账号启动MySQL,所以需要创建一些低权限的账号来作为启动账号,这样的话,即使被黑客攻击,造成的破坏也在有限的控制范围之内。

添加启动账号

如果需要自己指定MySQL服务器的运行账号,可以使用下面的创建进行创建,比如下面我们创建一个名为mysql的账号:

# 下面两条命令需要使用root来执行
useradd -g mysql mysql

如果之前使用过其他账号启动过MySQL,还需要将MySQL的数据目录的用户及用户组为mysql这个账号所有,如:

# 下面两条命令需要使用root来执行
$ chown -R mysql /usr/local/mysql/data
$ chgrp -R  mysql /usr/local/mysql/data

设置启动账号有两种方式

在配置文件是指定启动账号,比如我们可以/etc/my.cnf文件中增加下面的选项:

[mysqld]
user=mysql

这样在启动时MySQL会将mysql作为启动账号。

关于MySQL的配置文件方面的内容,后面有更详细的讲解。

也可以直接在启动项中指启动账号,如:

#以mysql作为启动用户
mysqld -u mysql

关于MySQL的启动项的内容,后面有更详细的讲解。

启动MySQL

在Linux中一般有以下几种启动MySQL服务器的方式,下面我们来一一介绍一下。

mysqld

mysqld命令是MySQL的主程序,通过运行mysqld命令可以启动一个MySQL守护进程,即MySQL服务器,通过mysqld来启动MySQL服务器是最直接简单,但同时也是最不常用的方式。

# 在MySQL安装目录的bin目录下执行
$ mysqld

mysqld_safe

mysqld_safe是MySQL的启动脚本,mysqld_safe添加了一些安全功能,在发生错误时重启服务器以及将运行时信息记录到错误日志中,所以一般更推荐使用mysqld_safe来启动MySQL服务器。

# 查看mysqld_safe支持的选项
$ mysqld_safe --help

需要注意的是,在一些平台中并不会安装mysqld_safe脚本,这是因为这些平台在系统上支持mysql的启动与关闭,因此mysqld_safe便不需要了。

mysql.server

mysql.server也是一个用于管理MySQL服务器的脚本,其底层调用的是mysqld_safe脚本。

启动MySQL

$ mysql.server start

关闭MySQL

$ mysql.server stop

mysqld_safe一样,在一些支持mysql启动与关闭的平台上,并不会安装mysql.server脚本。

mysqld_multi

mysqld_multi是MySQL提供的用于管理多个MySQL服务器的脚本,可以同时启动或停止多个MySQL服务器,当我们运行mysqld_multie脚本时,该脚本会在配置文件中查找名称为[mysqldN]的选项,N可以是任意的正整数。

mysqld_multi的其完整用法如下所示:

# GNR表示我们上面提到的N
mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...]

现在我们定义一个如下所示的配置文件:

[mysqld1]
socket     = /tmp/mysql.sock2
port       = 3306
pid-file   = /usr/local/mysql/data2/hostname.pid2
datadir    = /usr/local/mysql/data2
language   = /usr/local/mysql/share/mysql/english
user       = unix_user1

[mysqld2]
mysqld     = /path/to/mysqld_safe
ledir      = /path/to/mysqld-binary/
mysqladmin = /path/to/mysqladmin
socket     = /tmp/mysql.sock3
port       = 3307
pid-file   = /usr/local/mysql/data3/hostname.pid3
datadir    = /usr/local/mysql/data3
language   = /usr/local/mysql/share/mysql/swedish
user       = unix_user2

使用下面的命令可以配置文件中定义的所有服务器:

mysqld_multi start

也可以单独启动某个服务器,如:

mysqld_multi start 1

mysqld_safe一样,在一些支持mysql启动与关闭的平台上,并不会安装mysqld_multi脚本。

关闭MySQL

前面我们已经演示两种关闭MySQL服务器的方式,当然,我们也可以通过使用mysqladmin命令来关闭MySQL服务器,如:

mysqladmin -p -u root shutdown

在Windows上启动与关闭MySQL

在Windows操作系统要启动MySQL服务器有两种方式,一种方式是像Linux一样,直接通过命令行启动,另一种方式是把MySQL注册为一个Windows服务,这种方式可以使用MySQL随着Windows启动而启动,而且还可以通过界面启动。

命令行启动与闭

mysqld

与Linux操作系统一样,我们可以使用mysqladmin命令关闭一个正在运行的MySQL服务器

mysqladmin -p -u root shutdown

通过Windows服务启动与关闭

在windows操作系统中,除上面的自己运行命令启动外,也可以通过Windows服务的方式来管理MySQL。

注册Windows服务

使用下面的命令可以将MySQL注册为Windows服务:

mysqld --install

如果你不想MySQL服务在开机时自动启动,可以使用下面的命令:

mysqld --install-manual

使用上面的命令,注册的服务名为mysqld,我们也可以自定义服务名,如:

# service_name为自定义的服务名
mysqld --install service_name

也可以在注册Windows服务的时候,指定加载的配置文件,如:

mysqld --install service_name --default-file=filename

启动

使用上面的命令,我们把MySQL注册为Windows服务,因此我们可以使用下面的命令启动MySQL:

net start mysql

关闭

如果MySQL已经注册为Windows服务,也可以使用下面的命令关闭MySQL。

net stop mysql

删除Windows服务

如果想删除Windows服务,可以使用上面的命令,把服务停掉,然后再执行下面的命令:

sc delete mysql

设置启动项

上面我们演示启动MySQL服务器时,在启动命令后面没有跟任何参数,这意味着使用MySQL会使用自己程序内默认的参数,如果我们想修改这些参数,在使用启动命令时可以一一指定。

比如,默认的MySQL监听的是3306端口,我们可以启动时,将端口更改为3307,如:

$ mysqld -P3307

使用下面的命令可以查看mysqld的全部选项参数:

$ mysqld --verbose --help

对于mysqld_safemysql.servermysqld_multi,也可以像mysqld一样查看选项参数,比如:

mysqld_safe --help

MySQL的选项参数支持长选项和短选项两种,长选项的参数比较长,像--user,--posrt这种称为长选项,而-P,-u这种称为短选项,如:

mysqld --user=mysql --port=3307

MySQL的配置文件

上面我们讲了通过启动项参数来控制MySQL服务器的行为,这种方式虽然简单直接,但如果需要指定的启动参数很多,那每次运行MySQL时,就需要在命令行敲一大堆的参数,非常不方便。

所以在MySQL中,还支持使用 配置文件(或者叫选项文件) 来保存启动项,当我们配置文件中指定相应的选项后,在启动MySQL时,就会将配置文件中的选项作为启动项,比如我们前面的示例的/etc/my.cnf文件:

[mysqld]
user=mysql

以--no-defaults选项启动的MySQL程序除.mylogin.cnf外,不读取任何选项文件。

$ mysqld --no-defaults

如果配置文件中指定的选项与在命令行中指定的选项相同,则以命令行中指定的选项为优先,比如我们在配置文件中指user=mysql,但在命令行以--user=mysql作为启动参数,如:

mysqld --user=test

这样则以test作为MySQL的启动账号。

配置文件的加载顺序

MySQ配置文件一般以cnf为后缀名,不过在Windows中也可以ini为后缀名,下面我们来看看配置文件的加载顺序。

类unix相关配置文件

对于类Unix操作系统中而方,会按照以下的顺序加载配置文件:

文件路径与名称 相应说明
/etc/my.cnf 全局有效
/etc/mysql/my.cnf 全局有效
SYSCONFDIR/my.cnf 全局有效
$MYSQL_HOME/my.cnf 特定于服务器的选项(仅限服务器)
defaults-extra-file 在命令行中指定的额外配置文件路径
~/.my.cnf 用户特定选项,~表示当前用户家目录
~/.mylogin.cnf 用户特定的登录路径选项(仅限客户端),~表示当前用户家目录

SYSCONFDIR表示在MySQL源码安装使用CMake编译时通过DSYSCONFDIR选项指定的目录,如果不指定,默认为源码的etc目录,$MYSQL_HOME是我们可以自己指定的环境变量。

windows相关配置文件

而对于Windows操作系统而言,启动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 登录路径选项(对客户端命令有效)

%WINDIR%一般是指C:\WINDOWS目录,当然我们也可以通过下面的命令查看:

C:\> echo %WINDIR%

%APPDATA%的值是Windows操作系统用于存放应用程序数据目录,同样可以在命令行查看:

C:\> echo %APPDATA%

BASEDIR是MySQL的基本安装目录,如果我们安装的是MySQL5.7,则这个目录一般是指C:\PROGRAMDIR\MySQL\MySQL 5.7 Server,PROGRAMDIR表示Program Files目录。

--default-extra-file

虽然MySQL在启动的时候会按顺序加载前面所说的配置文件,不过在启动时也可以通过--default-extra-file选项指定其他的配置文件,如:

$ mysqld --default-extra-file=/home/test/config/my.cnf

mylogin.cnf

MySQL的配置文件一般是纯文本文件,用一般文本文件编辑器就可能编辑,但mylogin.cnf文件是个例外,mylogin.cnf文件是使用mysql_config_editor程序生成的的一个加密文件,mylogin.cnf文件只对客户端命令(mysql,mysqladmin等)有效,该文件只能包含user,host,password,socket等与客户端登录有关的选项。

如何写一个MySQL配置文件

MySQL配置的格式一般为一个分组(group)下可以有多个opt_name=value或单独opt_name的选项,如下所示:

[group]
opt_name1=value1
opt_name2=value2
opt_name3
...
opt_nameN=valueN

[group]
opt_name1=value1
opt_name2=value2
opt_name3
...
opt_nameN=valueN

用#或;可以注释一行选项,如:

[mysql]
;user=mysql
#port=3306

group需要用中括号([])包含起来,表示一个选项组,其取值常用的有server、mysqld、mysqld_safe、client、mysql、mysqladmin、mysqldump,分别对应不同的MySQL命令。

不过server和client,server选项组表示服务器命令的选项,所以mysqld,mysqld_safe等服务器命令可以读取[server]选项组的配置,而client而对应客户端命令的配置,所以mysql,mysqladmin,mysqldump等客户端命令可以读取到[client]选项组。

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

[mysqldump]
quick

系统变量

对于已经启动起来的MySQL服务器来说,已经不能通过启动项或配置文件来更改MySQL服务器的行为,这时候可能通过设置MySQL的系统变量来做到这一点。

查看系统变量

通过命令行客户端登录MySQL服务器后,我们可以通过下面的命令打印MySQL的系统变量:

mysql> show variables

由于直接show variables命令会将所有的系统变量打印出来,所以我们可以加上like来筛选出系统变量,如:

mysql> show variables like '%character_set_client%'
设置系统变量

MySQL系统变量根据作用范围的不同可分为:全局系统变量(global variable)和会话系统变量(session variable)。

全局系统变量(global variable):对所有连到到服务器的客户端都有用。

会话系统变量(session variable):只有当前连接会话发生作用。

通过SET语句可以设置系统变量,SET后面跟GLOBAL为设置全局系统变量,SESSION为会话系统变量语法如下:

SET [GLOBAL|SESSION] var_name = var_value;

也可以使用下面的语法:

SET [@@(GLOBAL|SESSION).]var_name = var_value;

简单示例:

mysql> set global character_set_client=utf8;

如果我们在设置系统变量时,不指定global或session,则默认为设置会话系统变量,如:

mysql> set character_set_client=utf8;

查看不同作用范围的系统变量

mysql> show global variables like 'character_set_client';

小结

通过上面的了解,我们知道,在启动MySQL时,通过启动项或都配置文件的各种参数,我们可以控制MySQL服务器的各种行为,而即使MySQL服务器已经启动完成,我们仍然可以通过系统变量来控制MySQL服务器。

欢迎扫码关注,共同学习进步