当前位置: 首页 > article >正文

备份docker下的mysql的表结构,视图,函数 以及 指定表的数据

#!/bin/bash

# 配置参数
CONTAINER_ID="***"        # Docker 容器 ID
DB_USER="root"                     # MySQL 用户名
DB_PASSWORD="***"          # MySQL 密码
DB_NAME="***"                      # 需要备份的数据库名
TABLES="sys_***_function sys_***_config sys_***_config"  # 需要备份的特定表
BACKUP_DIR="/root/data_backup/crm"  # 备份文件存放目录
TIMESTAMP=$(date +%Y%m%d_%H%M%S)    # 统一的时间戳
BACKUP_FILE="crm_${TIMESTAMP}.sql"  # 备份文件名(精确到秒)
CONTAINER_BACKUP_PATH="/tmp/$BACKUP_FILE"  # 容器内临时备份路径
LOG_FILE="$BACKUP_DIR/mysql_backup.log"    # 备份日志文件
MAX_BACKUPS=30  # 最多保留的备份文件数

# 确保日志文件和备份目录存在
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 --no-data --routines --events --no-create-db $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️⃣ 备份指定表的数据
BACKUP_FILE_DATA="crm_${TIMESTAMP}_data.sql"  # 修改后的备份文件名
BACKUP_FILE_PATH="$BACKUP_DIR/$BACKUP_FILE_DATA"
CONTAINER_BACKUP_PATH_DATA="/tmp/$BACKUP_FILE_DATA"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份指定表的数据..." | tee -a $LOG_FILE
docker exec $CONTAINER_ID sh -c "mysqldump -u$DB_USER -p$DB_PASSWORD --no-create-db --no-create-info --routines --events $DB_NAME $TABLES > $CONTAINER_BACKUP_PATH_DATA"
if [ $? -eq 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 指定表数据备份成功:$CONTAINER_BACKUP_PATH_DATA" | tee -a $LOG_FILE
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ 指定表数据备份失败" | tee -a $LOG_FILE
    exit 1
fi

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

# 5️⃣ 删除容器内的临时备份文件
docker exec $CONTAINER_ID rm -f $CONTAINER_BACKUP_PATH
docker exec $CONTAINER_ID rm -f $CONTAINER_BACKUP_PATH_DATA
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

# 6️⃣ 仅保留最新的 30 份备份文件,删除多余的
# 删除 crm_*.sql 和 crm_*_data.sql 两类文件多余的备份文件
BACKUP_COUNT=$(ls -1 $BACKUP_DIR/crm_*.sql 2>/dev/null | wc -l)
BACKUP_COUNT_DATA=$(ls -1 $BACKUP_DIR/crm_*_data.sql 2>/dev/null | wc -l)
TOTAL_COUNT=$((BACKUP_COUNT + BACKUP_COUNT_DATA))

if [ $TOTAL_COUNT -gt $MAX_BACKUPS ]; then
    DELETE_COUNT=$((TOTAL_COUNT - MAX_BACKUPS))
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份文件超过 $MAX_BACKUPS 份,正在删除最旧的 $DELETE_COUNT 份..." | tee -a $LOG_FILE
    ls -1t $BACKUP_DIR/crm_*.sql | tail -n $DELETE_COUNT | xargs rm -f
    ls -1t $BACKUP_DIR/crm_*_data.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

# 7️⃣ 记录备份完成时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 数据库结构和数据备份流程完成!" | tee -a $LOG_FILE
exit 0


http://www.kler.cn/a/572947.html

相关文章:

  • 【代码分享】基于IRM和RRT*的无人机路径规划方法详解与Matlab实现
  • 阿里云 linux centos7安装nacos
  • GitLab Pages 托管静态网站
  • 试过了,多模态大模型Qwen/Qwen2.5-VL-3B-Instruct需要21G显存,我还是太天真啊!
  • 【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake
  • Java8-Stream流介绍和使用案例
  • 腾讯云账号获取SecretId和SecretKey及混元模型调用
  • Dify 开源大语言模型应用开发平台使用(一)
  • 快速开始React开发(一)
  • 【练习】【二叉树】力扣热题100 543. 二叉树的直径
  • Sourcetrail 代码分析工具
  • 生产制造业务的核心--全面质量管理人机料法环
  • 基于Matlab/Simulink永磁直驱风电低电压穿越(LVRT)控制仿真模型
  • Unity3D 布料模拟(Cloth Simulation)详解
  • uniapp x 学习之 uts 语言快速入门
  • 《DeepSeek从部署到安全分析实战》
  • 学习日记-250305
  • 2024 年 6 月大学英语四级考试真题(第 2 套)——解析版
  • Vue3 Suspense 终极指南:原理、用法与替代方案
  • 【Linux】使用问题汇总