直接用包管理器安装 MySQL 8.0(推荐)
绝大多数 Linux 发行版的官方仓库已提供 MySQL 8.0,无需手动编译或下载二进制包。Debian/Ubuntu 用
apt,CentOS/RHEL 8+ 用
dnf,RHEL 7 用
yum。安装后服务默认不启动,也不设 root 密码——这是 MySQL 8.0 的安全默认行为。 Ubuntu/Debian:
sudo apt update && sudo apt install mysql-serverCentOS 8+/AlmaLinux/Rocky Linux:
sudo dnf install @mysqlRHEL/CentOS 7:
sudo yum install mysql-community-server(需先启用 MySQL 官方 repo)
注意:不要混用不同源(比如同时启用 MariaDB repo 和 MySQL repo),否则可能因依赖冲突导致
systemctl start mysqld失败并报
Failed to start mysqld.service: Unit not found。
初始化 root 密码与验证插件选择
MySQL 8.0 默认使用
caching_sha2_password插件,但部分旧客户端(如某些 PHP PDO 驱动、Navicat 旧版本)不兼容,连接时会报错
Authentication plugin 'caching_sha2_password' cannot be loaded。首次启动后必须运行
sudo mysql_secure_installation,它会引导你设置 root 密码、禁用匿名用户、禁止远程 root 登录等。 若需兼容老客户端,可在初始化后执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';密码强度策略由
validate_password组件控制,默认要求至少 8 位、含大小写字母+数字+特殊字符;临时关闭可执行:
UNINSTALL COMPONENT "file://component_validate_password";(不建议生产环境关闭)
配置文件 my.cnf 的常见修改位置与权限问题
MySQL 启动时按顺序读取多个配置文件,优先级从高到低为:
/etc/my.cnf→
/etc/mysql/my.cnf→
/usr/etc/my.cnf→
~/.my.cnf。实际生效的是第一个存在且可读的文件。修改后必须重启服务:
sudo systemctl restart mysql(Ubuntu/Debian)或
sudo systemctl restart mysqld(RHEL/CentOS)。 绑定地址默认是
127.0.0.1,如需监听外网,改
bind-address = 0.0.0.0,但必须配合防火墙(
ufw或
firewalld)放行 3306 端口 中文支持需在
[mysqld]段落添加:
character-set-server = utf8mb4和
collation-server = utf8mb4_unicode_ci;同时在
[client]段落加
default-character-set = utf8mb4配置文件权限必须为 644,且属主不能是普通用户(否则 MySQL 启动时拒绝读取并静默失败)
验证安装与常见连接失败排查
运行
sudo mysql -u root -p是最直接的验证方式。如果提示
Access denied for user 'root'@'localhost',说明
mysql_secure_installation未执行或密码输错;若提示
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock',先检查服务状态:
systemctl status mysql或
systemctl status mysqld,常见原因是磁盘满、
/var/lib/mysql权限被误改、或配置文件语法错误(如多了一个逗号)。 查看错误日志最快路径:
sudo tail -n 50 /var/log/mysql/error.log(Ubuntu)或
sudo tail -n 50 /var/log/mysqld.log(RHEL) socket 路径不一致时,可用
mysql --socket=/path/to/mysql.sock -u root -p显式指定 忘记 root 密码?需跳过权限表启动:
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables",再连入重置,但操作期间数据库无访问控制
配置里最容易被忽略的是 SELinux(RHEL/CentOS)和 AppArmor(Ubuntu)。即使端口开放、配置正确,它们也可能拦截 mysqld 对数据目录或 socket 文件的访问,错误日志中会出现
Permission denied但不提示 SELinux。临时关闭验证可用:
sudo setenforce 0(RHEL)或
sudo aa-disable /usr/sbin/mysqld(Ubuntu)。
