# MySQL安装与配置

​ 第一次接触MySQL?

​ 我该下载哪个版本?

​ 我该使用哪种安装方式?

​ 不同的安装方式有什么不同?

​ 每次安装都要从网上查找安装教程?

​ 不同的系统,不同的包管理方式,如何一次学会在所有系统的上安装MySQL?

​ 想必很多新手都避免不了有这些疑问,都想一次性投入精力解决以上问题,下面我用我理解的方式帮助你解决这些疑问。

# 示例环境

Centos8MySQL 5.7.28

由于MySQL官网还没有放出Centos8的安装包,我这里使用的是Centos7的tar包进行安装,不过我也尝试了Centos7的RPM包安装很顺畅没有任何问题,不过还是推荐最好使用mysql发布的相关平台包进行安装,避免不必要的麻烦。

# 安装方式

  1. 首先,安装MySQL依赖的第三方包
  2. 其次,下载MySQL的安装文件
  3. 然后,配置环境变量
  4. 最后,启动MySQL服务

# 如何使用tar包装出RPM的效果

  1. 首先,安装MySQL依赖的第三方包

    在不同系统中mysql依赖的包名可能不尽相同,需要自己试错

    # mysqld的依赖包
    yum install libaio
    # 这个包在centos8不需要安装
    yum install libnuma
    # mysql客户端工具需要下面的包
    yum install libncurses*
    
    1
    2
    3
    4
    5
    6
  2. 其次,下载MySQL的安装文件

    官网下载地址:versioin 5.7.28

    # 首先我们解压mysql到指定的目录中
    tar -zxvf data/mysql-5.7.28-el7-x86_64.tar.gz -C /usr/local/
    # 重命名目录名称
    mv /usr/local/mysql-5.7.28-el7-x86_64 /usr/local/mysql
    
    1
    2
    3
    4
    5

    现在我们就将mysql安装到了/usr/local/mysql目录中,这也是RPM包中mysql的默认安装位置

  3. 然后,配置环境变量

    /root/.bash_profile

    在文件的最后添加如下配置文件,你也可以在其它你知道的可以配置环境变量的文件中添加如下配置,我通常喜欢配置在.bash_profile文件中,缺点是只有带你过去用户可用,如果系统中存在多个用户,需要配置在/etc目录中。

    # mysql
    export MYSQL_HOME=/usr/local/mysql
    PATH=$MYSQL_HOME/bin:$PATH
    export PATH
    
    1
    2
    3
    4

    让当前bash窗口生效,当然你也可以重新登录用户使配置生效。

    # 让环境变量在当前bash窗口立即生效
    source /root/.bash_profile
    # 使用命令验证一下配置效果
    mysql --version
    
    1
    2
    3
    4
    5
  4. 最后,启动MySQL服务

    因为我们现在使用的tar包方式安装MySQL,所以没有办法直接使用servie mysql start或者systemctl mysql start的方式启动服务。

    不过MySQL已经为我们准备好了服务文件,我们只需要将服务文件移动到对应的目录即可。

    cp /usr/local/mysql/mysql.server /etc/init.d/mysql
    # 此时我们就可以使用下面命令,不过暂时下面的命令会报错,看后面解决
    service mysql start #systemctl mysql start
    
    1
    2
    3

完成以上4步后,就跟RPM包的安装效果一样了。

# 启动MySQL

MySQL 5.7.*的版本中默认/usr/local/mysql中不再自带data目录,而这个data目录是MySQL实例的数据目录,所以我们要先生成这个data目录。

# 多种方式生成data目录

  1. 使用下面的命令,我们使用默认的方式初始化mysql的data目录(不推荐)

    mysqld --initialize
    
    1
  2. 推荐使用配置文件的方式初始化mysql的data目录,mysql默认会从以下位置加载配置:

    /etc/my.cnf

    /etc/mysql/my.cnf

    /usr/local/mysql/etc/my.cnf

    /usr/local/mysql/my.cnf

    ~/.my.cnf

    # 这里指定mysql客户端的默认连接端口
    [client]
    port=3306
    # 这里指定mysql服务的数据目录,可以修改
    [mysqld]
    datadir=/mysql/data
    port = 3306
    
    1
    2
    3
    4
    5
    6
    7
    8

    同样的命令初始化mysql,但是这次我们使用了my.cnf配置文件,我们将data目录指向了/mysql/data

    mysqld --initialize
    
    1
  3. 为mysql指定系统账户(仅推荐在生成环境)

    上面例子,我们默认使用了当前登录的用户(root)来启动mysql,这通常是不安全的(但是推荐在开发环境中这么做)。下面我们可以使用指定的用户来启mysql服务。

    # 创建一个mysq用户组
    groupadd mysql
    # 并添加一个名为mysql的用户,/bin/false限制这个用户不能使用shell方式登录,仅能用来启动数据库
    useradd -r -g mysql -s /bin/false mysql
    # 因为mysql用户的权限小于root,所以我们给mysql加上访问/root/mysql/data目录的权限
    chown mysql:mysql /mysql/data
    chmod 750 /mysql/data
    ## 指定用户初始化mysql数据目录,还是上面的配置文件,位置放在/usr/local/mysql/my.cnf
    mysqld --initialize --user=mysql
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    通过以上任意一种方式就可以初始化好数据目录了。

