将mysql数据库的内容备份至阿里云 oss归档存储
文章目录
- [将mysql数据库的内容备份至阿里云 oss归档存储](#将mysql数据库的内容备份至阿里云 oss归档存储)
-
- 一、环境配置
-
- [1、安装 ossutil](#1、安装 ossutil)
- [2、配置 ossutil](#2、配置 ossutil)
- 3、安装mysql-clent
- 二、编写备份脚本
- 三、设置每日定时任务
- 四、其他
要实现这个自动化备份流程,最推荐的方式是编写一个简单的 Shell 脚本 ,并利用 Linux 的 Cron 定时任务来执行。
由于你的环境涉及 MySQL 和 阿里云 OSS,我们需要用到两个核心工具:
mysqldump: 用于导出数据库。ossutil: 阿里云官方提供的命令行工具,用于上传文件到 OSS。
-
加密算法:使用 AES-256-CBC 标准高强度加密。
-
流程:mysqldump导出 -> gzip压缩 -> OpenSSL加密 -> 保存并上传。
-
文件名:后缀改为 .sql.gz.enc,代表这是加密过的文件。
一、环境配置
1、安装 ossutil
在服务器上下载并安装阿里云 OSS 命令行工具。
bash
curl -o ossutil https://gosspublic.alicdn.com/ossutil/install.sh && sudo bash ossutil
2、配置 ossutil
运行配置命令,输入你提供的 AccessKey 等信息:
bash
ossutil config
# 根据提示输入:
# endpoint: http://oss-cn-hangzhou.xxxxxxx.com
# accessKeyId: LTAI5txxxxxxxxxxxxxxxxx
# accessKeySecret: bfRNOvcGafxxxxxxxxxxxxxxxxx
# srsToken : Enter 跳过
# 在将配置拷贝一份到root,后面执行定时任务需要
sudo cp ~/.ossutilconfig /root/
3、安装mysql-clent
bash
sudo apt install mysql-client
二、编写备份脚本
创建一个脚本文件,例如 /opt/backup_to_oss.sh:
bash
#!/bin/bash
# === 关键修正:开启管道错误检查,防止中间步骤出错不报错 ===
set -o pipefail
# ================= 配置区域 =================
# 数据库连接信息
DB_HOST="127.0.0.1"
DB_PORT="7010"
DB_USER="hzcx"
# 数据库密码
DB_PASS='hzcx@xxxxx'
DB_NAME="ai_pbl"
# === 加密密码 (已填入您的专用强密码) ===
ENCRYPT_PASSWORD='X7k9vM2pL5nQ8rxxxxxxxxx'
# 备份文件存放的临时本地目录
LOCAL_BACKUP_DIR="/tmp/mysql_backup"
# OSS 配置
OSS_BUCKET="hzcx-data-backup"
# 按月分类文件夹
OSS_PREFIX="aipbl/$(date +%Y-%m)"
# 获取当前日期
DATE_STR=$(date +%Y%m%d_%H%M%S)
# === 文件名增加 .enc 后缀 ===
BACKUP_FILENAME="${DB_NAME}_${DATE_STR}.sql.gz.enc"
# ================= 执行逻辑 =================
# 1. 创建本地临时目录
mkdir -p $LOCAL_BACKUP_DIR
echo "[$(date)] 开始备份数据库: $DB_NAME (加密模式)..."
# 2. 导出 -> 压缩 -> 加密
# 注意:这里沿用了您提供的 host/port 连接方式
mysqldump -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" \
--single-transaction --set-gtid-purged=OFF --no-tablespaces \
"$DB_NAME" | \
gzip | \
openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -salt -pass pass:"$ENCRYPT_PASSWORD" \
> "$LOCAL_BACKUP_DIR/$BACKUP_FILENAME"
# 检查导出及加密是否成功
if [ $? -ne 0 ]; then
echo "[$(date)] ❌ 错误: 数据库导出或加密失败!"
# 删除可能存在的损坏文件
rm -f "$LOCAL_BACKUP_DIR/$BACKUP_FILENAME"
exit 1
fi
echo "[$(date)] ✅ 数据库备份并加密成功 (大小: $(du -h "$LOCAL_BACKUP_DIR/$BACKUP_FILENAME" | cut -f1)),准备上传..."
# 3. 上传到阿里云 OSS
ossutil cp "$LOCAL_BACKUP_DIR/$BACKUP_FILENAME" "oss://${OSS_BUCKET}/${OSS_PREFIX}/${BACKUP_FILENAME}"
if [ $? -eq 0 ]; then
echo "[$(date)] ✅ 上传成功: oss://${OSS_BUCKET}/${OSS_PREFIX}/${BACKUP_FILENAME}"
# 4. 删除本地临时文件
rm -f "$LOCAL_BACKUP_DIR/$BACKUP_FILENAME"
echo "[$(date)] 本地清理完成。"
else
echo "[$(date)] ❌ 错误: 上传 OSS 失败!"
exit 1
fi
echo "[$(date)] 任务全部完成。"
三、设置每日定时任务
使用 crontab 来设置每天自动运行脚本。
- 输入命令:
crontab -e - 在文件末尾添加以下一行(假设每天凌晨 00:00 执行):
bash
00 00 * * * /bin/bash /opt/backup_to_oss.sh >> /var/log/db_backup.log 2>&1
四、其他
1.关键点说明
-
安全性 : 脚本中包含明文密码。建议确保该脚本文件权限为
600(chmod 600 /home/backup_to_oss.sh),仅限 root 或特定用户查看。 -
网络: 确保你的服务器能够访问外网(或通过阿里云内网 endpoint 访问 OSS,速度更快且免流量费)。
-
优化提示 :如果在阿里云 ECS 上,建议将 endpoint 改为
oss-cn-hangzhou-internal.aliyuncs.com。 -
数据完整性 : 使用了
gzip压缩,可以大幅减少上传时间并节省 OSS 存储空间。
2.查询数据库大小
注:查询数据库表大小。
bash
sudo docker exec mysql-aipbl mysql -u hzcx -phzcx@qwe2026 -e "SELECT table_name, table_rows, round(((data_length + index_length) / 1024 / 1024), 2) as 'Size (MB)' FROM information_schema.TABLES WHERE table_schema = 'ai_pbl' ORDER BY table_rows DESC;"
3.恢复加密后的数据
bash
# 命令格式:
# openssl 解密 -> gunzip 解压 -> 还原为 sql 文件
openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -pass pass:'您的密码' -in backup.sql.gz.enc | gunzip > recovered.sql