Files
ragflow_python/asr-monitor-test/db_backup.sh

87 lines
2.7 KiB
Bash
Raw Normal View History

#!/bin/bash
# 腾讯云数据库同步脚本 (适配CynosDB)
# 安全增强版 - 支持SSL连接和错误处理
# 配置参数
LOCAL_DB="rag_flow"
CLOUD_DB="rag_flow"
BACKUP_DIR="./bk"
LOG_FILE="./bk/db/db_sync.log"
DATE=$(date +%Y%m%d%H%M)
# 腾讯云数据库信息
CLOUD_HOST="gz-cynosdbmysql-grp-0vwlm22l.sql.tencentcdb.com"
CLOUD_PORT="25317"
CLOUD_USER="cyx" # 替换为实际用户名
# 创建备份目录
mkdir -p $BACKUP_DIR
# 1. 获取本地数据库密码
LOCAL_PASS=$(docker exec ragflow-mysql printenv MYSQL_ROOT_PASSWORD)
if [ -z "$LOCAL_PASS" ]; then
echo "[ERROR] $(date) 无法获取本地数据库密码" >> $LOG_FILE
exit 1
fi
# 2. 从容器导出数据库
echo "开始导出数据库!!!!"
# 修改后的导出命令
docker exec ragflow-mysql sh -c \
"mysqldump -u root -p'$LOCAL_PASS' \
--single-transaction \
--routines \
--triggers \
--hex-blob \
--set-gtid-purged=OFF \
$LOCAL_DB" | \
sed -e 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' \
-e "s/ NOT NULL DEFAULT (uuid()) COMMENT '订阅ID'/ NOT NULL COMMENT '订阅ID'/" \
> $BACKUP_DIR/dump_$DATE.sql
# 检查导出结果
if [ $? -ne 0 ] || [ ! -s $BACKUP_DIR/dump_$DATE.sql ]; then
echo "[ERROR] $(date) 数据库导出失败" >> $LOG_FILE
exit 1
fi
echo "导出数据库结束!!!!"
# 3. 压缩备份
gzip $BACKUP_DIR/dump_$DATE.sql
BACKUP_SIZE=$(du -h $BACKUP_DIR/dump_$DATE.sql.gz | awk '{print $1}')
# 4. 从安全存储获取云数据库密码 (推荐方式)
# 使用密码管理器或在安全位置存储密码
CLOUD_PASS=$(cat ./bk/db/cloud_db_password.txt) # 替换为实际密码获取方式
# 5. 同步到腾讯云数据库 (强制SSL)
echo "同步到腾讯云数据库$CLOUD_HOST $CLOUD_PORT $CLOUD_USER $CLOUD_PASS $CLOUD_DB"
zcat $BACKUP_DIR/dump_$DATE.sql.gz | \
mysql -h $CLOUD_HOST -P $CLOUD_PORT -u $CLOUD_USER -p"$CLOUD_PASS" \
$CLOUD_DB
# 6. 错误处理
if [ $? -eq 0 ]; then
echo "[SUCCESS] $(date) 同步成功 | 大小: $BACKUP_SIZE" >> $LOG_FILE
else
ERROR_CODE=$?
echo "[ERROR] $(date) 同步失败! 错误码: $ERROR_CODE" >> $LOG_FILE
# 保留失败备份用于调试
mv $BACKUP_DIR/dump_$DATE.sql.gz $BACKUP_DIR/failed_dump_$DATE.sql.gz
# 添加详细错误信息
echo "[DEBUG] 错误详情: 可能原因 -" >> $LOG_FILE
case $ERROR_CODE in
1) echo "通用错误" >> $LOG_FILE ;;
2) echo "SQL语法错误" >> $LOG_FILE ;;
1045) echo "访问被拒绝 (用户/密码错误)" >> $LOG_FILE ;;
2003) echo "无法连接到数据库服务器" >> $LOG_FILE ;;
2026) echo "SSL连接问题" >> $LOG_FILE ;;
*) echo "未知错误" >> $LOG_FILE ;;
esac
fi
# 7. 清理旧备份保留7天
find $BACKUP_DIR -name "dump_*.gz" -mtime +7 -delete