# 启动mysql服务

  1. 使用mysqld_safe启动

    mysqld_safe --user=mysql
    
    1
  2. 使用service mysql start启动

    内部还是使用的mysqld_safe命令

    service mysql start
    
    1

# 启动多个mysql实例

在机器有限的环境下我们通常会这么干,而且mysql也支持这样的操作。

如果要运行多个mysql实例首先要生成多个mysql的data目录,每个实例一个data目录,可以通过下面命令这样:

# 实例1
mysqld --defaults-file=/root/mysql/my1.cnf --initialize --user=mysql
# 实例2
mysqld --defaults-file=/root/mysql/my2.cnf --initialize --user=mysql
# 实例3
mysqld --defaults-file=/root/mysql/my3.cnf --initialize --user=mysql
1
2
3
4
5
6

启动多个实例会导致service mysql start命令失效,因为mysqld默认是从固定的几个位置查找my.cnf的,而我的配置文件可能不在这几个默认位置。

所以暂时只能使用mysqld_safe方式来启动mysql服务:

mysqld_safe --defaults-file=/root/mysql/my1.cnf --user=mysql
mysqld_safe --defaults-file=/root/mysql/my2.cnf --user=mysql
mysqld_safe --defaults-file=/root/mysql/my3.cnf --user=mysql
1
2
3

如果你有能力修改/usr/local/mysql/supper-files/mysql.server文件也可以通过复制多分,分别修改对应的数据目录,并移动到/etc/init.d/目录下,如:/etc/init.d/mysql1 /etc/init.d/mysql2 /etc/init.d/mysql3

service mysql1 start
service mysql2 start
service mysql3 start
1
2
3

修该方法也很简单,只要打开/usr/local/mysql/support-files/mysql.server文件找到下面这行:

# 指定实例的datadir目录即可
datadir=
1
2

当然我们还需要在my*.cnf文件中加上下面这句话,因为多个mysql实例不能共用一个socket文件:/tmp/mysql.socket.lock

my*.cnf

# my1.cnf
[mysqld]
socket=/tmp/mysql.socket.lock.1
# my2.cnf
[mysqld]
socket=/tmp/mysql.socket.lock.2
# my3.cnf
[mysqld]
socket=/tmp/mysql.socket.lock.3
1
2
3
4
5
6
7
8
9
10
11

# 启动多个mysql实例的正确做法

我们也看到了上面的方式启动多个mysql实例甚是麻烦,所以mysql提供了mysqld_multi命令来帮助我们解决这个问题,我们不再需要同时定义多个my.cnf文件,只要一个就够了,配置文件如下:

[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe
mysqladmin=/usr/local/mysql/bin/mysqladmin
user=multi_admin
# 官方例子中为password,实测无效,估计是不同版本有改动,需要改为pass
pass=123456
log=/mysql/log
[mysqld1]
port=3306
datadir=/mysql/3306/data
# 每个服务都有一个进程,所以需要指定多个socket文件
socket=/mysql/3306/mysql.sock
# 使用root账户启动,如果非root账户,则需要注意文件/目录的权限问题
user=root
[mysqld2]
port=3307
datadir=/mysql/3307/data
socket=/mysql/3307/mysql.sock
user=root
[mysqld3]
port=3308
datadir=/mysql/3308/data
socket=/mysql/3308/mysql.sock
user=root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 启动某个mysql实例

mysqld_multi支持一个配置文件中配置多个服务,服务的分隔方式是mysqld+数字,如下命令我们启动的是mysqld2的配置

mysqld_multi --defaults-file=/root/mysql/my_multi.cnf start 2
1
# 创建mysqladmin账户

如果我们不配置mysqladmin的用户/密码,结果是只能start,不能stop,解决办法就是创建一个新用户,并赋予shutdown权限,当然root用户也可以。

上面我们定义了3个mysql服务,我们需要连接到三个服务分别创建相同的账号和密码。

# 创建用户
CREATE USER 'multi_admin'@'localhost' IDENTIFIED BY '123456';
# 给用户添加shutdown权限
GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost';
1
2
3
4

# 相关工具

  1. mysql:客户端工具
  2. mysqld:mysql服务
  3. mysqld_safe: mysqld的守护进程,当使用kill -9 mysqld_pid关闭mysqld时,该守护进程会自动重启mysqld
  4. mysqld_multi:管理多个mysqld的工具
  5. mysqladmin:是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库等。