在新购的 Linux 云服务器(如 CentOS/RHEL 8/9、Ubuntu 22.04/24.04 等)上安全、规范地部署 MySQL 数据库,建议按以下步骤操作(以 MySQL 官方社区版(推荐)或 Percona Server(生产增强版) 为主,不推荐使用系统默认的 MariaDB(除非明确需求))。以下以 Ubuntu 22.04 LTS 和 CentOS Stream 9 为例,提供通用、安全、可复现的部署指南:
✅ 一、前期准备(所有系统必做)
-
更新系统 & 安装基础工具
# Ubuntu/Debian sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget gnupg2 lsb-release software-properties-common # CentOS/RHEL/AlmaLinux/Rocky 9 sudo dnf update -y sudo dnf install -y curl wget gnupg2 dnf-plugins-core -
配置防火墙(启用并放行 MySQL 端口)
# Ubuntu (UFW) sudo ufw allow OpenSSH sudo ufw allow 3306 # 仅限内网/跳板机访问时才开放!生产环境强烈建议限制IP sudo ufw enable # CentOS/RHEL (firewalld) sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --permanent --add-port=3306/tcp --source=192.168.1.0/24 # ✅ 推荐:仅允许可信网段(如VPC内网) # 或更安全:不开放3306公网,通过SSH隧道访问 sudo firewall-cmd --reload
⚠️ 安全提醒:切勿将 3306 端口暴露在公网上! 生产环境应:
- 使用 VPC 内网部署应用与数据库;
- 通过 SSH 隧道(
ssh -L 3307:127.0.0.1:3306 user@db-server)或跳板机访问;- 后期配合云厂商安全组(Security Group)严格限制源 IP。
✅ 二、安装 MySQL(推荐官方 APT/YUM 仓库,非系统包)
▶ 方式 1:Ubuntu/Debian(使用 MySQL 官方 APT 仓库)
# 1. 下载并安装 MySQL APT 配置包(自动配置最新稳定版)
curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb
# ➤ 安装时选择:MySQL Server & Cluster → 选择 `mysql-8.0` → OK → Apply
sudo apt update
sudo apt install -y mysql-server
# 2. 启动并设为开机自启
sudo systemctl enable mysql
sudo systemctl start mysql
▶ 方式 2:CentOS/RHEL 9(使用 MySQL 官方 YUM 仓库)
# 1. 添加 MySQL 官方 YUM 仓库
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
# 2. 确保启用 mysql80-community(禁用其他版本如57)
sudo dnf config-manager --disable mysql57-community
sudo dnf config-manager --enable mysql80-community
# 3. 安装
sudo dnf install -y mysql-community-server
# 4. 启动
sudo systemctl enable mysqld
sudo systemctl start mysqld
✅ 验证安装:
mysql --version # 应显示 MySQL 8.0.x sudo systemctl status mysqld # 状态应为 active (running)
✅ 三、首次安全初始化(关键!)
MySQL 8.0+ 安装后会生成临时 root 密码,需运行 mysql_secure_installation 强化安全:
sudo mysql_secure_installation
按提示操作(推荐选项):
- Enter password for user root: 🔑 粘贴临时密码(查看日志:
sudo grep 'temporary password' /var/log/mysqld.log或sudo grep 'A temporary password' /var/log/mysqld.log) - New password for root: ✅ 设置强密码(至少8位,含大小写字母+数字+符号)
- Remove anonymous users? →
Y - Disallow root login remotely? →
Y(禁止远程 root 登录) - Remove test database and access to it? →
Y - Reload privilege tables now? →
Y
💡 补充:若执行报错
Can't connect to local MySQL server,先检查服务状态并尝试:sudo systemctl restart mysqld sudo grep 'temporary password' /var/log/mysqld.log
✅ 四、基础配置优化(/etc/mysql/my.cnf 或 /etc/my.cnf)
编辑主配置文件(备份后修改):
sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
sudo nano /etc/mysql/my.cnf
添加/修改以下关键项(适配你的服务器内存,例如 2GB RAM):
[mysqld]
# 基础安全
bind-address = 127.0.0.1 # ✅ 仅监听本地(应用同机部署时);如需内网访问,改为私有IP(如 192.168.1.100)
skip-networking = OFF # 确保启用网络(默认ON)
# 字符集(避免乱码)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# InnoDB 优化(重要)
innodb_buffer_pool_size = 512M # ≈ 总内存的 50%~75%(2GB机器建议512M~1G)
innodb_log_file_size = 128M
innodb_flush_log_at_trx_commit = 1 # 保证ACID,生产环境勿改0/2
# 其他实用设置
max_connections = 200
wait_timeout = 300
interactive_timeout = 300
log-error = /var/log/mysql/error.log
pid-file = /var/run/mysqld/mysqld.pid
# ✅ 开启慢查询日志(调试/优化用,生产可选)
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# ✅ 创建错误日志目录(如不存在)
# sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql
✅ 重启生效:
sudo systemctl restart mysql # Ubuntu
# 或
sudo systemctl restart mysqld # RHEL/CentOS
✅ 五、创建业务用户与数据库(禁止直接用 root 连接应用!)
# 登录 MySQL(使用刚设的 root 密码)
sudo mysql -u root -p
# 在 MySQL 中执行:
CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPass123!'; -- 同机应用
-- 或(内网其他服务器访问):
-- CREATE USER 'myapp_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
✅ 验证连接:
mysql -u myapp_user -p -D myapp
✅ 六、(可选但强烈推荐)启用远程备份与监控
-
自动备份脚本示例(每日凌晨2点备份到本地 + 上传至对象存储):
# /root/backup-mysql.sh #!/bin/bash DATE=$(date +%Y%m%d) mysqldump -u myapp_user -p'StrongPass123!' --single-transaction myapp | gzip > /backup/myapp_$DATE.sql.gz find /backup -name "myapp_*.sql.gz" -mtime +7 -delete加入 crontab:
0 2 * * * /root/backup-mysql.sh -
监控建议:部署
mytop、pt-query-digest(Percona Toolkit),或接入 Prometheus + mysqld_exporter。
🚫 常见错误规避清单
| 问题 | 原因 | 解决 |
|---|---|---|
Access denied for user 'root'@'localhost' |
临时密码未正确输入,或已过期 | 查日志重置:sudo mysqld_safe --skip-grant-tables & → 登录后 ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; |
Can't connect to local MySQL server |
服务未启动 / bind-address 错误 / SELinux 阻断(RHEL) | sudo systemctl status mysqld, sudo setsebool -P mysqld_connect_any on(如启用SELinux) |
| 中文乱码 | 字符集未统一 | 确保 my.cnf + 创建库/表时均指定 utf8mb4,连接时加 ?charset=utf8mb4 |
| 远程无法连接 | 防火墙/安全组未放行、bind-address 为 127.0.0.1、用户 host 不匹配 |
改 bind-address = 0.0.0.0(⚠️仅限可信内网)+ CREATE USER 'u'@'%' + 开放对应端口 |
✅ 最终验证清单(部署完成前逐项确认)
- [ ]
mysql --version输出 MySQL 8.x - [ ]
sudo systemctl is-active mysql→active - [ ]
sudo netstat -tlnp | grep :3306→ 显示监听(且地址非127.0.0.1时确认安全策略) - [ ]
mysql -u myapp_user -p -e "SELECT VERSION();"可成功执行 - [ ] 新建表插入中文数据无乱码
- [ ] 慢查询日志、错误日志路径可写且有内容
需要我为你:
- ✅ 生成完整自动化部署脚本(Bash + 参数化)?
- ✅ 提供 Docker 方式部署(轻量测试场景)?
- ✅ 配置主从复制/高可用(MHA / Orchestrator / MySQL Router)?
- ✅ 适配特定云平台(阿里云RDS兼容模式 / AWS EC2 / 腾讯云CVM)?
欢迎随时提出,我可以按需定制 👇
轻量云Cloud