centos 7/8 部署 mysql 8.0 必须使用 oracle 官方 rpm 源,先卸载 mariadb-libs,再安装 mysql80-community-release 并启用 8.0 仓库,然后 yum install mysql-community-server;初始化后须立即用临时密码登录并执行 alter user 修改 root 密码、禁用密码过期,否则无法再次登录;需配置 bind-address、开放 3306 端口,并启用 selinux 的 mysqld_connect_any 布尔值;创建应用用户时应限定 host、按需授权、显式指定认证插件并刷新权限。

CentOS 7/8 默认不带 MySQL 官方包,直接 yum install mysql 装到的是 MariaDB;真要部署 MySQL,必须从 Oracle 官方源或二进制包入手,否则后续权限、语法、主从兼容性都会出问题。
用官方 RPM 源安装 MySQL 8.0(推荐 CentOS 7/8)
Oracle 提供的 mysql80-community-release 是最稳妥的起点,它会自动配置好 GPG 签名验证和版本锁定,避免 yum 升级时意外切到 MySQL 5.7 或被 MariaDB 替换。
- 先卸载可能存在的
mariadb-libs(否则安装会冲突):yum remove mariadb-libs - 下载并安装源包(以 CentOS 7 为例):
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-10.noarch.rpm - 确认启用的是 8.0 系列:
yum repolist enabled | grep mysql,输出应含mysql80-community - 执行安装:
yum install mysql-community-server(别漏掉-server后缀)
注意:CentOS 8 的 mysql80-community-release-el8 包名不同,且需确保系统已启用 PowerTools 仓库(yum config-manager --set-enabled powertools),否则依赖 libtirpc 会装不上。
初始化后必须改 root 密码并禁用密码过期策略
MySQL 8.0 默认生成临时密码写在 /var/log/mysqld.log 里,但首次登录后若不立刻修改,下次就因密码过期被拒绝访问——这是线上事故高发点。
- 启动服务:
systemctl start mysqld,检查状态:systemctl status mysqld - 提取临时密码:
grep 'temporary password' /var/log/mysqld.log - 登录并立即改密(必须两步):
mysql -uroot -p→ 执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass123!'; - 禁用自动过期:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; - 刷新权限:
FLUSH PRIVILEGES;
跳过第二步或只用 SET PASSWORD 会导致认证插件不匹配(caching_sha2_password vs mysql_native_password),客户端连不上。
绑定地址与防火墙放行(别只关 firewalld)
MySQL 默认监听 127.0.0.1,远程连接失败往往不是端口没开,而是 bind-address 没放开或 SELinux 拦截了网络访问。
- 编辑
/etc/my.cnf,在[mysqld]下加一行:bind-address = 0.0.0.0(如只需内网,填宿主机内网 IP) - 重启服务:
systemctl restart mysqld - 开放端口:
firewall-cmd --permanent --add-port=3306/tcp→firewall-cmd --reload - 关键一步:SELinux 必须允许 mysqld 网络连接:
setsebool -P mysqld_connect_any on
漏掉 SELinux 配置,telnet ip 3306 能通,但客户端仍报 Connection refused 或超时——因为连接请求根本没进 mysqld 进程。
创建应用用户时务必指定 host 并限制权限
直接给应用用 root@'%' 是典型安全隐患,且 MySQL 8.0 的密码加密方式默认不兼容老客户端(如某些 PHP 5.x 扩展)。
- 不要用
GRANT ALL ON *.*,按最小权限原则:CREATE USER 'appuser'@'192.168.10.%' IDENTIFIED BY 'AppPass456!' PASSWORD EXPIRE NEVER; - 授权具体库:
GRANT SELECT,INSERT,UPDATE ON myapp_db.* TO 'appuser'@'192.168.10.%'; - 如需兼容旧客户端,显式指定认证插件:
ALTER USER 'appuser'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY 'AppPass456!'; - 最后执行:
FLUSH PRIVILEGES;
host 写成 '%' 而非具体网段,等于暴露数据库到公网;而忘记 FLUSH PRIVILEGES,新用户权限不会生效——这两个操作在自动化脚本里最容易被忽略。










