应优先使用yum或apt安装mysql,因其自动处理依赖、服务注册、日志路径、selinux策略及初始密码管理;手动安装易遇libaio缺失、服务未注册、socket路径错误等问题。

直接用包管理器装,别手动编译
绝大多数生产环境和开发测试机,都应该用 yum(RHEL/CentOS/Rocky/AlmaLinux)或 apt(Ubuntu/Debian)安装 MySQL,而不是下载 tar.gz 手动解压配置。原因很实在:自动处理依赖、服务注册、日志路径、SELinux 策略适配,还省去 mysqld --initialize 后找初始密码的麻烦。
常见错误现象包括:libaio.so.1: cannot open shared object file(手动安装时漏装依赖)、Failed to start mysqld.service: Unit not found(没注册服务)、Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(socket 路径不一致或权限不对)。
- RHEL 9 / Rocky Linux 9:先装官方 repo:
dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm,再启用 8.0 模块:dnf module enable mysql:8.0,最后dnf install mysql-community-server - Ubuntu 22.04+:
apt update && apt install mysql-server,装完直接sudo mysql就能进,不用密码(靠auth_socket插件) - 如果系统里有
mariadb-libs,必须先卸载:dnf remove mariadb-libs -y,否则会冲突报错
初始化后找不到 root 密码怎么办
MySQL 5.7+ 启动时自动生成 root 初始密码,但很多人卡在这步:查日志没结果、日志路径不对、或者 grep 'temporary password' /var/log/mysqld.log 返回空。根本原因是服务没真正启动成功,或者日志被重定向了。
正确做法是先确认服务状态:systemctl status mysqld,看是否 active (running);如果不是,用 journalctl -u mysqld -n 50 -e 查最近 50 行真实输出。临时密码只在首次成功启动时写入日志一次,且只出现一次。
- CentOS/Rocky 默认日志路径是
/var/log/mysqld.log - Ubuntu 的
mysql-server包默认不生成临时密码,而是用auth_socket,所以直接sudo mysql即可 - 如果初始化失败(比如
datadir权限不对),mysqld不会写密码,得先修复权限:chown -R mysql:mysql /var/lib/mysql
改密码失败:ERROR 1819 (HY000)
这是 MySQL 8.0+ 默认开启密码强度策略导致的,不是你输错了,而是规则拦住了。典型报错:Your password does not satisfy the current policy requirements。
不要急着删插件或降级,先看当前策略:SHOW VARIABLES LIKE 'validate_password%';。最常踩的坑是以为设个 123456 就行,其实 8.0 默认要求至少 8 位、大小写字母、数字、特殊字符各一。
- 临时绕过(仅调试用):
SET GLOBAL validate_password.policy=LOW;,再ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; - 永久修改要改配置文件:
/etc/my.cnf里加[mysqld]段:validate_password.policy=LOW,然后重启服务 - Ubuntu 用户注意:默认 root 是
auth_socket认证,改密码前得先切认证方式:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPass123!';
远程连不上:bind-address 和防火墙都得动
装完只能本地连,远程 ERROR 2003 (HY000),十有八九是两个地方没动:bind-address 还是 127.0.0.1,以及系统防火墙没放行 3306。
bind-address 在 /etc/my.cnf 的 [mysqld] 段里,默认值锁死本地。改成 0.0.0.0 允许所有 IP 连接(生产环境建议指定内网段,如 192.168.1.0/24);改完必须重启服务,systemctl restart mysqld。
- 检查是否生效:
ss -tlnp | grep :3306,看到*:3306表示监听全网,如果是127.0.0.1:3306就没改对 - Firewalld:
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload - ufw(Ubuntu):
ufw allow 3306 - 用户权限别漏:
CREATE USER 'remote'@'%' IDENTIFIED BY 'pass'; GRANT ALL ON *.* TO 'remote'@'%'; FLUSH PRIVILEGES;
真正容易被忽略的是 SELinux —— 它可能静默拦截网络连接,即使防火墙开了。临时验证是否是它:运行 setenforce 0,再试远程连接。如果是,就得配策略:semanage port -a -t mysqld_port_t -p tcp 3306(需先 yum install policycoreutils-python-utils)。










