一、企业要求
1、环境准备:
1. 准备 3 台 Linux 服务器 并且编译安装mysql,完成基础环境检查以及mysql操作(不用提交文档)。
2.安装 MySQL 5.7.20: 使用 YUM 方式安装并验证版本。
3.安装 MySQL 8.0: 使用 YUM 方式安装并验证版本。
4.编写部署实施手册:
①服务器环境及 IP 规划
②详细安装步骤及命令
③关键操作截图及验证结果
④常见故障及解决方法
⑤MySQL 5.7.20 与 8.0 的区别
二、提交要求
1.提交完整的部署实施手册。
2.提供关键操作截图及验证结果。
3.确保数据库安装成功、能够正常连接。
4.要求: 独立完成部署,文档规范(以群里发的标准文档为主),步骤清晰,达到企业实施交付标准。
一、安装 MySQL 5.7.20
1、服务器环境及 IP 规划
项目 | 参数 |
操作系统 | CentOS 7.x(推荐 CentOS7.9) |
主机名 | node04 |
IP 地址 | 10.8.0.13(你按需改成自己虚拟机 IP) |
数据库版本 | MySQL 5.7.20 |
数据库端口 | 3306 |
数据目录 | /var/lib/mysql |
配置文件 | /etc/my.cnf |
日志文件 | /var/log/mysqld.log |
运行用户 | mysql(系统内置) |
防火墙 | firewalld |
规划说明:单实例部署,用于业务测试,关闭 SELinux、放行 3306 端口方便远程连接。
【ip a 查看 IP、hostname 查看主机名】
2、前置准备工作
重要:CentOS7 自带 mariadb,必须先卸载,否则和 MySQL5.7 冲突
2.1 关闭 SELinux(永久)
# 临时关闭 setenforce 0 # 永久关闭 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 查看状态 getenforcePermissive :临时已经关闭(宽容模式,只告警不拦截)
setenforce 0:只是临时生效,重启后失效;
sed 那条是修改配置文件,重启机器之后才会变成 disabled(彻底关闭)
2.2 关闭防火墙(或者放行 3306,二选一,生产建议放行端口)
# 方案A:关闭防火墙(测试机使用) systemctl stop firewalld systemctl disable firewalld # 方案B:放行3306(企业推荐) firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --reload firewall-cmd --list-all2.3 卸载自带 mariadb 相关包
# 查询mariadb rpm -qa | grep mariadb # 卸载(查到什么删什么) rpm -e --nodeps mariadb-libs如果没有输出代表没有安装,直接跳过卸载
2.4 添加 MySQL 官方 YUM 源 rpm 包
MySQL5.7.20 yum 源包名称:mysql57-community-release-el7-11.noarch.rpm
下载 MySQL 5.7 的 Yum 源安装包:wget http://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
# 安装这个源,将其添加到系统的仓库列表中
sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm
⚠️注意:mysql57-community-release-el7-11 这个源里面包含 5.7.20 版本,安装前锁定版本避免自动升到 5.7 高版本
2. 检查并确认 MySQL 5.7 源已启用
(可选操作)为确保接下来安装的是 5.7 版本,可以检查一下仓库配置。默认情况下,MySQL 5.7 的源应该是启用的。
你可以用以下命令确认:
yum repolist enabled | grep mysql
如果列表里出现了mysql57-community,就说明源配置正确。
如果不放心,也可以手动编辑配置文件确认:
vim /etc/yum.repos.d/mysql-community.repo
在文件中找到[mysql57-community]这一节,确保enabled=1。如果系统预装了其他版本的 MySQL(比如 MariaDB),建议先在文件中将其对应的源禁用(enabled=0),以避免冲突。
3. 安装 MySQL 5.7 服务器
源配置好后,安装就非常简单了。执行以下命令即可安装 MySQL 服务器及所需的客户端、共享库等组件。
sudo yum install mysql-community-server
安装过程中,系统会提示你确认下载,输入y并回车即可。
4. 启动 MySQL 并设置开机自启
安装完成后,需要启动 MySQL 服务。
# 启动 MySQL 服务
sudo systemctl start mysqld
# 设置 MySQL 服务开机自启动
sudo systemctl enable mysqld
# 查看 MySQL 服务状态
5. 获取初始密码并登录
对于 MySQL 5.7,安装后的第一次启动会为root用户生成一个临时密码,我们需要在日志文件中找到它。
sudo grep 'temporary password' /var/log/mysqld.log
命令执行后会返回类似下面的信息,其中 dr%&neCgu52U 就是临时密码。
A temporary password is generated for root@localhost: MkarQyrS6v/U
接下来,使用这个临时密码登录 MySQL:
mysql -u root -p
系统提示输入密码时,粘贴刚才查到的临时密码即可。
6. 修改 Root 密码
出于安全策略,首次登录后 MySQL 会强制要求你修改 root 密码。在 MySQL 命令行中执行:
第一步:刷新权限,加载user表
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
ALTER USER 'root'@'localhost' IDENTIFIED BY '1qaz@WSX' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';
#查看当前的密码策略(可选)
SHOW VARIABLES LIKE 'validate_password%';
-- 关闭对大小写字母的要求
SET GLOBAL validate_password_mixed_case_count = 0;
-- 关闭对数字的要求
SET GLOBAL validate_password_number_count = 0;
-- 关闭对特殊字符的要求
SET GLOBAL validate_password_special_char_count = 0;
#如果你只关心密码长度,不关心复杂度,可以执行:
SET GLOBAL validate_password_policy = 'LOW';
#密码仍然必须满足最小长度要求(默认是 8 位),如果你想设置更短的密码 如下
SET GLOBAL validate_password_length = 6;
MySQL 5.7 有默认的密码强度要求(需包含大小写字母、数字和特殊字符),如果不想设置复杂密码,可以先调整密码验证策略,再执行修改命令。
7. 额外说明
关于版本:你提到的 `5.7.20` 是一个较旧的版本。通过上述官方 Yum 源安装的,会是 MySQL 5.7 系列中最新的 GA(General Availability)稳定版,其核心功能和操作与 `5.7.20` 是一致的。
安装路径:通过 yum 安装的 MySQL,文件会分布在系统默认目录,例如配置文件在 `/etc/my.cnf`,数据文件在 `/var/lib/mysql`,日志文件在 `/var/log/mysqld.log`。
备用方案:除了 yum,MySQL 5.7.20 也可以通过源码编译或下载通用二进制包(glibc版)进行安装,但过程会更繁琐,涉及手动配置和依赖处理,适合对定制化有极高要求的场景。
8.开启远程连接(Navicat/DBeaver 远程连接测试)
# 重新登录mysql mysql -uroot -pRoot@123456 # 创建允许任意IP访问的root用户(企业测试环境使用) GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Root@123456'; FLUSH PRIVILEGES;生产环境不要用 root@%,单独创建业务账号
CREATE USER 'root'@'%' IDENTIFIED BY 'Root@123456'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; flush privileges;9.远程连接验证
使用 Navicat、DBeaver 连接:
- IP:10.8.0.13
- 端口:3306
- 用户:root
- 密码:Root@123456 连接成功即为交付达标。
启动mysql
10、常见故障及解决方法
故障现象 | 原因 | 解决方案 |
yum 安装 mysql 报 GPG 密钥校验失败 | MySQL 旧密钥失效 |
|
systemctl start mysqld 启动失败 | 1. selinux 未关;2. 数据目录权限异常;3. 端口占用 | 1. setenforce 0;2. chown mysql:mysql /var/lib/mysql -R;3. netstat -lntp |
grep 抓不到临时密码 | 之前初始化过 mysql,日志没有临时密码 | 删除数据目录,重新初始化: |
远程 Navicat 连不上 | 防火墙没放行 3306、授权是 root@localhost 、IP 不通 | firewall 放行端口 + 执行 grant root@% 授权 |
修改密码提示密码策略不通过 | 5.7 密码策略默认 MEDIUM,要求长度 + 符号大小写 | 设置符合复杂度密码;测试环境可临时降低策略: |
yum 安装自动装成 5.7.44 不是 5.7.20 | 仓库默认最新小版本,没有锁定版本 | 使用 指定完整版本安装 |
mysql 命令找不到 | 包没有安装成功,或者环境变量 | 重新 yum 安装,安装成功后自动生成 mysql 命令 |
二、安装 MySQL 8.0
1、服务器环境及 IP 规划
项目 | 参数 |
操作系统 | CentOS 7.x(推荐 CentOS7.9) |
主机名 | node04 |
IP 地址 | 10.8.0.13(你按需改成自己虚拟机 IP) |
数据库版本 | MySQL 5.7.20 |
数据库端口 | 3306 |
数据目录 | /var/lib/mysql |
配置文件 | /etc/my.cnf |
日志文件 | /var/log/mysqld.log |
运行用户 | mysql(系统内置) |
防火墙 | firewalld |
规划说明:单实例部署,用于业务测试,关闭 SELinux、放行 3306 端口方便远程连接。
【ip a 查看 IP、hostname 查看主机名】
2、前置准备工作
重要:CentOS7 自带 mariadb,必须先卸载,否则和 MySQL5.7 冲突
2.1 关闭 SELinux(永久)
# 临时关闭 setenforce 0 # 永久关闭 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 查看状态 getenforcePermissive :临时已经关闭(宽容模式,只告警不拦截)
setenforce 0:只是临时生效,重启后失效;
sed 那条是修改配置文件,重启机器之后才会变成 disabled(彻底关闭)
2.2 关闭防火墙(或者放行 3306,二选一,生产建议放行端口)
# 方案A:关闭防火墙(测试机使用) systemctl stop firewalld systemctl disable firewalld # 方案B:放行3306(企业推荐) firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --reload firewall-cmd --list-all2.3 卸载自带 mariadb 相关包
# 查询mariadb rpm -qa | grep mariadb # 卸载(查到什么删什么) rpm -e --nodeps mariadb-libs如果没有输出代表没有安装,直接跳过卸载
2.4 配置 MySQL 8.0 Yum源
下载 MySQL 8.0 官方 Yum 源:
cd /opt
wget https://repo.mysql.com/mysql80-community-release-el7-11.noarch.rpm
安装:
rpm -ivh mysql80-community-release-el7-11.noarch.rpm
查看仓库:
yum repolist all | grep mysql
2.5、指定 MySQL 8.0版本 8.0.36
查看可用版本:
yum list mysql-community-server --showduplicates
选择:
mysql-community-server-8.0.36
安装指定版本:
yum install -y \
mysql-community-server-8.0.36 \
mysql-community-client-8.0.36 \
mysql-community-common-8.0.36
3、启动 MySQL服务
启动:
systemctl start mysqld
设置开机启动:
systemctl enable mysqld
查看状态:
systemctl status mysqld
4、查看 MySQL版本
mysql --version
显示:mysql Ver 8.0.36 for Linux on x86_64
5、获取初始化密码
MySQL 8.0.36 第一次启动会生成临时密码:
grep "temporary password" /var/log/mysqld.log
6、修改root密码
6.1 登录:
mysql -uroot -p
输入临时密码登录。
密码如果乱了,重新走一遍重置 root 密码流程(MySQL8.0)
①修改 my.cnf,加上跳过权限参数
vim /etc/my.cnf在[mysqld]段下面添加一行:(测试远程连接需要再删除)
skip-grant-tables保存退出。
②重启 mysql
systemctl restart mysqld③免密登录 mysql(这次不用密码)
mysql -uroot6.2 修改密码策略:
set global validate_password.policy=0;
set global validate_password.length=6;
6.3 修改root密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
开启了 skip-grant-tables 时,不能直接执行 ALTER USER,必须先执行flush privileges;加载权限表!
在当前 mysql 窗口,按顺序敲:
flush privileges;执行成功后,再执行改密码语句(MySQL5.7 用这条):
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('Root123456'); SET PASSWORD FOR 'root'@'%' = PASSWORD('Root123456'); flush privileges;7、开启远程访问
7.1 创建远程root用户:
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
7.2 授权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
7.3 刷新权限:
FLUSH PRIVILEGES;
8、防火墙开放3306
firewall-cmd \ --add-port=3306/tcp \ --permanent
firewall-cmd --reload
9、测试登录
9.1 本机测试:
mysql -uroot -p123456
9.2 查看数据库:
show databases;
10、验证安装
10.1 查看版本:
mysql -V
10.2 查看监听:
ss -ntl | grep 3306
结果:
LISTEN 0 128 *:3306
10.3 登录测试:
mysql -uroot -p123456 -e "select version();"
输出:
+-----------+
| version() |
+-----------+
| 8.0.36 |
+-----------+
11、常见故障及解决方法
故障现象 | 故障原因 | 解决方案 | |
yum 安装报 GPG 密钥校验失败 | MySQL 旧 GPG 密钥过期 |
| |
mysqld 启动失败 | 1.SELinux 未关闭;2. 数据目录权限异常;3. 端口占用 | 1.setenforce 0;2. ;3.`netstat -lntp | grep 3306` |
grep 抓不到临时密码 | 数据目录残留旧初始化文件 |
| |
Navicat 远程连不上,报认证插件错误 | 8.0 默认 caching_sha2_password,客户端不兼容 | 创建用户指定 | |
修改密码提示不符合密码策略 | 8.0 默认密码策略 MEDIUM,复杂度高 | 设置大小写 + 数字 + 符号;测试环境临时降低策略: | |
远程连接超时 | 防火墙 3306 端口未放行 | firewall-cmd 放行端口并重载 | |
mysql 命令找不到 | 安装未完成 | 重新执行 yum install mysql-community-server | |
登录报错 Access denied | 密码输错、授权主机不对 | 核对密码;检查 root@% 授权语句 |
三、MySQL 5.7.20 vs MySQL 8.0 核心区别
重点:你现在踩坑的密码认证插件就是二者最经典差异,也是Navicat连不上的根源
1. 用户密码认证(最高频考点、排错重点⭐)
- MySQL 5.7:默认
mysql_native_password
Navicat、旧客户端直接连,无兼容问题 - MySQL 8.0:默认
caching_sha2_password
老版本Navicat不支持,直接报1045访问拒绝,需要手动改成mysql_native_password
-- 8.0兼容Navicat写法 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';2. 数据字典 & 架构
- 5.7:数据字典存放在独立的frm、ibd文件,元数据是文件形式
- 8.0:数据字典内置在InnoDB系统表,不再有frm文件;DDL是原子化(崩溃安全)
5.7执行alter表容易锁表、元数据锁阻塞,8.0 DDL稳定性更好
3. 字符集默认值
- 5.7 默认:
latin1 - 8.0 默认:
utf8mb4(真正完整utf8,支持emoji表情),排序规则utf8mb4_0900_ai_ci
4. 窗口函数(面试常考)
- 5.7:没有窗口函数(row_number()、rank()、dense_rank() 都不能用)
- 8.0:原生支持窗口函数、CTE(WITH递归公共表达式),分析查询非常方便
5. 索引 & 优化器
- 8.0新增:降序索引、隐藏索引、不可见索引、函数索引;
5.7只有普通索引,不支持这些
6. 权限管理
- 5.7:
grant可以隐式创建用户
grant all on *.* to root@'%' identified by 'xxx'; --5.7合法- 8.0:grant不再创建用户,必须先create user,再grant授权,分开两步!
很多人8.0写5.7的授权语句直接报错
7. 自增主键持久化
- 5.7:重启MySQL,自增值会重置(最大值+1,有坑)
- 8.0:自增值持久化写入redo log,重启不丢失,业务更稳
8. JSON支持
- 5.7:有JSON类型,但函数少、性能弱
- 8.0:JSON增强,支持JSON路径表达式、JSON索引
9. 配置参数差异(你重置密码会碰到)
- 5.7密码插件参数:
default_authentication_plugin=mysql_native_password - 8.0默认:
default_authentication_plugin=caching_sha2_password
10. 并发、锁、事务
- 8.0 改进InnoDB,支持原子DDL、锁机制优化、ReadView复用,高并发表现更好
✅ 一句话给你排坑总结(贴合你现在Navicat 1045问题)
- 如果是MySQL5.7:默认native密码,Navicat基本直接连,不用改认证插件;授权可以一条grant创建用户
- 如果是MySQL8.0:默认sha2密码,老Navicat必报错,必须改
mysql_native_password;授权要先create user
11.简单对比表
项目 | MySQL5.7.20 | MySQL8.0 |
默认认证插件 | mysql_native_password | caching_sha2_password |
默认字符集 | latin1 | utf8mb4 |
窗口函数 | ❌不支持 | ✅支持 |
CTE递归 | ❌ | ✅ |
grant建用户 | ✅支持 | ❌禁止,必须分开 |
自增持久化 | ❌重启重置 | ✅持久化 |
frm文件 | 有 | 取消 |