在云服务器上部署 MySQL,看似是“一行命令”的事,但真要到了生产环境,坑其实不少。很多新手直接 apt install 或 yum install 完就开跑,结果遇到连接超时、字符集乱码、性能瓶颈甚至安全漏洞,排查起来非常头疼。
作为过来人,我建议你分两步走:基础安装和生产级优化配置。下面我以目前主流的 Ubuntu 20.04/22.04 和 CentOS 7/8 (Stream) 为例,梳理一套比较稳健的流程。
一、 核心原则:别用系统默认源里的旧版本
除非你是做开发测试,否则强烈不建议直接使用操作系统包管理器(apt/yum)安装的默认 MySQL 版本。
- Ubuntu 默认源可能还是 5.7 甚至更老。
- CentOS 8 已经移除了 MySQL,改用 MariaDB,或者你需要手动配第三方源。
最佳实践:使用 MySQL 官方提供的 APT/YUM 仓库,这样能拿到最新的稳定版(如 8.0.x),并且后续升级方便。
二、 Ubuntu 服务器部署指南
1. 添加官方仓库并安装
# 1. 更新软件包索引
sudo apt update
# 2. 安装依赖(如果没装过)
sudo apt install wget gnupg lsb-release
# 3. 下载 MySQL APT 配置工具
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb
# 4. 安装配置工具(交互式选择,通常保持默认即可,确保选中 MySQL Server 8.0)
sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb
# 5. 再次更新索引以识别新源
sudo apt update
# 6. 安装 MySQL Server
sudo apt install mysql-server
2. 初始安全加固(必做!)
安装完成后,MySQL 会自动启动。此时数据库是裸奔状态。运行以下命令进行初始化:
sudo mysql_secure_installation
这里会有几个关键交互点:
- Validate Password Component:建议开启,强制密码复杂度。
- Remove anonymous users:选 Y。
- Disallow root login remotely:选 Y(非常重要,禁止远程 root 登录)。
- Remove test database:选 Y。
- Reload privilege tables:选 Y。
3. 验证安装
mysql -u root -p
# 输入刚才设置的密码,如果能进入命令行,说明安装成功。
exit;
三、 CentOS 7/8 Stream 部署指南
CentOS 的情况稍微复杂一点,因为 CentOS 8 开始不再包含 MySQL 社区版 RPM 包。
1. 配置 YUM 源
去 MySQL Official Repo 找到适合你系统的链接。以 CentOS 7 为例:
# 下载并安装 repo 包
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 检查是否已启用(默认是启用的)
sudo yum repolist enabled | grep mysql
2. 安装 MySQL
sudo yum install mysql-community-server
3. 启动与开机自启
sudo systemctl start mysqld
sudo systemctl enable mysqld
sudo systemctl status mysqld
4. 获取临时密码并修改
CentOS 下 MySQL 8.0 首次安装会生成一个临时密码。查看日志:
grep 'temporary password' /var/log/mysqld.log
拿到密码后,登录并立即修改:
mysql -u root -p
# 输入临时密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!';
FLUSH PRIVILEGES;
exit;
然后同样运行 sudo mysql_secure_installation 进行安全加固。
四、 生产环境必须做的配置优化(这才是重点)
很多教程只讲到安装,但在云服务器上,如果不改配置文件,MySQL 往往跑得并不好,甚至不稳定。你需要编辑 /etc/mysql/mysql.conf.d/mysqld.cnf (Ubuntu) 或 /etc/my.cnf (CentOS)。
1. 字符集设置(解决中文乱码)
默认通常是 latin1,务必改为 utf8mb4。
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
2. 内存分配(关键!)
云服务器通常内存有限。如果你只有 2G 或 4G 内存,不要照搬物理机的大参数。
innodb_buffer_pool_size:这是最重要的参数。如果是独享 MySQL 的服务器,可以设置为总内存的 50%-70%。如果是混合部署(Web+DB),则需大幅降低,比如 256M 或 512M。max_connections:根据业务并发调整,默认 151,一般 Web 应用调到 500-1000 足够,太高会导致上下文切换开销过大。
3. 日志与慢查询
开启慢查询日志有助于后期优化 SQL:
slow_query_log = 1
long_query_time = 2 # 超过2秒的SQL记录到日志
slow_query_log_file = /var/log/mysql/slow.log
4. 绑定地址(允许远程访问)
默认 bind-address = 127.0.0.1 只允许本地连接。
- 安全警告:如果你需要外部程序(如本地 Navicat、其他服务器上的 Java 应用)连接,需要修改为
0.0.0.0。 - 更安全的做法:在云服务器的安全组(Security Group)中放行 3306 端口,并在 MySQL 内部创建专用用户授权,而不是直接给 root 授权。
-- 登录后执行
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON your_database.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
注意:% 表示允许任意 IP 连接,生产环境建议指定具体 IP 段,如 'app_user'@'10.0.0.%'。
五、 常见坑与避坑指南
-
防火墙问题:
- Ubuntu:
ufw allow 3306/tcp - CentOS:
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload - 别忘了云厂商控制台的安全组! 这是最容易忽略的一层,即使系统防火墙开了,云平台拦截了也没用。
- Ubuntu:
-
MySQL 8.0 的认证插件变化:
- MySQL 8.0 默认使用
caching_sha2_password。老旧的 JDBC 驱动(< 8.0.16)或某些 PHP 扩展可能不支持。 - 如果遇到连接错误,可以在配置文件中加一句:
default_authentication_plugin=mysql_native_password,或者在创建用户时指定。
- MySQL 8.0 默认使用
-
磁盘空间监控:
- MySQL 的 binlog 和 error log 可能会无限增长。配置
expire_logs_days或定期清理。 - 云服务器磁盘满了会导致 MySQL 崩溃且无法重启,务必挂载数据盘并将 datadir 指向大容量磁盘。
- MySQL 的 binlog 和 error log 可能会无限增长。配置
-
备份策略:
- 不要依赖自动快照代替数据库备份。
- 使用
mysqldump或 Percona XtraBackup 制定定时任务(cron),将备份文件上传到 OSS/S3 对象存储,实现异地容灾。
总结
在云服务器上装 MySQL,安装只是第一步。真正的功力体现在:
- 安全:禁用远程 root,使用强密码,最小权限原则。
- 规范:统一 utf8mb4 字符集。
- 调优:根据内存大小合理设置 buffer pool。
- 监控:关注慢查询和磁盘 IO。
按照这个流程走一遍,你的 MySQL 实例就能达到生产可用的标准了。如果有具体的报错信息,欢迎贴出来,我们可以针对性地看日志分析。
云技术博客