在云服务器上部署 MySQL,虽然看似简单,但不同发行版(CentOS 和 Ubuntu)的包管理器和默认配置差异很大。很多新手直接 yum install 或 apt-get install 后遇到连接不上、版本不对或者安全组没开的问题。
下面我分别梳理 CentOS 7/8+ 和 Ubuntu 18.04/20.04/22.04 LTS 上的标准生产环境安装步骤。这里以目前主流的 MySQL 8.0 为例,因为它是当前各大云厂商推荐的主流版本。
一、 CentOS 系统安装 MySQL 8.0
CentOS 7 默认源里是 MySQL 5.7,而 CentOS 8 及以后版本默认源中移除了 MySQL(被 MariaDB 取代),所以必须使用官方提供的 YUM 仓库。
1. 清理旧环境(可选但推荐)
如果你之前装过 MySQL 或 MariaDB,建议先清理干净,避免冲突:
sudo yum remove mysql mysql-server mysql-libs mariadb mariadb-server -y
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/my.cnf
2. 添加 MySQL 官方 YUM 源
下载 MySQL 8.0 的 repo 文件并安装:
# 下载 repo 文件
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 安装 repo 文件
sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm -y
# 确认是否安装成功
yum repolist enabled | grep "mysql.*-community.*"
3. 安装 MySQL Server
sudo yum install mysql-community-server -y
注意:如果提示 GPG key 问题,可能需要先导入公钥,但通常 repo 文件里已经处理好了。
4. 启动服务并设置开机自启
sudo systemctl start mysqld
sudo systemctl enable mysqld
sudo systemctl status mysqld
5. 获取临时密码并修改 root 密码
MySQL 8.0 安装后会生成一个临时密码,记录在日志文件中:
grep 'temporary password' /var/log/mysqld.log
你会看到类似 A temporary password is generated for root@localhost: xxxxxx 的输出。
登录并修改密码:
mysql -u root -p
# 输入上面的临时密码
进入 MySQL 命令行后,执行以下 SQL 修改密码(MySQL 8.0 强制要求强密码策略):
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新强密码';
FLUSH PRIVILEGES;
exit;
提示:密码必须包含大小写字母、数字和特殊字符,长度至少 8 位。
6. 允许远程连接(关键步骤)
默认情况下,MySQL 只允许 localhost 连接。要允许外部 IP(包括你的本地电脑或 ECS 控制台)连接,需要创建新用户或修改 root 权限:
-- 创建允许任意 IP 访问的用户(推荐做法,不要直接改 root 的 host)
CREATE USER 'admin'@'%' IDENTIFIED BY 'AdminPassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;
7. 防火墙与安全组配置
这是最容易踩坑的地方!
-
服务器内部防火墙 (firewalld):
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent sudo firewall-cmd --reload -
云厂商安全组(阿里云/腾讯云/AWS等):
登录你的云控制台,找到该实例的安全组规则,入方向放行 TCP 协议的 3306 端口。如果不做这一步,即使 MySQL 配好了也连不上。
二、 Ubuntu 系统安装 MySQL 8.0
Ubuntu 的 APT 包管理器对 MySQL 的支持非常友好,流程相对简洁。
1. 更新软件包索引
sudo apt update
sudo apt upgrade -y
2. 安装 MySQL Server
sudo apt install mysql-server -y
注意:Ubuntu 20.04+ 默认安装的也是 MySQL 8.0。
3. 启动并检查服务
sudo systemctl start mysql
sudo systemctl enable mysql
sudo systemctl status mysql
4. 运行安全脚本
Ubuntu 安装后通常会提示运行 mysql_secure_installation 来加固安全:
sudo mysql_secure_installation
按照提示操作:
- 启用 VALIDATE PASSWORD COMPONENT(密码强度验证插件):选
Y。 - 移除匿名用户:选
Y。 - 禁止 root 远程登录?:这里要注意。如果你希望远程连接,选
N(No)。但为了安全,更推荐的做法是保留“禁止 root 远程登录”,然后创建一个专门用于远程连接的非 root 用户(见下文)。 - 移除 test 数据库:选
Y。 - 重新加载权限表:选
Y。
5. 配置远程访问
方法 A:修改配置文件(不推荐用于生产环境高安全场景)
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,找到 bind-address = 127.0.0.1,将其改为 bind-address = 0.0.0.0,然后重启 MySQL。
方法 B:创建专用远程用户(推荐,更安全)
sudo mysql
进入命令行后:
-- 查看现有用户
SELECT user, host FROM mysql.user;
-- 创建一个允许从任何主机连接的用户
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'YourStrongPassword123!';
-- 授权
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
exit;
注意:如果使用 Ubuntu 22.04 及以上版本,默认认证插件可能是 auth_socket,这会导致通过密码无法远程登录。确保创建用户时指定了密码认证方式,或者在创建时使用:
CREATE USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPassword123!';
6. 防火墙配置
Ubuntu 默认可能安装了 ufw 防火墙:
sudo ufw allow 3306/tcp
sudo ufw reload
同样,别忘了去云厂商控制台的安全组中放行 3306 端口。
三、 常见问题与避坑指南
-
连接报错
Host 'xxx' is not allowed to connect to this MySQL server- 原因:MySQL 内部权限未开放,或者云安全组未放行。
- 解决:检查上述“允许远程连接”步骤,并确保云控制台安全组已配置。
-
连接报错
Authentication plugin 'caching_sha2_password' cannot be loaded- 原因:客户端(如 Navicat、老旧 JDBC 驱动)不支持 MySQL 8.0 默认的
caching_sha2_password认证插件。 - 解决:将用户认证方式改回旧的
mysql_native_password:ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES;
- 原因:客户端(如 Navicat、老旧 JDBC 驱动)不支持 MySQL 8.0 默认的
-
内存不足导致 MySQL 启动失败
- 云服务器如果配置较低(如 1G 或 2G 内存),MySQL 默认配置可能占用过多内存。
- 解决:调整
/etc/my.cnf(CentOS) 或/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu),减小innodb_buffer_pool_size(例如设为 128M 或 256M),并适当增加 swap 分区。
-
数据目录权限问题
- 如果手动移动过数据目录,务必确保
chown -R mysql:mysql /var/lib/mysql,否则 MySQL 无法启动。
- 如果手动移动过数据目录,务必确保
总结
- CentOS:重点在于添加官方 YUM 源,处理临时密码,以及注意 firewalld 和安全组的双重限制。
- Ubuntu:重点在于
apt一键安装后的安全脚本配置,以及处理auth_socket和caching_sha2_password带来的兼容性问题。
无论哪种系统,云安全组放行 3306 端口 都是最容易被忽略却最关键的一步。建议在完成所有软件配置后,使用 telnet <公网IP> 3306 或 nc -zv <公网IP> 3306 测试端口连通性,再使用客户端工具连接。
云技术博客