前言

RHEL/CentOS 系统安装 MySQL 主要有三种方法:

  • 使用 YUM 包管理安装
  • 使用 .rpm-bundle 文件进行安装
  • 使用 .tar.gz 文件解压安装

其中 .tar.gz 解压文件是 Linux 系统的通用安装方法,适用于所有的 Linux 操作系统。但是这种安装方式比较繁琐复杂,小白很容易出错,所以不推荐。

相比较而言,另外两种安装方式更加简单,仅仅需要几个命令即可安装完成。而这都益于 RHEL 的包管理器 yum 。所以本文只介绍着两种安装方式。

准备工作

首先进入 MySQL 官网 ,在 MySQL 官网首页点击 DOWNLOADS 进入下载页面:
mysql官网.png
点击下载页面下方的 MySQL Community (GPL) Downloads »

mysql官网-Community.png

点击后就会进入操作系统选择页面:
mysql操作系统选择.png
到这里就要选择是使用 YUM 安装还是使用 .rpm-bundle 文件进行安装了。

如果使用 YUM 安装点击 MySQL YUM Repository 就会进入对应的下载页面:
Yum Repository.png
如果想要使用 .rpm-bundle 文件进行安装需要点击 MySQL Community Server 就会进入对应的文件下载页面(默认展示的是当前最新版本):

Community Repository.png

安装 MySQL

在 RHEL/CentOS 系统上安装 MySQL 推荐使用 .rpm-bundle 文件进行安装,因为使用 YUM 安装需要网络,如果网络不好的话安装过程就比较漫长。所以我们最好是使用下载工具(如迅雷)将 .deb-bundle 文件下载到本地之后再上传至 RHEL/CentOS 进行安装。

使用 YUM 安装

在安装使用 YUM 先确认下是否安装了 yum-utils 工具包,因为在之后选择 MySQL 的安装版本时需要使用到 yum-config-manager 工具,所以如果没有先进行安装:

  1. sudo yum install -y yum-utils

下载 YUM 源

首先进入操作系统选择页面,因为我们是 RHEL/CentOS 所以选择 YUM Repository,进入即可:
Yum Repository.png
注意自己的系统版本,选择合适的之后点击右侧的下载即可(我这里使用的是 CentOS7)。将对应的 YUM 源文件下载到 /opt/mysql 目录(位置根据自己喜好任意选择):

  1. sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

下载完成后看下文件:

  1. $ ls
  2. mysql80-community-release-el7-3.noarch.rpm

开始安装

执行如下命令:

  1. sudo yum localinstall -y mysql80-community-release-el7-3.noarch.rpm

之后就能在 yum.repo.d 下看到 MySQL 的源配置信息:

  1. $ ls /etc/yum.repos.d/ | grep mysql
  2. mysql-community.repo
  3. mysql-community-source.repo

现在需要刷信息下源信息:

  1. sudo yum makecache

默认情况下,不采取任何措施直接执行安装命令时会默认安装 MySQL 的最新版本(当前最新版本 v8.0)。可以使用如下命令查看默认安装的版本:

  1. sudo yum repolist all | grep mysql

输出示例:

  1. mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community disabled
  2. mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - disabled
  3. mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community disabled
  4. mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - disabled
  5. mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community disabled
  6. mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - disabled
  7. mysql-connectors-community/x86_64 MySQL Connectors Community enabled: 185
  8. mysql-connectors-community-source MySQL Connectors Community - disabled
  9. mysql-tools-community/x86_64 MySQL Tools Community enabled: 123
  10. mysql-tools-community-source MySQL Tools Community - Sourc disabled
  11. mysql-tools-preview/x86_64 MySQL Tools Preview disabled
  12. mysql-tools-preview-source MySQL Tools Preview - Source disabled
  13. mysql55-community/x86_64 MySQL 5.5 Community Server disabled
  14. mysql55-community-source MySQL 5.5 Community Server - disabled
  15. mysql56-community/x86_64 MySQL 5.6 Community Server disabled
  16. mysql56-community-source MySQL 5.6 Community Server - disabled
  17. mysql57-community/x86_64 MySQL 5.7 Community Server disabled
  18. mysql57-community-source MySQL 5.7 Community Server - disabled
  19. mysql80-community/x86_64 MySQL 8.0 Community Server enabled: 229
  20. mysql80-community-source MySQL 8.0 Community Server - disabled

