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路径冲突,比公网环境更难定位。
