2026-09-08-mysql-57-init-walkthrough

云服务器部署踩坑:MySQL 5.7 初始化全流程

背景

给一台云服务器部署物业管理系统,需要在 CentOS 7 上初始化 MySQL。本地开发环境是 MySQL 5.7.44,所以云上保持一致。

装包本身没什么问题,真正麻烦的是 MySQL 首次启动后的密码初始化链路 ------ 这里有三个隐藏坑,踩完记一笔。


坑一:临时密码默认 EXPIRED

CentOS 7 安装 MySQL 5.7 后,首次启动会自动生成一个临时 root 密码,记录在 /var/log/mysqld.log:

bash 复制代码
grep 'temporary password' /var/log/mysqld.log | tail -1
# 输出类似:
# A temporary password is generated for root@localhost: XXXX

关键点:这个密码默认是 EXPIRED 状态。

在交互模式下(直接敲 mysql),客户端会自动提醒你去改密码。但在非交互模式 (mysql -e '...')下,你必须显式加 --connect-expired-password 才能连上:

bash 复制代码
# ❌ 不加 flag,直接报错
mysql -uroot -p'临时密码' -e 'SELECT 1;'
# ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

# ✅ 加 flag,才能执行 ALTER USER
mysql -uroot -p'临时密码' --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';"

更麻烦的是:EXPIRED 状态下,除了 ALTER USER,其他任何语句(SELECT、SHOW 等)全被拒。 所以第一步必须是 ALTER USER,不能用 SELECT 测试连接。


坑二:MEDIUM 密码策略拒绝简单密码

MySQL 5.7 默认开启 validate_password 插件,策略是 MEDIUM,要求:

  • 长度 ≥ 8
  • 至少 1 大写 + 1 小写 + 1 数字 + 1 特殊字符

直接 ALTER USER ... IDENTIFIED BY '123456' 会报密码策略错误。

解决方案:先改一个满足 MEDIUM 的强密码,降策略后再改回简单密码。


坑三:密码含特殊字符的传递

MySQL 随机生成的临时密码有时包含 , 等特殊字符,直接写在命令行里会被 shell 解析出错。

稳健做法:用 .cnf 配置文件传密码。

bash 复制代码
# 写一个临时 .cnf 文件
cat > /tmp/mysql.cnf <<EOF
[client]
user=root
password=你的密码
EOF
chmod 600 /tmp/mysql.cnf

# mysql client 读文件,shell 不碰密码
mysql --defaults-file=/tmp/mysql.cnf -e 'SELECT 1;'

完整链路(5 步)

把上面三个坑串起来,完整的 MySQL 5.7 初始化链路:

步骤 命令 说明
1 grep 'temporary password' /var/log/mysqld.log 取出临时密码
2 ALTER USER ... IDENTIFIED BY 'Root@12345' 改成满足 MEDIUM 的强密码(用 --connect-expired-password + .cnf 传密码)
3 切换 .cnf 到强密码,重新连接 验证连通,此时密码不再 EXPIRED
4 SET GLOBAL validate_password_policy=LOW; SET GLOBAL validate_password_length=4; 降策略
5 ALTER USER ... IDENTIFIED BY '123456' 改成最终简单密码
6 CREATE USER 'root'@'%' ... + GRANT 开启远程登录

之后就可以正常建库、建用户、授权了。


总结

坑 症状 解法
临时密码 EXPIRED 非交互模式报错 1820 加 --connect-expired-password
EXPIRED 下只允许 ALTER USER SELECT/SHOW 全被拒 第一个命令必须是 ALTER USER
MEDIUM 策略拒绝简单密码 ALTER USER 报密码策略错误 先改强密码 → 降策略 → 改回简单密码
特殊字符密码解析错误 shell 把 , 当分隔符 用 .cnf 文件传密码,不走命令行
相关推荐
CoderYanger4 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
wafrdggh7 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
一个天蝎座 白勺 程序猿7 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
红尘散仙7 小时前
谁说终端只能敲键盘?我用 Rust 给小说阅读器加上了鼠标
前端·后端·rust
Penge6668 小时前
《Go 后端开发者学 React:组件通信与插槽》
javascript
陈随易9 小时前
C++26 草案被否,二十八年来头一回
前端·后端·程序员
ZhengEnCi9 小时前
Agent 工具怎么折叠海量输出才「爽」:Trae、Claude Code 的渐进式披露设计原理
前端·agent
Penge6669 小时前
《Go 后端开发者学 React:useState》
javascript
Penge6669 小时前
《Go 后端开发者学 React:数据渲染》
javascript
龙腾AI白云10 小时前
仿真到现实(Sim-to-Real)迁移:跨越仿真与现实鸿沟
数据库·机器学习·plotly·知识图谱·tornado