centos 7.6–7.9 是 mysql 5.7 官方兼容环境,需验证 cat /etc/redhat-release 和 uname -m(必须 x86_64),禁用 firewalld 或放行 3306 端口,确保 /var 剩余空间 ≥2gb,使用官方 el7 源并清理残留后启用 mysql57-community 仓库,初始化推荐 --initialize-insecure 配合显式 bind-address = 0.0.0.0 及用户权限配置。

确认系统环境与MySQL 5.7兼容性
CentOS 7 是 MySQL 5.7 官方支持的主流发行版,但 CentOS 8+ 默认仓库已移除 MySQL 5.7(只提供 8.0),强行安装会触发依赖冲突或 yum install 失败。Debian/Ubuntu 同样不推荐——其 apt 源中 MySQL 5.7 已归档,且 mysql-server 包实际指向 8.x。
实操建议:
- 仅在
CentOS 7.6–7.9或Red Hat Enterprise Linux 7上执行该脚本 - 运行前检查:
cat /etc/redhat-release和uname -m(必须为x86_64) - 禁用
firewalld或提前放行3306端口,否则安装后无法远程连接 - 确保
/var分区剩余空间 ≥2GB——mysql-community-server包解压后占用约 1.2GB
使用官方YUM源而非第三方repo
很多一键脚本用 epel 或自建 repo,结果装出 MariaDB 或报 Package: mysql-community-server-5.7.x.fc28 这类跨发行版错误。MySQL 官方 RPM 包严格绑定 el7 标签,必须用 https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm(注意版本号:当前最新是 -11,不是 -10 或 -12)。
关键操作:
- 先清理残留:
yum remove mysql* -y && rm -rf /var/lib/mysql /etc/my.cnf - 导入源:
rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm - 验证启用状态:
yum repolist enabled | grep mysql—— 输出应含mysql57-community/x86_64 - 禁止自动升级到 8.0:
sed -i 's/enabled=1/enabled=0/' /etc/yum.repos.d/mysql-community.repo,再手动启用 5.7:sed -i 's/enabled=0/enabled=1/' /etc/yum.repos.d/mysql-community.repo
初始化时绕过默认密码生成机制
MySQL 5.7 启动后强制要求改密,而脚本若未捕获临时密码,后续 mysql -u root -p 会卡住。更糟的是,mysqld --initialize 在无 --user=mysql 时可能以 root 身份写入数据目录,导致权限错误。
安全且可脚本化的做法:
- 初始化前创建数据目录并赋权:
mkdir -p /var/lib/mysql && chown mysql:mysql /var/lib/mysql - 用
--initialize-insecure(非生产环境)跳过密码生成:mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql - 启动服务:
systemctl start mysqld && systemctl enable mysqld - 首次登录不输密码:
mysql -u root --skip-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPass123';"
注意:--initialize-insecure 仅限内网部署;如需合规,改用 --initialize + 解析 /var/log/mysqld.log 中的临时密码,但解析逻辑易受日志格式变更影响。
配置文件必须显式指定 bind-address
默认 my.cnf 中 bind-address = 127.0.0.1,导致云主机即使开了安全组也无法远程访问。直接删掉这行不行——MySQL 5.7 会 fallback 到 0.0.0.0,但可能暴露风险;硬写 0.0.0.0 又不符合最小权限原则。
稳妥方案:
- 在
/etc/my.cnf的[mysqld]段落末尾追加:bind-address = 0.0.0.0 - 配套添加访问控制:
mysql -uroot -pYourPass123 -e "CREATE USER 'app'@'%' IDENTIFIED BY 'AppPass123'; GRANT SELECT,INSERT,UPDATE ON *.* TO 'app'@'%'; FLUSH PRIVILEGES;" - 重启生效:
systemctl restart mysqld,然后用ss -tlnp | grep :3306验证监听地址是否为*:3306
云主机上漏掉 bind-address 修改,脚本跑完也连不上——这是最常被忽略的一步。











