后端应用要读写数据,数据库是核心基础设施。本文记录在阿里云 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。不做备份就是给自己的数据判死刑。