努力
加油

在云服务器上如何正确安装MySQL数据库?

在云服务器上安装 MySQL,并没有一个放之四海而皆准的“标准答案”,因为它高度依赖于你选择的操作系统版本、业务场景以及你对运维复杂度的承受能力。

作为在一线摸爬滚打多年的开发者/运维,我通常会把方案分为三类:极简云托管版、传统源码/包管理安装版、以及容器化部署版。下面我从实战角度,把最常用且坑最少的路径拆解给你看。


一、 先做决策:你该选哪种方式?

  1. 如果你不想折腾运维(推荐新手或中小项目)
    • 方案:直接使用云厂商提供的 RDS(如阿里云 RDS、腾讯云 CDB)。
    • 理由:自动备份、高可用主从、监控报警全都有。虽然贵一点,但省下的排查故障时间远超那点钱。
  2. 如果你想省钱且掌握完全控制权(个人博客、测试环境、初创公司核心业务)
    • 方案:在 ECS/CVM 上手动安装 MySQL Community Edition。
    • 理由:免费、灵活、可深度调优。这也是本文重点讲解的内容。
  3. 如果你追求标准化和快速交付(微服务架构、CI/CD 流程中)
    • 方案:Docker + MySQL 镜像。
    • 理由:环境一致性最好,迁移方便,不会污染宿主机系统库。

二、 主流 Linux 发行版的“裸机”安装指南

假设你有一台纯净的 CentOS 7/8、Ubuntu 20.04/22.04 或 Debian 服务器。

1. Ubuntu/Debian 系列(APT 包管理)

Ubuntu 默认源里的 MySQL 版本可能较老,建议添加官方 Yum/Apt 源以获取最新稳定版(目前主流是 8.0+)。

# 1. 更新系统
sudo apt update && sudo apt upgrade -y

# 2. 安装依赖(如果需要下载 GPG key)
sudo apt install software-properties-common dirmngr apt-transport-https -y

# 3. 添加 MySQL APT Repository (以 Ubuntu 为例)
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb
# 注意:此时会弹出一个交互界面,选择 MySQL Server 8.0,确认即可

# 4. 再次更新并安装
sudo apt update
sudo apt install mysql-server -y

# 5. 启动并设置开机自启
sudo systemctl start mysql
sudo systemctl enable mysql

关键点: Ubuntu 默认使用 auth_socket 插件进行 root 认证,这意味着你不需要密码就能通过本地 socket 登录 root。这在开发环境很方便,但在生产环境需改为 mysql_native_password 或 caching_sha2_password 并设置强密码。

2. CentOS/RHEL 系列(YUM/DNF 包管理)

CentOS 7 比较特殊,默认仓库没有 MySQL,需要手动添加 repo。CentOS 8 及以上已转向 MariaDB 或需要额外配置。

# 1. 下载 MySQL YUM Repository
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 2. 安装 Repo
sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm

# 3. 验证是否启用正确版本
sudo yum repolist enabled | grep "mysql.*-community.*"

# 4. 安装 MySQL Server
sudo yum install mysql-community-server -y

# 5. 启动服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

关键点: MySQL 8.0 在安装过程中会在 /var/log/mysqld.log 生成一个临时随机密码。务必执行以下命令查看并记录:

sudo grep 'temporary password' /var/log/mysqld.log

拿到密码后,首次登录必须修改密码:

mysql -u root -p
# 输入临时密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword123!';

三、 安装后的“保命”配置清单

装好只是第一步,不配置好等于裸奔。以下是生产环境必须做的几件事:

1. 安全加固(Security Hardening)

执行 mysql_secure_installation 脚本(Linux 下通常会自动引导或手动运行):

  • VALIDATE PASSWORD COMPONENT:开启密码强度校验,拒绝弱口令。
  • Remove anonymous users:删除匿名用户。
  • Disallow root login remotely:严禁允许 root 远程登录!这是被爆破的最高频入口。
  • Remove test database:删除测试数据库。
  • Reload privilege tables:刷新权限表。

2. 网络与防火墙配置

云服务器默认只开放 22 (SSH) 端口。你需要在云控制台的安全组(Security Group)中放行 3306 端口。

  • 高危操作:直接对 0.0.0.0/0 开放 3306 端口。(除非你是XX或有其他安全措施,否则极易被扫描到并遭受勒索加密攻击。)
  • 正确做法:
    • 如果应用在同一台服务器:无需开放 3306,使用 localhost 连接。
    • 如果应用在其他服务器:仅允许特定应用服务器的私有 IP 访问 3306 端口。
    • 如果必须公网访问(极少情况):修改 MySQL 配置文件 my.cnf 中的 bind-address 为 0.0.0.0,并在 MySQL 内部创建专门用于远程连接的账号,限制其 host 为特定 IP 段。

3. 字符集与时区配置

避免乱码和时区偏差导致的诡异 Bug。编辑 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone = '+08:00' # 根据实际时区调整

重启服务生效:sudo systemctl restart mysql

4. 性能基础调优(针对小内存服务器)

很多云服务器内存只有 1G 或 2G,MySQL 默认配置可能会 OOM(内存溢出)。

在 my.cnf 中调整关键参数:

[mysqld]
# 根据物理内存调整,一般建议为总内存的 50%-70%
innodb_buffer_pool_size = 1G 

# 关闭不必要的日志,提升写入性能(若数据量不大可忽略)
# log_bin = off 

四、 Docker 方式(更现代的玩法)

如果你熟悉 Docker,这是最干净的安装方式,尤其适合多实例共存或频繁重装的场景。

# 1. 拉取镜像
docker pull mysql:8.0

# 2. 运行容器
docker run -d 
  --name mysql-prod 
  -p 3306:3306 
  -e MYSQL_ROOT_PASSWORD=YourStrongPassword123! 
  -v /data/mysql:/var/lib/mysql 
  -v /etc/mysql/conf.d:/etc/mysql/conf.d 
  mysql:8.0

优势:

  • 数据持久化在宿主机的 /data/mysql,容器销毁重建不丢数据。
  • 配置文件挂载,修改方便。
  • 随时可以 docker stop/start 或替换版本。

五、 常见踩坑与避坑指南

  1. 忘记密码怎么办?

    • 停止 MySQL 服务。
    • 以跳过权限表方式启动:mysqld_safe --skip-grant-tables &
    • 登录 MySQL,执行 FLUSH PRIVILEGES; 然后重置密码。
    • 警告:此方法有风险,仅限紧急情况,修复后务必重启正常模式。
  2. 连接报错 Client does not support authentication protocol

    • 这是 MySQL 8.0 默认使用 caching_sha2_password 而旧版客户端不支持导致的。
    • 解决:修改用户认证方式:
      ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
      FLUSH PRIVILEGES;
  3. 中文乱码

    • 检查数据库、表、字段三个层级的字符集是否都为 utf8mb4。
    • 检查 JDBC 连接串是否添加了 ?useUnicode=true&characterEncoding=UTF-8。
  4. 云服务器磁盘 IO 瓶颈

    • MySQL 是 IO 密集型应用。如果感觉慢,检查云盘的 IOPS 上限。如果是高并发场景,考虑将数据盘单独挂载并使用 SSD 云盘。

总结

对于大多数国内云服务器用户:

  • 求稳、求省心 -> 买云厂商 RDS。
  • 学习、低成本建站 -> Ubuntu/CentOS 原生安装,配好安全组和密码策略。
  • DevOps、微服务 -> Docker 部署。

无论哪种方式,定期备份(逻辑备份 mysqldump 或物理备份 XtraBackup)永远是最后的安全底线。不要相信任何“永久不坏”的承诺。