从信息中可以看到除了 mysql80-community 其他版本都是禁用( disabled )状态。所以,如果想要安装特定版本只需要将该版本设置为 enable 其他版本设置为 disabled 即可。

我现在想要安装 5.7 版本,执行如下操作即可:

  1. sudo yum-config-manager --disable mysql80-community
  2. sudo yum-config-manager --enable mysql57-community

之后再次执行 yum repolist all | grep mysql 就会发现 5.7 版本已经启用。

扩展
yum repolist all 命令是用于查看所有状态的信息,如果只想查看启用状态的可以使用 yum repolist enabled ,如果只想查看禁用状态的可以使用 yum repolist disabled

**
现在就执行命令开始安装:

  1. sudo yum install -y mysql-community-server

命令执行完成后就表示 MySQL 安装完成了,可以查看下服务启动状态:

  1. sudo systemctl status mysqld

示例输出结果:

  1. mysqld.service - MySQL Server
  2. Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
  3. Active: active (running) since Tue 2021-03-02 14:31:24 CST; 4min 4s ago
  4. Docs: man:mysqld(8)
  5. http://dev.mysql.com/doc/refman/en/using-systemd.html
  6. Process: 23659 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  7. Process: 23609 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
  8. Main PID: 23662 (mysqld)
  9. CGroup: /system.slice/mysqld.service
  10. └─23662 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

之后我们需要执行 安全设置 操作。

使用 Rpm-Bundle 文件进行安装

下载安装包

按照上面的说明进入 MySQL Community Server 页面,在这个页面中默认的 MySQL 是最新版本(当前是 v8.0.23),如果想要选择其他版本可以点击 Archives 或者 Looking for previous GA versions?

这里我要选择的是 v5.7 所以我点击 Archives 进入归档页面。在归档页面选择 MySQL5.7 版本,操作系统选择 RHEL 就会列出所有的适用文件:
RHEL MySQL归档文件.png

在列出的文件中需要找到 DEB BUNDLE 文件,可以看到文件名都是以 .rpm-bundle.tar 结尾。

另外,在下载时注意自己的操作系统的位数。文件下载完成后上传至自己的操作系统中,我这里上传的位置在 /opt/mysql 目录下:

  1. $ cd /opt/mysql
  2. $ ls
  3. mysql-5.7.32-1.el7.x86_64.rpm-bundle.tar

开始安装

现在我们需要做的就是解压这个 .rpm-bundle.tar 文件(解压到 pkg 文件夹):

  1. sudo mkdir pkg
  2. sudo tar -xvf mysql-5.7.32-1.el7.x86_64.rpm-bundle.tar -C pkg/

解压成功后可以看下解压文件:

  1. ls pkg/
  2. mysql-community-client-5.7.32-1.el7.x86_64.rpm mysql-community-embedded-compat-5.7.32-1.el7.x86_64.rpm mysql-community-server-5.7.32-1.el7.x86_64.rpm
  3. mysql-community-common-5.7.32-1.el7.x86_64.rpm mysql-community-embedded-devel-5.7.32-1.el7.x86_64.rpm mysql-community-test-5.7.32-1.el7.x86_64.rpm
  4. mysql-community-devel-5.7.32-1.el7.x86_64.rpm mysql-community-libs-5.7.32-1.el7.x86_64.rpm
  5. mysql-community-embedded-5.7.32-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.32-1.el7.x86_64.rpm

这些文件包括服务端、客户端以及测试文件。

