备份docker的数据库文件信息

bash 复制代码
#!/bin/bash

# 配置参数
CONTAINER_ID="*****"        # Docker 容器 ID
DB_USER="root"                     # MySQL 用户名
DB_PASSWORD="****"          # MySQL 密码
DB_NAME="***"                  # 需要备份的数据库名
BACKUP_DIR="/root/data_backup"      # 备份文件和日志的存放目录
BACKUP_FILE="customer_$(date +%Y%m%d).sql"  # 备份文件名
CONTAINER_BACKUP_PATH="/tmp/$BACKUP_FILE"  # 容器内临时备份路径
LOG_FILE="$BACKUP_DIR/mysql_backup.log"    # 日志文件
MAX_BACKUPS=10  # 最多保留的备份文件数

# 确保日志文件和备份目录存在
mkdir -p $BACKUP_DIR
touch $LOG_FILE

# 记录开始时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份数据库..." | tee -a $LOG_FILE

# 1️⃣ 在 Docker 容器内执行 `mysqldump` 备份
docker exec $CONTAINER_ID sh -c "mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $CONTAINER_BACKUP_PATH"
if [ $? -eq 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库备份成功:$CONTAINER_BACKUP_PATH" | tee -a $LOG_FILE
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ 数据库备份失败" | tee -a $LOG_FILE
    exit 1
fi

# 2️⃣ 复制备份文件到宿主机
docker cp $CONTAINER_ID:$CONTAINER_BACKUP_PATH $BACKUP_DIR/
if [ $? -eq 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份文件成功复制到宿主机:$BACKUP_DIR/$BACKUP_FILE" | tee -a $LOG_FILE
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ 备份文件复制失败" | tee -a $LOG_FILE
    exit 1
fi

# 3️⃣ 删除容器内的备份文件
docker exec $CONTAINER_ID rm -f $CONTAINER_BACKUP_PATH
if [ $? -eq 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 容器内临时备份文件删除成功" | tee -a $LOG_FILE
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 容器内临时备份文件删除失败,请手动检查" | tee -a $LOG_FILE
fi

# 4️⃣ 仅保留最新的 10 份备份文件,删除多余的
BACKUP_COUNT=$(ls -1 $BACKUP_DIR/customer_*.sql 2>/dev/null | wc -l)
if [ $BACKUP_COUNT -gt $MAX_BACKUPS ]; then
    DELETE_COUNT=$((BACKUP_COUNT - MAX_BACKUPS))
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份文件超过 $MAX_BACKUPS 份,正在删除最旧的 $DELETE_COUNT 份..." | tee -a $LOG_FILE
    ls -1t $BACKUP_DIR/customer_*.sql | tail -n $DELETE_COUNT | xargs rm -f
    if [ $? -eq 0 ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 旧备份文件删除成功" | tee -a $LOG_FILE
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ 旧备份文件删除失败,请检查" | tee -a $LOG_FILE
    fi
fi

# 5️⃣ 记录备份完成时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 数据库备份流程完成!" | tee -a $LOG_FILE
exit 0
相关推荐
ggaofeng14 分钟前
k8s中的dns
云原生·容器·kubernetes
草莓熊Lotso3 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
Lethehong9 小时前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
Web极客码9 小时前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
cspttty10 小时前
2027用户研究求职准备:应用统计学如何补齐研究设计与业务表达
大数据·数据库
roman_日积跬步-终至千里11 小时前
【数据Agent论文·查询与语义|05】Spider:为什么换一个数据库,模型就不会查了?
数据库·数据分析
猫咪很可爱11 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
我不会起名字32212 小时前
Redis 从 0 到 1(九):主库宕机 30 秒自动切主——1 主 2 从 3 哨兵 + Go 客户端
redis·docker·sentinel·高可用·哨兵
XLYcmy12 小时前
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 上
数据库·ai·chatgpt·文心一言·检索·知网·豆包
泡海椒12 小时前
JQuick-SQL 快速开始:注册内存表并执行查询
数据库·windows·sql