#!/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