mysql 5.7/8.0 在 centos 7 内网离线安装应使用官方二进制包,创建 mysql 用户、--initialize-insecure 初始化,绑定内网 ip,创建带 host 限定的应用账号,配置 firewalld 和 selinux 放行,并按最小权限原则授权。

MySQL 5.7/8.0 在 CentOS 7 内网离线安装
内网环境通常无法直接 yum install mysql-server,必须走离线部署。优先选官方二进制包(mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz 或 mysql-8.0.33-linux-glibc2.12-x86_64.tar.gz),比 RPM 包更可控,不依赖系统级服务注册。
关键步骤:
- 用外网机器下载对应版本二进制包,校验
sha256sum防止传输损坏 - 解压到
/opt/mysql,创建专用用户mysql(不要用 root 启动) - 初始化必须加
--initialize-insecure(避免随机 root 密码丢失在日志里,内网调试期省事) -
mysqld --defaults-file=/etc/my.cnf启动前务必确认my.cnf中bind-address = 127.0.0.1已改为内网 IP(如192.168.10.5),否则其他机器连不上
创建应用账号并限制访问来源
默认 root@localhost 无法从内网其他机器登录,必须显式创建带 host 限定的账号。不要用 %,哪怕是在内网——一旦防火墙策略松动或跳板机暴露,风险陡增。
实操命令示例:
CREATE USER 'app_user'@'192.168.10.%' IDENTIFIED BY 'StrongPass123!'; GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'app_user'@'192.168.10.%'; FLUSH PRIVILEGES;
注意点:
- host 段用
192.168.10.%比%更安全,且兼容大多数内网子网划分 - MySQL 8.0 默认认证插件是
caching_sha2_password,老应用连接可能报Client does not support authentication protocol;建号时加IDENTIFIED WITH mysql_native_password兼容 - 权限粒度按最小够用原则给,比如报表库只给
SELECT,写入库禁用DROP和ALTER
防火墙与 SELinux 的实际放行逻辑
即使 MySQL 绑定了内网 IP、账号也开了对应 host,仍连不上?八成卡在系统层。CentOS 7 默认 firewalld 和 SELinux 双启用,必须都过一遍。
firewalld 放行:
- 别只加端口:运行
firewall-cmd --permanent --add-port=3306/tcp后,必须firewall-cmd --reload - 更稳妥的做法是加 rich rule,限定源 IP 段:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port=3306 protocol=tcp accept'
SELinux 放行(常被忽略):
- 检查状态:
sestatus,若为enforcing,需允许 mysqld 网络连接:setsebool -P mysqld_connect_any on - 若数据目录不在
/var/lib/mysql(比如放在/data/mysql),还要恢复上下文:semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?",再restorecon -Rv /data/mysql
验证连通性时最容易漏掉的三个点
用另一台内网机器执行 mysql -h 192.168.10.5 -u app_user -p 连不上?先别改配置,快速排查这三项:
- 从客户端机器执行
telnet 192.168.10.5 3306—— 如果不通,问题在网络或防火墙,不是 MySQL 配置 - 在数据库服务器上执行
netstat -tlnp | grep :3306,确认监听的是*:3306或具体内网 IP,不是仅127.0.0.1:3306 - 查 MySQL 错误日志:
tail -f /opt/mysql/data/hostname.err,常见提示如Access denied for user 'app_user'@'192.168.10.22',说明账号 host 不匹配,不是密码错
内网环境容易高估“物理隔离”的安全性,但账号、防火墙、SELinux 三层中任意一层配置疏漏,都会导致服务不可用或越权访问。尤其是多实例共存时,my.cnf 加载顺序和 socket 路径冲突,比公网环境更难定位。










