如何在CentOS系统中高效完成MySQL环境搭建 CentOS数据库环境搭建与安全配置教程

5次阅读

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系统中高效完成MySQL环境搭建 CentOS数据库环境搭建与安全配置教程

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/tcpfirewall-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,新用户权限不会生效——这两个操作在自动化脚本里最容易被忽略。

text=ZqhQzanResources