之后就可以执行安装命令安装这个文件了:

  1. cd pkg/
  2. sudo yum install -y mysql-community-{server,client,common,libs}-*

命令执行完成后就表示 MySQL 安装完成了,安装完成之后就来看下 MySQL 进程信息:

  1. $ ps -ef | grep mysql
  2. mysql 222312 1 0 15:49 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
  3. webuser 223156 218766 0 15:58 pts/1 00:00:00 grep --color=auto mysql

另外也可以使用 systemctl 命令查看服务状态:

  1. $ systemctl status mysql
  2. Unit mysql.service could not be found.
  3. [root@localhost pkg]# systemctl status mysqld
  4. mysqld.service - MySQL Server
  5. Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
  6. Active: inactive (dead)
  7. Docs: man:mysqld(8)
  8. http://dev.mysql.com/doc/refman/en/using-systemd.html
  9. Mar 02 14:31:20 localhost.localdomain systemd[1]: Starting MySQL Server...
  10. Mar 02 14:31:24 localhost.localdomain systemd[1]: Started MySQL Server.
  11. Mar 02 14:41:44 localhost.localdomain systemd[1]: Stopping MySQL Server...
  12. Mar 02 14:41:46 localhost.localdomain systemd[1]: Stopped MySQL Server.
  13. Mar 02 14:51:51 localhost.localdomain systemd[1]: Starting MySQL Server...
  14. Mar 02 14:51:52 localhost.localdomain systemd[1]: Started MySQL Server.
  15. Mar 02 17:20:05 localhost.localdomain systemd[1]: Stopping MySQL Server...
  16. Mar 02 17:20:08 localhost.localdomain systemd[1]: Stopped MySQL Server.

虽然安装完成了,但是我们还是要做进一步的 安全设置

安全设置

说明
在 RHEL/CentOS 中执行 MySQL 的安装操作与 Debian/Ubuntu 略有不同

首先先查看下默认的 root 用户密码:

  1. sudo grep 'temporary password' /var/log/mysqld.log

示例输出:

  1. 2021-03-02T06:31:21.876822Z 1 [Note] A temporary password is generated for root@localhost: Ph&WVDBx3LlE

其中 Ph&WVDBx3LlE 就是默认的 root 密码,在下一步中需要使用。

MySQL 安全设置爱包括设置初始化设置 Root 用户的账户密码、设置验证密码强度以及测试数据库等等。现在就来开始设置:

  1. sudo mysql_secure_installation

首先需要验证一下 root 密码(在 Debian/Ubuntu 中是直接设置 root 用户密码而不需要验证):

  1. Securing the MySQL server deployment.
  2. Enter password for user root:

这个密码就是之前打印的,验证之后进行下一步。

重新设置 root 用户密码(注意密码强度,这里与 Debian/Ubuntu 不同):

  1. The existing password for the user account root has expired. Please set a new password.
  2. New password:

密码设置完成之后输出信息如下:

  1. The 'validate_password' plugin is installed on the server.
  2. The subsequent steps will run with the existing configuration
  3. of the plugin.
  4. Using existing password for root.

意思就是 root 密码设置好了~

