前言
RHEL/CentOS 系统安装 MySQL 主要有三种方法:
- 使用
YUM包管理安装 - 使用
.rpm-bundle文件进行安装 使用.tar.gz文件解压安装
其中 .tar.gz 解压文件是 Linux 系统的通用安装方法,适用于所有的 Linux 操作系统。但是这种安装方式比较繁琐复杂,小白很容易出错,所以不推荐。
相比较而言,另外两种安装方式更加简单,仅仅需要几个命令即可安装完成。而这都益于 RHEL 的包管理器 yum 。所以本文只介绍着两种安装方式。
准备工作
首先进入 MySQL 官网 ,在 MySQL 官网首页点击 DOWNLOADS 进入下载页面:
点击下载页面下方的 MySQL Community (GPL) Downloads » :

点击后就会进入操作系统选择页面:
到这里就要选择是使用 YUM 安装还是使用 .rpm-bundle 文件进行安装了。
如果使用 YUM 安装点击 MySQL YUM Repository 就会进入对应的下载页面:
如果想要使用 .rpm-bundle 文件进行安装需要点击 MySQL Community Server 就会进入对应的文件下载页面(默认展示的是当前最新版本):
安装 MySQL
在 RHEL/CentOS 系统上安装 MySQL 推荐使用 .rpm-bundle 文件进行安装,因为使用 YUM 安装需要网络,如果网络不好的话安装过程就比较漫长。所以我们最好是使用下载工具(如迅雷)将 .deb-bundle 文件下载到本地之后再上传至 RHEL/CentOS 进行安装。
使用 YUM 安装
在安装使用 YUM 先确认下是否安装了 yum-utils 工具包,因为在之后选择 MySQL 的安装版本时需要使用到 yum-config-manager 工具,所以如果没有先进行安装:
sudo yum install -y yum-utils
下载 YUM 源
首先进入操作系统选择页面,因为我们是 RHEL/CentOS 所以选择 YUM Repository,进入即可:
注意自己的系统版本,选择合适的之后点击右侧的下载即可(我这里使用的是 CentOS7)。将对应的 YUM 源文件下载到 /opt/mysql 目录(位置根据自己喜好任意选择):
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
下载完成后看下文件:
$ lsmysql80-community-release-el7-3.noarch.rpm
开始安装
执行如下命令:
sudo yum localinstall -y mysql80-community-release-el7-3.noarch.rpm
之后就能在 yum.repo.d 下看到 MySQL 的源配置信息:
$ ls /etc/yum.repos.d/ | grep mysqlmysql-community.repomysql-community-source.repo
现在需要刷信息下源信息:
sudo yum makecache
默认情况下,不采取任何措施直接执行安装命令时会默认安装 MySQL 的最新版本(当前最新版本 v8.0)。可以使用如下命令查看默认安装的版本:
sudo yum repolist all | grep mysql
输出示例:
mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community disabledmysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - disabledmysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community disabledmysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - disabledmysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community disabledmysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - disabledmysql-connectors-community/x86_64 MySQL Connectors Community enabled: 185mysql-connectors-community-source MySQL Connectors Community - disabledmysql-tools-community/x86_64 MySQL Tools Community enabled: 123mysql-tools-community-source MySQL Tools Community - Sourc disabledmysql-tools-preview/x86_64 MySQL Tools Preview disabledmysql-tools-preview-source MySQL Tools Preview - Source disabledmysql55-community/x86_64 MySQL 5.5 Community Server disabledmysql55-community-source MySQL 5.5 Community Server - disabledmysql56-community/x86_64 MySQL 5.6 Community Server disabledmysql56-community-source MySQL 5.6 Community Server - disabledmysql57-community/x86_64 MySQL 5.7 Community Server disabledmysql57-community-source MySQL 5.7 Community Server - disabledmysql80-community/x86_64 MySQL 8.0 Community Server enabled: 229mysql80-community-source MySQL 8.0 Community Server - disabled
从信息中可以看到除了 mysql80-community 其他版本都是禁用( disabled )状态。所以,如果想要安装特定版本只需要将该版本设置为 enable 其他版本设置为 disabled 即可。
我现在想要安装 5.7 版本,执行如下操作即可:
sudo yum-config-manager --disable mysql80-communitysudo yum-config-manager --enable mysql57-community
之后再次执行 yum repolist all | grep mysql 就会发现 5.7 版本已经启用。
| 扩展 |
|---|
yum repolist all 命令是用于查看所有状态的信息,如果只想查看启用状态的可以使用 yum repolist enabled ,如果只想查看禁用状态的可以使用 yum repolist disabled 。 |
**
现在就执行命令开始安装:
sudo yum install -y mysql-community-server
命令执行完成后就表示 MySQL 安装完成了,可以查看下服务启动状态:
sudo systemctl status mysqld
示例输出结果:
mysqld.service - MySQL ServerLoaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)Active: active (running) since Tue 2021-03-02 14:31:24 CST; 4min 4s agoDocs: man:mysqld(8)http://dev.mysql.com/doc/refman/en/using-systemd.htmlProcess: 23659 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)Process: 23609 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)Main PID: 23662 (mysqld)CGroup: /system.slice/mysqld.service└─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 就会列出所有的适用文件:
在列出的文件中需要找到 DEB BUNDLE 文件,可以看到文件名都是以 .rpm-bundle.tar 结尾。
另外,在下载时注意自己的操作系统的位数。文件下载完成后上传至自己的操作系统中,我这里上传的位置在 /opt/mysql 目录下:
$ cd /opt/mysql$ lsmysql-5.7.32-1.el7.x86_64.rpm-bundle.tar
开始安装
现在我们需要做的就是解压这个 .rpm-bundle.tar 文件(解压到 pkg 文件夹):
sudo mkdir pkgsudo tar -xvf mysql-5.7.32-1.el7.x86_64.rpm-bundle.tar -C pkg/
解压成功后可以看下解压文件:
ls pkg/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.rpmmysql-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.rpmmysql-community-devel-5.7.32-1.el7.x86_64.rpm mysql-community-libs-5.7.32-1.el7.x86_64.rpmmysql-community-embedded-5.7.32-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.32-1.el7.x86_64.rpm
这些文件包括服务端、客户端以及测试文件。
之后就可以执行安装命令安装这个文件了:
cd pkg/sudo yum install -y mysql-community-{server,client,common,libs}-*
命令执行完成后就表示 MySQL 安装完成了,安装完成之后就来看下 MySQL 进程信息:
$ ps -ef | grep mysqlmysql 222312 1 0 15:49 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pidwebuser 223156 218766 0 15:58 pts/1 00:00:00 grep --color=auto mysql
另外也可以使用 systemctl 命令查看服务状态:
$ systemctl status mysqlUnit mysql.service could not be found.[root@localhost pkg]# systemctl status mysqld● mysqld.service - MySQL ServerLoaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)Active: inactive (dead)Docs: man:mysqld(8)http://dev.mysql.com/doc/refman/en/using-systemd.htmlMar 02 14:31:20 localhost.localdomain systemd[1]: Starting MySQL Server...Mar 02 14:31:24 localhost.localdomain systemd[1]: Started MySQL Server.Mar 02 14:41:44 localhost.localdomain systemd[1]: Stopping MySQL Server...Mar 02 14:41:46 localhost.localdomain systemd[1]: Stopped MySQL Server.Mar 02 14:51:51 localhost.localdomain systemd[1]: Starting MySQL Server...Mar 02 14:51:52 localhost.localdomain systemd[1]: Started MySQL Server.Mar 02 17:20:05 localhost.localdomain systemd[1]: Stopping MySQL Server...Mar 02 17:20:08 localhost.localdomain systemd[1]: Stopped MySQL Server.
虽然安装完成了,但是我们还是要做进一步的 安全设置 。
安全设置
| 说明 |
|---|
| 在 RHEL/CentOS 中执行 MySQL 的安装操作与 Debian/Ubuntu 略有不同 |
首先先查看下默认的 root 用户密码:
sudo grep 'temporary password' /var/log/mysqld.log
示例输出:
2021-03-02T06:31:21.876822Z 1 [Note] A temporary password is generated for root@localhost: Ph&WVDBx3LlE
其中 Ph&WVDBx3LlE 就是默认的 root 密码,在下一步中需要使用。
MySQL 安全设置爱包括设置初始化设置 Root 用户的账户密码、设置验证密码强度以及测试数据库等等。现在就来开始设置:
sudo mysql_secure_installation
首先需要验证一下 root 密码(在 Debian/Ubuntu 中是直接设置 root 用户密码而不需要验证):
Securing the MySQL server deployment.Enter password for user root:
这个密码就是之前打印的,验证之后进行下一步。
重新设置 root 用户密码(注意密码强度,这里与 Debian/Ubuntu 不同):
The existing password for the user account root has expired. Please set a new password.New password:
密码设置完成之后输出信息如下:
The 'validate_password' plugin is installed on the server.The subsequent steps will run with the existing configurationof the plugin.Using existing password for root.
意思就是 root 密码设置好了~
之后又询问你是否再次修改 root 密码(傻缺吗?上一步这么辛苦才设置好密码还询问是否确认修改?):
Change the password for root ? ((Press y|Y for Yes, any other key for No) :
肯定 「Enter」 跳过了~
Mysql 本身包括一些测试数据以及用户,这一步表示是否删除测试(匿名)用户, y/Y 表示删除:
By default, a MySQL installation has an anonymous user,allowing anyone to log into MySQL without having to havea user account created for them. This is intended only fortesting, and to make the installation go a bit smoother.You should remove them before moving into a productionenvironment.Remove anonymous users? (Press y|Y for Yes, any other key for No) :
默认情况下,MySQL 的 root 不能使用远程机器登录,只能使用当前机器 localhost 进行登录。 y/Y 表示禁止 root 用户远程登录,其他表示允许登录:
实际上这一步设置的没有任何卵用,我不管设置禁止还是允许都无法使用远程机器登录。
Normally, root should only be allowed to connect from'localhost'. This ensures that someone cannot guess atthe root password from the network.Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
MySQL 默认是保留一些测试数据,如果需要删除就输入 y/Y:
By default, MySQL comes with a database named 'test' thatanyone can access. This is also intended only for testing,and should be removed before moving into a productionenvironment.Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
是否使上面的配置立即生效,当然是 y/Y 了~
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
配置文件与目录说明
- 所有的配置文件都在
/etc/my.cnf文件中以及/ect/my.cnf.d/目录下:
$ ls /etc/ | grep mymy.cnfmy.cnf.d
- 所有的二进制文件以及依赖包都在
/usr/bin和/usr/sbin目录下(可以使用如下命令查看)
$ ls /usr/bin/ | grep mysql$ ls /usr/sbin/ | grep mysql
- 所有的数据都在
/var/lib/mysql目录下:
$ sudo ls /var/lib/mysqlauto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pemca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sysca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem
默认情况下,MySQL 下的用户是无法远程登录的(比如在其他机器上使用 JAVA 客户端连接),所以我们需要进行一些设置。首先呢,当然是需要在机器上使用 root 用户进行登录了:
$ sudo mysql -u root -pEnter password:
之后就连接上 MySQL 服务了:
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 4Server version: 5.7.33 MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
先来看下 mysql 的用户信息:
MySQL 5.7(注意
plugin信息中加密码加密插件)mysql> use mysql;mysql> select host, user, plugin from user;+-----------+---------------+-----------------------+| host | user | plugin |+-----------+---------------+-----------------------+| localhost | root | auth_socket || localhost | mysql.session | mysql_native_password || localhost | mysql.sys | mysql_native_password |+-----------+---------------+-----------------------+3 rows in set (0.00 sec)
MySQL 8.0(注意
plugin信息中加密码加密插件)mysql> use mysql;mysql> select host, user, plugin from user;+-----------+------------------+-----------------------+| host | user | plugin |+-----------+------------------+-----------------------+| localhost | debian-sys-maint | caching_sha2_password || localhost | mysql.infoschema | caching_sha2_password || localhost | mysql.session | caching_sha2_password || localhost | mysql.sys | caching_sha2_password || localhost | root | auth_socket |+-----------+------------------+-----------------------+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 :
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Your Root Pwd';
- MySQL8.0
将 root 用户的密码验证插件设置为 caching_sha2_password :
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Your Root Pwd';
之后修改访问主机:
update user set host = '%' where user = 'root' and host = 'localhost';
% 表示允许所有主机访问,之后刷新下权限即可:
FLUSH PRIVILEGES;
再次看下用户信息:
MySQL5.7:
mysql> select host, user, plugin from user;+-----------+---------------+-----------------------+| host | user | plugin |+-----------+---------------+-----------------------+| % | root | mysql_native_password || localhost | mysql.session | mysql_native_password || localhost | mysql.sys | mysql_native_password |+-----------+---------------+-----------------------+
MySQL8.0
mysql> select host, user, plugin from user;+-----------+------------------+-----------------------+| host | user | plugin |+-----------+------------------+-----------------------+| % | root | caching_sha2_password || localhost | debian-sys-maint | caching_sha2_password || localhost | mysql.infoschema | caching_sha2_password || localhost | mysql.session | caching_sha2_password || localhost | mysql.sys | caching_sha2_password |+-----------+------------------+-----------------------+5 rows in set (0.00 sec)
方式二:创建一个 root 权限用户
为什么不推荐使用 root 用户?因为 root 用户太过透明,因为大家几乎都是使用 root 用户。所以为了安全还是建议新建一个具有 root 权限的用户(实际上个人使用也没啥安全可言😷),比如这里创建一个 administrator 用户:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'administrator'@'%' IDENTIFIED BY 'Your Pwd';
之后刷新权限即可:
FLUSH PRIVILEGES;
再来看下用户信息:
mysql> select host, user, plugin from user;+-----------+---------------+-----------------------+| host | user | plugin |+-----------+---------------+-----------------------+| % | root | mysql_native_password || localhost | mysql.session | mysql_native_password || localhost | mysql.sys | mysql_native_password || % | administrator | mysql_native_password |+-----------+---------------+-----------------------+
还是无法远程登录?
如果使用 root 或者自定义用户还是无法登陆的话就需要看下配置文件了。
比如我这里的配置文件都在 /etc/mysql 目录下,你需要逐个找配置文件,看这些配置文件是否有配置 bind-address 。我这里是在 /etc/mysql/mysql.conf.d/mysqld.cnf 文件中:
[mysqld]pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysqllog-error = /var/log/mysql/error.log# By default we only accept connections from localhostbind-address = 127.0.0.1# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0
默认情况下 bind-address 的值都是 127.0.0.1,表示只允许本地主机访问。想要远程机器能够访问就需要将该配置注释掉重启 mysql 服务就好了。
服务启动与停止
查看服务启动状态
sudo systemctl status mysql
启动服务
sudo systemctl start mysql
停止服务
sudo systemctl stop mysql
重启服务
sudo systemctl restart mysql
设置开机自启
sudo systemctl enable mysql
取消开机自启
sudo systemctl disable mysql
卸载 MySQL
| 注意 |
|---|
| 卸载操作是不可逆的,在卸载之前一定要保证对重要数据做了备份!!!! |
停止 MySQL 服务
sudo systemctl stop mysql
查询安装的软件
sudo yum installed | grep mysql# 或sudo rpm -qa | grep mysql
输出示例:
mysql-community-client.x86_64 5.7.33-1.el7 @mysql57-communitymysql-community-common.x86_64 5.7.33-1.el7 @mysql57-communitymysql-community-libs.x86_64 5.7.33-1.el7 @mysql57-communitymysql-community-libs-compat.x86_64 5.7.33-1.el7 @mysql57-communitymysql-community-server.x86_64 5.7.33-1.el7 @mysql57-communitymysql80-community-release.noarch el7-3 installed
删除上面列出的软件包
sudo yum remove -y mysql-community-client mysql-community-common mysql-community-libs mysql-community-libs-compat mysql-community-server mysql80-community-release
可选:删除 MySQL 配置和数据
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 信息,示例:
mysql> SHOW VARIABLES LIKE 'validate_password%';+--------------------------------------+--------+| Variable_name | Value |+--------------------------------------+--------+| validate_password_check_user_name | OFF || validate_password_dictionary_file | || validate_password_length | 8 | ==> length verify| validate_password_mixed_case_count | 1 || validate_password_number_count | 1 || validate_password_policy | MEDIUM | ==> update to low| validate_password_special_char_count | 1 |+--------------------------------------+--------+
看到输出后就可以做相应的密码验证设置,示例:
mysql> set global validate_password_policy=LOW;mysql> set global validate_password_length=6;mysql> SHOW VARIABLES LIKE 'validate_password%';+--------------------------------------+-------+| Variable_name | Value |+--------------------------------------+-------+| validate_password_check_user_name | OFF || validate_password_dictionary_file | || validate_password_length | 6 || validate_password_mixed_case_count | 1 || validate_password_number_count | 1 || validate_password_policy | LOW || validate_password_special_char_count | 1 |+--------------------------------------+-------+
现在就可以直接设置一个简单的密码了,如 admin123 。
下面是具体说明:
validate_password_length:设置密码长度validate_password_dictionary_file:指定密码验证字典文件validate_password_mixed_case_count:指定密码必须包含大小写字母validate_password_number_count:指定密码必须包含阿拉伯数字validate_password_policy:设置密码验证策略,默认是MEDIUMvalidate_password_policy:0/LOW:仅验证密码长度1/MEDIUM:验证密码长度,并且要求包含数值、字母以及特殊字符2/STRONG:验证密码长度,并且要求包含数值、字母、特殊字符以及字典文件
