将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
相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull6 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花6 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸6 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain6 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神7 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员7 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java7 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿7 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb