努力
加油

CentOS或Ubuntu云服务器如何正确安装和配置MySQL?

在云服务器上部署 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.%'。


五、 常见坑与避坑指南

  1. 防火墙问题:

    • Ubuntu: ufw allow 3306/tcp
    • CentOS: firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
    • 别忘了云厂商控制台的安全组! 这是最容易忽略的一层,即使系统防火墙开了,云平台拦截了也没用。
  2. MySQL 8.0 的认证插件变化:

    • MySQL 8.0 默认使用 caching_sha2_password。老旧的 JDBC 驱动(< 8.0.16)或某些 PHP 扩展可能不支持。
    • 如果遇到连接错误,可以在配置文件中加一句:default_authentication_plugin=mysql_native_password,或者在创建用户时指定。
  3. 磁盘空间监控:

    • MySQL 的 binlog 和 error log 可能会无限增长。配置 expire_logs_days 或定期清理。
    • 云服务器磁盘满了会导致 MySQL 崩溃且无法重启,务必挂载数据盘并将 datadir 指向大容量磁盘。
  4. 备份策略:

    • 不要依赖自动快照代替数据库备份。
    • 使用 mysqldump 或 Percona XtraBackup 制定定时任务(cron),将备份文件上传到 OSS/S3 对象存储,实现异地容灾。

总结

在云服务器上装 MySQL,安装只是第一步。真正的功力体现在:

  1. 安全:禁用远程 root,使用强密码,最小权限原则。
  2. 规范:统一 utf8mb4 字符集。
  3. 调优:根据内存大小合理设置 buffer pool。
  4. 监控:关注慢查询和磁盘 IO。

按照这个流程走一遍,你的 MySQL 实例就能达到生产可用的标准了。如果有具体的报错信息,欢迎贴出来,我们可以针对性地看日志分析。