开发应用程序的时候,更多是以客户端(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_safe
、mysql.server
、mysqld_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服务器。