之后又询问你是否再次修改 root 密码(傻缺吗?上一步这么辛苦才设置好密码还询问是否确认修改?):

  1. Change the password for root ? ((Press y|Y for Yes, any other key for No) :

肯定 「Enter」 跳过了~

Mysql 本身包括一些测试数据以及用户,这一步表示是否删除测试(匿名)用户, y/Y 表示删除:

  1. By default, a MySQL installation has an anonymous user,
  2. allowing anyone to log into MySQL without having to have
  3. a user account created for them. This is intended only for
  4. testing, and to make the installation go a bit smoother.
  5. You should remove them before moving into a production
  6. environment.
  7. Remove anonymous users? (Press y|Y for Yes, any other key for No) :

默认情况下,MySQL 的 root 不能使用远程机器登录,只能使用当前机器 localhost 进行登录。 y/Y 表示禁止 root 用户远程登录,其他表示允许登录:

实际上这一步设置的没有任何卵用,我不管设置禁止还是允许都无法使用远程机器登录。

  1. Normally, root should only be allowed to connect from
  2. 'localhost'. This ensures that someone cannot guess at
  3. the root password from the network.
  4. Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

MySQL 默认是保留一些测试数据,如果需要删除就输入 y/Y

  1. By default, MySQL comes with a database named 'test' that
  2. anyone can access. This is also intended only for testing,
  3. and should be removed before moving into a production
  4. environment.
  5. Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

是否使上面的配置立即生效,当然是 y/Y 了~

  1. Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

这样,基本的安全设置就完成了。

配置文件与目录说明

  • 所有的配置文件都在 /etc/my.cnf 文件中以及 /ect/my.cnf.d/ 目录下:
  1. $ ls /etc/ | grep my
  2. my.cnf
  3. my.cnf.d
  • 所有的二进制文件以及依赖包都在 /usr/bin/usr/sbin 目录下(可以使用如下命令查看)
  1. $ ls /usr/bin/ | grep mysql
  2. $ ls /usr/sbin/ | grep mysql
  • 所有的数据都在 /var/lib/mysql 目录下:
  1. $ sudo ls /var/lib/mysql
  2. auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem
  3. ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys
  4. ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem
  • 日志文件在 /var/log/mysqld.log 文件中

    设置远程登录用户

默认情况下,MySQL 下的用户是无法远程登录的(比如在其他机器上使用 JAVA 客户端连接),所以我们需要进行一些设置。首先呢,当然是需要在机器上使用 root 用户进行登录了:

  1. $ sudo mysql -u root -p
  2. Enter password:

之后就连接上 MySQL 服务了:

  1. Welcome to the MySQL monitor. Commands end with ; or \g.
  2. Your MySQL connection id is 4
  3. Server version: 5.7.33 MySQL Community Server (GPL)
  4. Copyright (c) 2000, 2021, Oracle and/or its affiliates.
  5. Oracle is a registered trademark of Oracle Corporation and/or its
  6. affiliates. Other names may be trademarks of their respective
  7. owners.
  8. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  9. mysql>

先来看下 mysql 的用户信息:

  • MySQL 5.7(注意 plugin 信息中加密码加密插件)

    1. mysql> use mysql;
    2. mysql> select host, user, plugin from user;
    3. +-----------+---------------+-----------------------+
    4. | host | user | plugin |
    5. +-----------+---------------+-----------------------+
    6. | localhost | root | auth_socket |
    7. | localhost | mysql.session | mysql_native_password |
    8. | localhost | mysql.sys | mysql_native_password |
    9. +-----------+---------------+-----------------------+
    10. 3 rows in set (0.00 sec)
  • MySQL 8.0(注意 plugin 信息中加密码加密插件)

    1. mysql> use mysql;
    2. mysql> select host, user, plugin from user;
    3. +-----------+------------------+-----------------------+
    4. | host | user | plugin |
    5. +-----------+------------------+-----------------------+
    6. | localhost | debian-sys-maint | caching_sha2_password |
    7. | localhost | mysql.infoschema | caching_sha2_password |
    8. | localhost | mysql.session | caching_sha2_password |
    9. | localhost | mysql.sys | caching_sha2_password |
    10. | localhost | root | auth_socket |
    11. +-----------+------------------+-----------------------+
    12. 5 rows in set (0.00 sec)

可以看到不管是 5.7 还是 8.0 root 用户的密码验证插件都是 auth_socket ,而且访问主机只允许使用 localhost

如果想要使用远程主机访问有两种方式:

  • 修改 root 用户的密码验证插件,设置访问主机为 %
  • 新建一个具有 root 权限的用户

在实际使用中,为了安全还是推荐创建一个新的具有 root 权限的用户了。现在分别说下:

方式一:修改 root 用户设置

修改密码验证插件

  • MySQL5.7:

将 root 用户的密码验证插件设置为 mysql_native_password

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Your Root Pwd';
  • MySQL8.0

将 root 用户的密码验证插件设置为 caching_sha2_password

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Your Root Pwd';

之后修改访问主机:

  1. update user set host = '%' where user = 'root' and host = 'localhost';

% 表示允许所有主机访问,之后刷新下权限即可:

  1. FLUSH PRIVILEGES;

再次看下用户信息:

  • MySQL5.7:

    1. mysql> select host, user, plugin from user;
    2. +-----------+---------------+-----------------------+
    3. | host | user | plugin |
    4. +-----------+---------------+-----------------------+
    5. | % | root | mysql_native_password |
    6. | localhost | mysql.session | mysql_native_password |
    7. | localhost | mysql.sys | mysql_native_password |
    8. +-----------+---------------+-----------------------+
  • MySQL8.0

    1. mysql> select host, user, plugin from user;
    2. +-----------+------------------+-----------------------+
    3. | host | user | plugin |
    4. +-----------+------------------+-----------------------+
    5. | % | root | caching_sha2_password |
    6. | localhost | debian-sys-maint | caching_sha2_password |
    7. | localhost | mysql.infoschema | caching_sha2_password |
    8. | localhost | mysql.session | caching_sha2_password |
    9. | localhost | mysql.sys | caching_sha2_password |
    10. +-----------+------------------+-----------------------+
    11. 5 rows in set (0.00 sec)

    方式二:创建一个 root 权限用户

为什么不推荐使用 root 用户?因为 root 用户太过透明,因为大家几乎都是使用 root 用户。所以为了安全还是建议新建一个具有 root 权限的用户(实际上个人使用也没啥安全可言😷),比如这里创建一个 administrator 用户:

  1. mysql> GRANT ALL PRIVILEGES ON *.* TO 'administrator'@'%' IDENTIFIED BY 'Your Pwd';

之后刷新权限即可:

  1. FLUSH PRIVILEGES;

再来看下用户信息:

  1. mysql> select host, user, plugin from user;
  2. +-----------+---------------+-----------------------+
  3. | host | user | plugin |
  4. +-----------+---------------+-----------------------+
  5. | % | root | mysql_native_password |
  6. | localhost | mysql.session | mysql_native_password |
  7. | localhost | mysql.sys | mysql_native_password |
  8. | % | administrator | mysql_native_password |
  9. +-----------+---------------+-----------------------+

还是无法远程登录?

如果使用 root 或者自定义用户还是无法登陆的话就需要看下配置文件了。

比如我这里的配置文件都在 /etc/mysql 目录下,你需要逐个找配置文件,看这些配置文件是否有配置 bind-address 。我这里是在 /etc/mysql/mysql.conf.d/mysqld.cnf 文件中:

  1. [mysqld]
  2. pid-file = /var/run/mysqld/mysqld.pid
  3. socket = /var/run/mysqld/mysqld.sock
  4. datadir = /var/lib/mysql
  5. log-error = /var/log/mysql/error.log
  6. # By default we only accept connections from localhost
  7. bind-address = 127.0.0.1
  8. # Disabling symbolic-links is recommended to prevent assorted security risks
  9. symbolic-links=0

默认情况下 bind-address 的值都是 127.0.0.1,表示只允许本地主机访问。想要远程机器能够访问就需要将该配置注释掉重启 mysql 服务就好了。

服务启动与停止

  • 查看服务启动状态

    1. sudo systemctl status mysql
  • 启动服务

    1. sudo systemctl start mysql
  • 停止服务

    1. sudo systemctl stop mysql
  • 重启服务

    1. sudo systemctl restart mysql
  • 设置开机自启

    1. sudo systemctl enable mysql
  • 取消开机自启

    1. sudo systemctl disable mysql

    卸载 MySQL

注意
卸载操作是不可逆的,在卸载之前一定要保证对重要数据做了备份!!!!
  • 停止 MySQL 服务

    1. sudo systemctl stop mysql
  • 查询安装的软件

    1. sudo yum installed | grep mysql
    2. # 或
    3. sudo rpm -qa | grep mysql

    输出示例:

    1. mysql-community-client.x86_64 5.7.33-1.el7 @mysql57-community
    2. mysql-community-common.x86_64 5.7.33-1.el7 @mysql57-community
    3. mysql-community-libs.x86_64 5.7.33-1.el7 @mysql57-community
    4. mysql-community-libs-compat.x86_64 5.7.33-1.el7 @mysql57-community
    5. mysql-community-server.x86_64 5.7.33-1.el7 @mysql57-community
    6. mysql80-community-release.noarch el7-3 installed
  • 删除上面列出的软件包

    1. sudo yum remove -y mysql-community-client mysql-community-common mysql-community-libs mysql-community-libs-compat mysql-community-server mysql80-community-release
  • 可选:删除 MySQL 配置和数据

    1. sudo rm -rf /etc/my.cnf /etc/my.cnf.d/ /usr/share/mysql/ /var/log/mysqld.log /var/lib/mysql/

    | 注意 | | :—- | | 上面删除的事都 MySQL 在使用过程中残剩的数据文件,所有的都是默认位置。如果你在使用过程中做了修改,你需要将上面的目录进行相应的修改。 |

扩展 FAQ

Your password does not satisfy the current policy requirements ?

这个信息表示的是:您的密码不符合当前策略要求!!!!

说明
如果你是第一次登陆,你需要先更新下 root 密码。退出 mysql 客户端后执行 mysql_secure_installation 命令

当在在修改或创建用户就可能会提示该信息,MySQL 在创建新用户时会密码做了验证策略(Debian/Ubuntu 默认最低级别,不会提示该错误)。

可以在数据库中查询 validate_password 信息,示例:

  1. mysql> SHOW VARIABLES LIKE 'validate_password%';
  2. +--------------------------------------+--------+
  3. | Variable_name | Value |
  4. +--------------------------------------+--------+
  5. | validate_password_check_user_name | OFF |
  6. | validate_password_dictionary_file | |
  7. | validate_password_length | 8 | ==> length verify
  8. | validate_password_mixed_case_count | 1 |
  9. | validate_password_number_count | 1 |
  10. | validate_password_policy | MEDIUM | ==> update to low
  11. | validate_password_special_char_count | 1 |
  12. +--------------------------------------+--------+

看到输出后就可以做相应的密码验证设置,示例:

  1. mysql> set global validate_password_policy=LOW;
  2. mysql> set global validate_password_length=6;
  3. mysql> SHOW VARIABLES LIKE 'validate_password%';
  4. +--------------------------------------+-------+
  5. | Variable_name | Value |
  6. +--------------------------------------+-------+
  7. | validate_password_check_user_name | OFF |
  8. | validate_password_dictionary_file | |
  9. | validate_password_length | 6 |
  10. | validate_password_mixed_case_count | 1 |
  11. | validate_password_number_count | 1 |
  12. | validate_password_policy | LOW |
  13. | validate_password_special_char_count | 1 |
  14. +--------------------------------------+-------+

现在就可以直接设置一个简单的密码了,如 admin123

下面是具体说明:

  • validate_password_length :设置密码长度
  • validate_password_dictionary_file :指定密码验证字典文件
  • validate_password_mixed_case_count :指定密码必须包含大小写字母
  • validate_password_number_count :指定密码必须包含阿拉伯数字
  • validate_password_policy :设置密码验证策略,默认是 MEDIUM
  • validate_password_policy:
    • 0/LOW :仅验证密码长度
    • 1/MEDIUM :验证密码长度,并且要求包含数值、字母以及特殊字符
    • 2/STRONG :验证密码长度,并且要求包含数值、字母、特殊字符以及字典文件