#!/bin/bash
CONTAINER_ID="***"
DB_USER="root"
DB_PASSWORD="***"
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
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
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
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
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
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
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
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 数据库结构和数据备份流程完成!" | tee -a $LOG_FILE
exit 0