推荐用包管理器安装mysql 8.0:ubuntu/debian用apt,centos 8+/alma/rocky用dnf,rhel 7用yum(需先启用mysql官方repo);安装后需运行mysql_secure_installation初始化root密码并加固,注意验证插件兼容性、配置文件权限与路径、selinux/apparmor拦截等问题。

直接用包管理器安装 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-server - CentOS 8+/AlmaLinux/Rocky Linux:
sudo dnf install @mysql - RHEL/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)。










