云服务器部署踩坑: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 文件传密码,不走命令行 |