阿里云ECS数据库部署与备份

星期二, 6月 23, 2026 | 3分钟阅读 | 更新于 星期二, 6月 23, 2026

@

后端应用要读写数据,数据库是核心基础设施。本文记录在阿里云 ECS 上部署 MySQL 和 Redis,以及最关键的自动备份方案。

一、MySQL 安装与配置

安装 MySQL 8.0

# 添加 MySQL 官方仓库
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 安装
yum install -y mysql-community-server

# 启动
systemctl enable mysqld
systemctl start mysqld

获取初始密码并修改

# MySQL 安装后自动生成临时密码
grep 'temporary password' /var/log/mysqld.log

# 安全初始化(改密码、删匿名用户、禁远程 root)
mysql_secure_installation

创建应用专用数据库和用户

CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';
FLUSH PRIVILEGES;

Spring Boot 连接配置

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/myapp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: myapp
    password: 强密码

安全组

MySQL 默认端口 3306,不要对外开放。应用在本地连接用 127.0.0.1,不暴露到公网。

二、Redis 安装与配置

yum install -y redis

# 配置密码
sed -i 's/# requirepass.*/requirepass 你的密码/' /etc/redis.conf

systemctl enable redis
systemctl start redis

Spring Boot 连接:

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 你的密码

Redis 端口 6379 同样不要对外开放

三、MySQL 自动备份

全量备份脚本

创建 /opt/scripts/mysql-backup.sh

#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backup/mysql"
DB_NAME="myapp"
DB_USER="myapp"
DB_PASS="你的密码"
RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"

# 备份
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" \
    | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"

# 删除 7 天前的备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "备份完成: ${DB_NAME}_${DATE}.sql.gz"

参数说明

参数作用
--single-transaction不锁表,适合 InnoDB
--routines包含存储过程和函数
--triggers包含触发器

配置 crontab 定时执行

chmod +x /opt/scripts/mysql-backup.sh
crontab -e

# 每天凌晨 3 点备份
0 3 * * * /opt/scripts/mysql-backup.sh >> /opt/backup/mysql/backup.log 2>&1

恢复备份

# 解压并恢复
gunzip < /opt/backup/mysql/myapp_20260623_030000.sql.gz | mysql -u root -p myapp

四、Redis 备份

Redis 有两种持久化方式:

方式原理特点
RDB快照,定期把内存数据写入磁盘文件小,恢复快,但可能丢最后几分钟数据
AOF追加写,记录每条写命令数据更安全,但文件大,恢复慢

配置 RDB + AOF 双保险

编辑 /etc/redis.conf

# RDB:每 5 分钟至少一个 key 变化就快照
save 300 1
save 60 100

# AOF:每秒刷盘
appendonly yes
appendfsync everysec

备份 RDB/AOF 文件

创建 /opt/scripts/redis-backup.sh

#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backup/redis"
REDIS_DIR="/var/lib/redis"

mkdir -p "$BACKUP_DIR"

# 触发一次 RDB 快照
redis-cli -a 你的密码 BGSAVE

# 等待快照完成
sleep 5

# 复制持久化文件
cp "$REDIS_DIR/dump.rdb" "$BACKUP_DIR/dump_${DATE}.rdb"
cp "$REDIS_DIR/appendonly.aof" "$BACKUP_DIR/appendonly_${DATE}.aof"

# 保留 3 天
find "$BACKUP_DIR" -mtime +3 -delete

echo "Redis 备份完成"

crontab:

0 4 * * * /opt/scripts/redis-backup.sh >> /opt/backup/redis/backup.log 2>&1

五、备份文件异地保存

备份只存在同一台服务器上有风险(服务器宕机就全没了)。

方案一:scp 到另一台服务器

# 在备份脚本末尾加上
scp "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz" user@备用服务器:/backup/

方案二:上传到阿里云 OSS

# 安装 ossutil
wget http://gosspublic.alicdn.com/ossutil/1.7.19/ossutil64
chmod +x ossutil64
./ossutil64 config  # 配置 AccessKey

# 在备份脚本中上传
./ossutil64 cp "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz" oss://my-backup-bucket/mysql/

OSS 价格极低(约 ¥0.12/GB/月),买几块钱就能存很久的备份。

方案三:GitHub Actions 定时拉取备份

利用现有 CI/CD 环境,在 GitHub Actions 中配置一个 cron workflow,定时 SSH 到 ECS 拉取备份文件到 GitHub 仓库(或 Artifact)。

六、定期恢复演练

备份的意义在于能恢复。建议每月做一次恢复演练:

# 在测试环境恢复最新备份
gunzip < myapp_20260623_030000.sql.gz | mysql -u root -p myapp_test

# 启动应用,验证数据完整性

七、数据库日常维护

# 查看数据库大小
mysql -u root -p -e "
    SELECT table_schema AS '数据库',
           ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS '大小(MB)'
    FROM information_schema.tables
    GROUP BY table_schema;
"

# 查看连接数
mysql -u root -p -e "SHOW PROCESSLIST;" | wc -l

# 查看慢查询
mysql -u root -p -e "SHOW VARIABLES LIKE 'slow_query%';"

开启慢查询日志:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;  -- 超过 2 秒的查询记录

总结

数据库运维三要素:

部署安装 → 自动备份 → 恢复演练

备份策略:MySQL 每天全量备份保留 7 天,Redis RDB+AOF 双持久化,备份文件异地存储到 OSS。不做备份就是给自己的数据判死刑。

© 2026 My Blog

🌱 Powered by Hugo with theme Dream.