在 AWS EC2 上安装 MySQL 时,直接使用最新官方二进制包通常是最稳妥的方案。因为通过 yum 或 apt 安装时,系统往往会默认部署 MariaDB 或较旧版本的 MySQL,不仅无法精确指定如 8.0.34 这类目标版本,还容易在认证插件(caching_sha2_password)、密码策略、配置文件路径以及数据目录结构上出现差异,最终引发客户端连接失败、权限混乱,以及后续升级迁移困难等问题。

更可靠的做法,是直接安装最新版 MySQL 官方二进制包,尽量不要走系统包管理器(yum install mysql-server 或 apt-get install mysql-server)这条路径——因为它默认拉取下来的,很多时候其实是 MariaDB,或者是偏旧的 MySQL 版本,而且像 8.0.34 这样的精确版本通常无法直接指定。这样会给后续的权限设置、密码策略调整以及插件兼容性埋下不少隐患。
为什么不建议用 yum install mysql-server?
在 Amazon Linux 2024、CentOS Stream、RHEL 等系统中,执行 yum install mysql-server 实际安装的往往是 mariadb-server;而在 Ubuntu/Debian 环境下,虽然可能安装的是 mysql-client + mysql-server,但版本通常停留在 5.7 或低于 8.0.33。核心问题主要有以下几点:
mysql_native_password插件默认未启用,容易导致客户端连接时报错:ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded- 初始化完成后,root 临时密码不会直接输出到终端,而是写入
error.log,查找起来非常不便 - 配置文件路径、服务名称以及数据目录结构都可能与最新官方二进制包不一致,后续做 MySQL 升级或迁移时很难统一
必须使用最新二进制包:下载、解压、初始化三步完成
以 Amazon Linux 2024 为例,推荐的完整安装流程如下(统一使用 /data/mysql8/3308 作为路径):
- 执行
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34-linux-glibc2.17-x86_64.tar.gz下载官方安装包,建议不要使用镜像站,以免出现校验失败或版本不一致的问题 - 解压之后立即执行
chown -R mysql:mysql /data/mysql8/3308,否则在运行mysqld --initialize时很可能因为权限不足而失败 - 初始化命令必须带上
--user=mysql并明确指定--datadir:./bin/mysqld --initialize --user=mysql --datadir=/data/mysql8/3308/data --basedir=/data/mysql8/3308/mysql - 初始化成功后,MySQL 临时密码会出现在
/data/mysql8/3308/data/error.log的最后部分,搜索A temporary password即可找到
my.cnf 关键配置项一定不能遗漏
在 AWS EC2 配置 MySQL 时,下面几个高频易错项尤其要重点关注,缺少任何一项都可能影响使用:
default_authentication_plugin=mysql_native_password—— 如果不添加这行,很多新建用户将无法正常连接;因为caching_sha2_password在不少 PHP、Python 等客户端环境里仍然需要额外适配character-set-server=utf8mb4+collation-server=utf8mb4_0900_ai_ci——utf8只是 MySQL 的一个“陷阱别名”,本质只支持 3 字节字符,存储 emoji 等内容时极易报错bind-address=0.0.0.0或指定具体内网 IP(例如172.31.16.10),不能留空,也不要写成127.0.0.1,否则 EC2 上的其他服务(如 SpringBoot 应用)将无法远程连接 MySQLmax_allowed_packet=1G需要显式调大,否则使用mysqldump导出大表时会直接中断,并提示错误:Packets larger than max_allowed_packet bytes are not allowed
MySQL 启动失败的常见原因与验证方法
执行 ./bin/mysqld_safe --defaults-file=/data/mysql8/3308/my_3308.cnf & 后,建议立即检查以下三处:
- 查看进程:
ps aux | grep mysqld—— 如果没有进程,说明 MySQL 启动被拒绝,通常是datadir权限错误,或者pid-file路径不可写导致 - 查看错误日志:
tail -50 /data/mysql8/3308/mysqldb-general.err—— 如果出现Can't start server: Bind on TCP/IP port,一般表示端口已被占用;如果出现Table 'mysql.plugin' doesn't exist,则说明初始化尚未完成就提前启动了服务 - 测试本地连接:
./bin/mysql -u root -p -S /data/mysql8/3308/mysql.sock—— 成功登录后,应立即执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_pass'; FLUSH PRIVILEGES;
最后还要先打通最基础的一层网络与授权配置:在 EC2 安全组中必须放行 3308(或你实际设置的 MySQL 端口);与此同时,数据库用户也必须显式授予远程访问权限:CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; GRANT ALL ON *.* TO 'app'@'%';。如果只是开放了安全组端口,却没有完成 MySQL 用户授权,看起来像是“端口已经通了”,实际上连接测试仍然会持续超时,这个问题在 AWS EC2 部署 MySQL 时尤其容易被忽视。
