87 lines
2.7 KiB
Bash
87 lines
2.7 KiB
Bash
#!/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
|