前言
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
下载完成后看下文件:
$ ls
mysql80-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 mysql
mysql-community.repo
mysql-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 disabled
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - disabled
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community disabled
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - disabled
mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community disabled
mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - disabled
mysql-connectors-community/x86_64 MySQL Connectors Community enabled: 185
mysql-connectors-community-source MySQL Connectors Community - disabled
mysql-tools-community/x86_64 MySQL Tools Community enabled: 123
mysql-tools-community-source MySQL Tools Community - Sourc disabled
mysql-tools-preview/x86_64 MySQL Tools Preview disabled
mysql-tools-preview-source MySQL Tools Preview - Source disabled
mysql55-community/x86_64 MySQL 5.5 Community Server disabled
mysql55-community-source MySQL 5.5 Community Server - disabled
mysql56-community/x86_64 MySQL 5.6 Community Server disabled
mysql56-community-source MySQL 5.6 Community Server - disabled
mysql57-community/x86_64 MySQL 5.7 Community Server disabled
mysql57-community-source MySQL 5.7 Community Server - disabled
mysql80-community/x86_64 MySQL 8.0 Community Server enabled: 229
mysql80-community-source MySQL 8.0 Community Server - disabled
从信息中可以看到除了 mysql80-community
其他版本都是禁用( disabled
)状态。所以,如果想要安装特定版本只需要将该版本设置为 enable
其他版本设置为 disabled
即可。
我现在想要安装 5.7
版本,执行如下操作即可:
sudo yum-config-manager --disable mysql80-community
sudo 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 Server
Loaded: 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 ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 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
$ ls
mysql-5.7.32-1.el7.x86_64.rpm-bundle.tar
开始安装
现在我们需要做的就是解压这个 .rpm-bundle.tar
文件(解压到 pkg
文件夹):
sudo mkdir pkg
sudo 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.rpm
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
mysql-community-devel-5.7.32-1.el7.x86_64.rpm mysql-community-libs-5.7.32-1.el7.x86_64.rpm
mysql-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 mysql
mysql 222312 1 0 15:49 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
webuser 223156 218766 0 15:58 pts/1 00:00:00 grep --color=auto mysql
另外也可以使用 systemctl
命令查看服务状态:
$ systemctl status mysql
Unit mysql.service could not be found.
[root@localhost pkg]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: 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.html
Mar 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 configuration
of 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 have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
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 at
the 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' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
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 my
my.cnf
my.cnf.d
- 所有的二进制文件以及依赖包都在
/usr/bin
和/usr/sbin
目录下(可以使用如下命令查看)
$ ls /usr/bin/ | grep mysql
$ ls /usr/sbin/ | grep mysql
- 所有的数据都在
/var/lib/mysql
目录下:
$ sudo ls /var/lib/mysql
auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys
ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem
默认情况下,MySQL 下的用户是无法远程登录的(比如在其他机器上使用 JAVA 客户端连接),所以我们需要进行一些设置。首先呢,当然是需要在机器上使用 root 用户进行登录了:
$ sudo mysql -u root -p
Enter password:
之后就连接上 MySQL 服务了:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server 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 its
affiliates. Other names may be trademarks of their respective
owners.
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.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-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-community
mysql-community-common.x86_64 5.7.33-1.el7 @mysql57-community
mysql-community-libs.x86_64 5.7.33-1.el7 @mysql57-community
mysql-community-libs-compat.x86_64 5.7.33-1.el7 @mysql57-community
mysql-community-server.x86_64 5.7.33-1.el7 @mysql57-community
mysql80-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
:设置密码验证策略,默认是MEDIUM
validate_password_policy
:0/LOW
:仅验证密码长度1/MEDIUM
:验证密码长度,并且要求包含数值、字母以及特殊字符2/STRONG
:验证密码长度,并且要求包含数值、字母、特殊字符以及字典文件