将mysql数据库的内容备份至阿里云 oss归档存储

将mysql数据库的内容备份至阿里云 oss归档存储

文章目录

要实现这个自动化备份流程,最推荐的方式是编写一个简单的 Shell 脚本 ,并利用 Linux 的 Cron 定时任务来执行。

由于你的环境涉及 MySQL 和 阿里云 OSS,我们需要用到两个核心工具:

  1. mysqldump: 用于导出数据库。
  2. 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 来设置每天自动运行脚本。

  1. 输入命令:crontab -e
  2. 在文件末尾添加以下一行(假设每天凌晨 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
相关推荐
大模型玩家七七10 小时前
向量数据库实战:从“看起来能用”到“真的能用”,中间隔着一堆坑
数据库·人工智能·python·深度学习·ai·oracle
OceanBase数据库官方博客10 小时前
基于分层协作多智能体的数据库参数调优——OceanBase 校企研究
数据库·oceanbase·分布式数据库
2301_7634724610 小时前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
爱学习的阿磊10 小时前
Web开发与API
jvm·数据库·python
阳光九叶草LXGZXJ10 小时前
达梦数据库-学习-50-分区表指定分区清理空洞率(交换分区方式)
linux·运维·数据库·sql·学习
Data_Journal10 小时前
【无标题】
大数据·服务器·前端·数据库·人工智能
qq_1927798710 小时前
Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
jvm·数据库·python
亚控科技10 小时前
超大型数据中心冷源群控升级:自主可控与智能调控的实践
数据库·智慧楼宇·kingscada·亚控科技·信创scada·大型数据中心
naruto_lnq10 小时前
NumPy入门:高性能科学计算的基础
jvm·数据库·python
Apple_羊先森10 小时前
ORACLE数据库巡检SQL脚本--4、检查锁阻塞
数据库·sql·oracle