在新购的 Linux 云服务器(如 Ubuntu/Debian 或 CentOS/RHEL/Rocky/AlmaLinux)上部署 MySQL 数据库,需兼顾安全性、稳定性与生产可用性。以下是清晰、分步、推荐的部署指南(以主流发行版为例,重点标注关键注意事项):
✅ 一、前期准备(必做)
-
更新系统
# Ubuntu/Debian sudo apt update && sudo apt upgrade -y # CentOS/Rocky/AlmaLinux 8+ sudo dnf update -y # 或 CentOS 7 sudo yum update -y -
配置基础安全(强烈建议)
- 关闭或限制非必要端口(MySQL 默认
3306,仅允许信任 IP 访问):# 示例:仅允许本地及公司IP访问(替换 YOUR_IP) sudo ufw allow from YOUR_IP to any port 3306 sudo ufw allow from 127.0.0.1 to any port 3306 sudo ufw enable - 禁用 root 远程登录(后续通过普通用户 +
sudo或 SSH 跳转操作)
- 关闭或限制非必要端口(MySQL 默认
✅ 二、安装 MySQL(推荐官方 APT/YUM 源,避免老旧包)
▶ Ubuntu/Debian(推荐 MySQL 官方仓库)
# 1. 下载并安装 MySQL APT 配置工具(获取最新稳定版,如 8.0+)
wget 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-8.0"(回车确认),不要选 cluster 或 preview
sudo apt update
# 2. 安装 MySQL Server
sudo apt install mysql-server -y
# 3. 启动并设开机自启
sudo systemctl enable mysql
sudo systemctl start mysql
▶ CentOS/Rocky/AlmaLinux(使用 MySQL 官方 YUM 仓库)
# 1. 添加 MySQL 官方仓库(以 Rocky 9 为例)
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-r9-1.noarch.rpm -y
# 2. 启用 MySQL 8.0(禁用其他版本,如5.7)
sudo dnf config-manager --disable mysql57-community
sudo dnf config-manager --enable mysql80-community
# 3. 安装
sudo dnf install mysql-community-server -y
# 4. 启动并开机自启
sudo systemctl enable mysqld
sudo systemctl start mysqld
💡 为什么不用系统默认源?
Ubuntu/Debian 自带mariadb-server(兼容但非 MySQL);CentOS 默认无 MySQL,MariaDB 是替代品。生产环境若明确需要 MySQL,请务必使用 Oracle 官方源,确保功能、安全补丁和兼容性。
✅ 三、初始化安全配置(关键!)
运行交互式安全脚本(自动加固):
sudo mysql_secure_installation
按提示操作(强烈建议全部选 Y):
- 设置 root 密码(✅ 使用强密码,记录保存)
- 移除匿名用户(
Y) - 禁止 root 远程登录(
Y→ 后续用普通用户授权) - 删除 test 数据库(
Y) - 重载权限表(
Y)
🔒 注意:MySQL 8.0+ 默认认证插件为
caching_sha2_password(更安全),但部分旧客户端不兼容。如需兼容,可后续调整(见第五步)。
✅ 四、配置 MySQL(优化 & 远程访问)
编辑主配置文件(路径因版本略有差异):
# Ubuntu/Debian
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# CentOS/Rocky
sudo nano /etc/my.cnf.d/mysql-server.cnf
✨ 推荐修改项(在 [mysqld] 段内):
# 1. 允许远程连接(谨慎!确保防火墙已限制IP)
bind-address = 0.0.0.0 # 或指定内网IP(如 192.168.1.100)
# ⚠️ 生产环境绝不设为 0.0.0.0 + 开放防火墙!必须配合 ufw/firewalld 限制源IP
# 2. 字符集(避免中文乱码)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 3. 日志与性能(可选,按需调整)
log-error = /var/log/mysql/error.log
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 4. 内存优化(根据服务器内存调整,示例 2GB RAM)
innodb_buffer_pool_size = 512M
max_connections = 100
✅ 重启服务生效:
sudo systemctl restart mysql # Ubuntu/Debian
# 或
sudo systemctl restart mysqld # CentOS/Rocky
✅ 五、创建专用数据库用户(最佳实践!)
永不直接用 root 连接应用!
sudo mysql -u root -p
在 MySQL 命令行中执行:
-- 1. 创建数据库(替换 your_db_name)
CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 2. 创建专用用户(替换 'your_user' 和 'strong_password')
-- ✅ 仅允许从特定IP连接(更安全):
CREATE USER 'your_user'@'192.168.1.%' IDENTIFIED BY 'strong_password';
-- 或仅本地应用(推荐):
-- CREATE USER 'your_user'@'localhost' IDENTIFIED BY 'strong_password';
-- 3. 授权(最小权限原则)
GRANT SELECT, INSERT, UPDATE, DELETE ON your_db_name.* TO 'your_user'@'%';
-- 4. 刷新权限
FLUSH PRIVILEGES;
-- ✅ (MySQL 8.0+)如需兼容旧客户端,可改认证方式(非必须):
-- ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'strong_password';
✅ 六、验证连接
- 本地测试:
mysql -u your_user -p -D your_db_name - 远程测试(从另一台机器):
mysql -h 你的云服务器公网IP -u your_user -p -D your_db_name🔍 若失败:检查云服务商安全组(阿里云/腾讯云/AWS)是否放行
3306端口(仅限必要IP!)
✅ 七、(可选)启用自动备份
# 安装小工具
sudo apt install gzip -y # Ubuntu
# 创建备份脚本 /root/backup_mysql.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="your_db_name"
USER="your_user"
PASS="strong_password"
BACKUP_DIR="/backup/mysql"
mkdir -p $BACKUP_DIR
mysqldump -u$USER -p$PASS --single-transaction $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_$DATE.sql.gz
# 保留7天备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
添加定时任务:
sudo chmod +x /root/backup_mysql.sh
sudo crontab -e
# 添加(每天凌晨2点备份):
0 2 * * * /root/backup_mysql.sh
🚫 常见陷阱与避坑指南
| 问题 | 原因 | 解决 |
|---|---|---|
Access denied for user 'root'@'localhost' |
mysql_secure_installation 后 root 密码已变更 |
用 sudo mysql 本地免密登录,再 ALTER USER ... 修改 |
| 远程连接被拒 | ① bind-address 未改 ② 防火墙未开 ③ 云平台安全组未放行 |
三者逐项检查! |
| 中文乱码 | 未设置 utf8mb4 或客户端未指定字符集 |
配置文件 + 创建库/表时均指定 CHARACTER SET utf8mb4 |
| 应用连不上(MySQL 8.0+) | JDBC/PHP 默认不支持 caching_sha2_password |
在用户创建时用 IDENTIFIED WITH mysql_native_password,或升级驱动 |
✅ 最后一步:文档化
- 记录:root 密码、业务用户账号、数据库名、服务器IP、备份策略、配置文件路径
- 将
/etc/my.cnf*备份到本地:sudo tar -czf mysql-conf-backup.tar.gz /etc/mysql/ /etc/my.cnf*
如需进一步帮助,可提供:
- 你的 Linux 发行版及版本(
cat /etc/os-release) - 云平台(阿里云/腾讯云/AWS等)
- 是否需主从复制、读写分离、或 Docker 部署?
我可以为你定制完整脚本或 Ansible Playbook 👍
需要我帮你生成一键部署脚本(含安全加固)吗?
云知道CLOUD