直接在主流 Linux 服务器(如 CentOS 8+/Rocky 9、Ubuntu 22.04+)上部署 MySQL,
mysql-server包已不再默认提供 —— 官方推荐用
mysql-community-server(Oracle 官方源)或
mariadb-server(系统默认替代),硬装旧版
mysql-server会触发依赖冲突或仓库不可用错误。
确认系统自带的 MySQL 替代方案
现代发行版基本移除了 Oracle MySQL 官方包,改用 MariaDB 兼容实现:
Ubuntu/Debian:apt list --installed | grep mysql通常只返回
mariadb-client、
mariadb-serverRHEL/CentOS/Rocky:
dnf module list mysql显示的是
mariadb模块,
mysql模块状态为
disabled或不存在 运行
mysqld --version很可能报错,因为真正服务名是
mysqld(MariaDB)或未安装
装 Oracle MySQL 官方版(需手动加 repo)
若明确需要 Oracle MySQL(比如依赖
mysql_native_password插件、特定复制特性),必须添加官方 YUM/APT 源: 下载对应平台的
mysql80-community-release包(如
mysql80-community-release-el9-1.noarch.rpm) 执行
sudo dnf install ./mysql80-community-release-el9-1.noarch.rpm(RHEL 系) 禁用默认模块:
sudo dnf module reset mysql && sudo dnf module enable mysql:8.0安装:
sudo dnf install mysql-community-server启动前先初始化:
sudo mysqld --initialize --user=mysql(日志里会输出临时 root 密码)
启动失败常见原因和修复
装完
mysql-community-server后
systemctl start mysqld报错,大概率是 SELinux 或目录权限问题:
Failed to start mysqld.service: Unit not found→ 检查是否装的是
mysql-community-server而非
mysql-server,服务名始终是
mysqld
Can't find error-message file '/usr/share/mysql-8.0/english/errmsg.sys'→ 缺少语言包,装
mysql-community-client-pluginsSELinux 拒绝访问
/var/lib/mysql→ 临时关 SELinux 测试:
sudo setenforce 0;长期方案是恢复上下文:
sudo restorecon -Rv /var/lib/mysql端口被占用(
Address already in use)→ 查
sudo ss -tlnp | grep :3306,确认没其他
mysqld或
mysqld_safe进程残留
首次登录与安全加固
初始化后 root 密码在
/var/log/mysqld.log里,用它登录后必须立刻改密并删匿名用户:
mysql -u root -p # 输入临时密码后执行: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!'; DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;
别跳过
mysql_secure_installation—— 它自动处理密码强度、远程 root、test 库等,但注意:该脚本在 MySQL 8.0+ 默认禁用
unix_socket认证,如果之前用 socket 登录过,运行时会提示切换认证方式,选
y即可。
真实部署中,最容易被忽略的是防火墙放行和 bind-address 配置:CentOS 的
firewalld默认不放行 3306,Ubuntu 的
ufw默认拒绝所有入站;而
my.cnf里的
bind-address = 127.0.0.1会彻底禁止远程连接,改
0.0.0.0前务必配好用户权限和网络 ACL。
