在新购的 Linux 云服务器(如 CentOS/RHEL 8/9、Ubuntu 20.04/22.04 等)上部署 MySQL 数据库,推荐使用 官方 MySQL APT/YUM 仓库安装(而非系统默认的 mariadb),以获得最新稳定版(如 MySQL 8.0+)、完整功能和官方支持。以下是详细、安全、生产就绪的部署步骤:
✅ 前提准备
-
登录服务器
ssh root@your_server_ip -
更新系统
# Ubuntu/Debian sudo apt update && sudo apt upgrade -y # CentOS/RHEL 8/9(启用 EPEL 可选,但 MySQL 官方源已足够) sudo dnf update -y # 或 yum update -y(RHEL/CentOS 7) -
关闭或配置防火墙(按需)
# Ubuntu(UFW) sudo ufw allow OpenSSH sudo ufw allow 3306 # 仅限内网/安全组放行时开启 sudo ufw enable # CentOS/RHEL(firewalld) sudo firewall-cmd --permanent --add-service=mysql sudo firewall-cmd --reload⚠️ 重要安全提示:切勿直接对公网开放 3306 端口!
→ 推荐方案:- 通过云平台「安全组」仅允许可信 IP(如公司办公 IP、跳板机 IP)访问 3306;
- 或使用 SSH 隧道连接(
ssh -L 3307:127.0.0.1:3306 user@server); - 生产环境建议禁用远程 root 登录,仅用应用专用账户 + 内网访问。
📦 步骤一:安装 MySQL(官方源,推荐)
▶ Ubuntu/Debian(以 22.04 为例)
# 1. 下载并安装 MySQL APT 配置工具(自动配置官方源)
cd /tmp
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 Server & Cluster → 按 Tab 切换,回车确认
# [✓] MySQL 8.0 → 回车确认(不选 5.7)
# [✓] Apply → 回车完成配置
# 2. 更新源并安装
sudo apt update
sudo apt install mysql-server -y
# 3. 启动并设为开机自启
sudo systemctl enable mysql
sudo systemctl start mysql
▶ CentOS/RHEL 8/9
# 1. 下载并安装 MySQL YUM 仓库
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el$(rpm -E '%{?rhel}%{!?rhel:%{?fedora}}')-1.noarch.rpm
# 2. 确认启用 MySQL 8.0(禁用 5.7/其他版本)
sudo dnf module reset mysql
sudo dnf module enable mysql:8.0
# 3. 安装 MySQL Server
sudo dnf install -y mysql-community-server
# 4. 启动并开机自启
sudo systemctl enable mysqld
sudo systemctl start mysqld
✅ 验证安装:
mysql --version # 应输出类似:mysql Ver 8.0.33 for Linux... sudo systemctl status mysqld # 状态应为 active (running)
🔐 步骤二:运行安全初始化(关键!)
MySQL 8.0+ 安装后会生成临时 root 密码,并启动 mysqld 服务。首次必须运行安全脚本:
sudo mysql_secure_installation
按提示操作(强烈建议全部选 Y):
- Enter password for user root: → 输入临时密码(查看方式见下文)
- 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
🔍 如何查找临时 root 密码?(若忘记)
sudo grep 'temporary password' /var/log/mysqld.log # RHEL/CentOS
sudo grep 'temporary password' /var/log/mysql/error.log # Ubuntu/Debian
🛠 步骤三:基础配置优化(/etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf # Ubuntu
# 或
sudo nano /etc/my.cnf # RHEL/CentOS(在 [mysqld] 段下添加)
✅ 推荐最小安全配置:
[mysqld]
# 1. 绑定地址(仅监听本地,禁止网络暴露)
bind-address = 127.0.0.1
# 若需内网其他机器访问(如应用服务器),改为:bind-address = 0.0.0.0,再配合防火墙限制IP!
# 2. 字符集(避免中文乱码)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 3. 默认加密(MySQL 8.0+ 推荐)
default_authentication_plugin = mysql_native_password # 兼容旧客户端(可选)
# 或更安全的:caching_sha2_password(推荐,但需客户端支持)
# 4. 日志(可选,便于排错)
log-error = /var/log/mysql/error.log
⚠️ 修改后重启:
sudo systemctl restart mysql
🧩 步骤四:创建应用数据库与用户(非 root!)
mysql -u root -p
-- 1. 创建数据库(指定字符集)
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 2. 创建专用用户(替换 'myapp_user' 和 'StrongPass123!')
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPass123!';
-- 3. 授予最小必要权限(不给 DROP/GRANT 等高危权限)
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'myapp_user'@'localhost';
-- 4. 如果应用服务器在另一台机器(如 10.0.1.100),则授权:
-- CREATE USER 'myapp_user'@'10.0.1.100' IDENTIFIED BY 'StrongPass123!';
-- GRANT ... ON myapp_db.* TO 'myapp_user'@'10.0.1.100';
-- 5. 刷新权限
FLUSH PRIVILEGES;
-- 6. 退出
EXIT;
✅ 测试连接(本地):
mysql -u myapp_user -p myapp_db
📌 补充建议(生产必备)
| 项目 | 建议 |
|---|---|
| 备份策略 | 使用 mysqldump + cron 定时备份到对象存储(如 COS/OSS/S3)0 2 * * * /usr/bin/mysqldump -u myapp_user -p'xxx' myapp_db | gzip > /backup/myapp_$(date +%F).sql.gz |
| 监控 | 部署 mysql-exporter + Prometheus + Grafana,或使用云厂商监控(如阿里云云监控) |
| SSL 加密 | 对外提供服务时,务必配置 SSL(生成证书并启用 require_secure_transport=ON) |
| 主从复制 | 高可用场景,配置异步/半同步复制(CHANGE REPLICATION SOURCE TO ...) |
| 参数调优 | 根据内存调整 innodb_buffer_pool_size(建议 RAM 的 50%-75%) |
❌ 常见错误速查
| 现象 | 解决方案 |
|---|---|
Can't connect to local MySQL server |
检查 systemctl status mysql;确认 bind-address 未被注释;检查 socket 路径是否正确 |
| 远程连接被拒 | 检查:① bind-address = 0.0.0.0;② 防火墙/安全组;③ 用户 host 是否为 'user'@'%';④ skip-networking 是否被启用 |
| 中文乱码 | 确保 my.cnf 中 character-set-server=utf8mb4 + 创建库/表时指定 CHARSET=utf8mb4 + 连接时加 ?charset=utf8mb4 |
✅ 至此,MySQL 已安全部署完成!
你已拥有:
✔ 官方最新稳定版(MySQL 8.0+)
✔ 强密码策略与最小权限原则
✔ 本地绑定 + 防火墙保护
✔ 应用专用账户与数据库
✔ 可扩展的备份与监控基础
如需进一步自动化(Ansible 脚本)、Docker 部署、或高可用架构(MHA/InnoDB Cluster),欢迎继续提问 👇
需要我为你生成一键部署脚本(Shell/Ansible)或配置备份/SSL 教程吗?
CLOUD云枢