This commit is contained in:
HuangHai
2026-02-05 15:55:17 +08:00
parent 4592b0da6f
commit 4712967fbe
88 changed files with 4768 additions and 219 deletions

View File

@@ -1,36 +1,21 @@
#!/bin/bash
# 环境变量补丁
# 环境变量补丁 (针对 Crontab 环境下可能找不到 java 的问题)
export PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
[ -f /etc/profile ] && . /etc/profile
[ -f ~/.bash_profile ] && . ~/.bash_profile
[ -f ~/.profile ] && . ~/.profile
# 检查参数
TARGET=$1
if [ "$TARGET" != "doris" ] && [ "$TARGET" != "mysql" ]; then
echo "使用方法: $0 [doris|mysql]"
exit 1
fi
# 配置文件
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
CONF_DIR="$SCRIPT_DIR/json"
CONFIG_FILE="$SCRIPT_DIR/db_config.sh"
# 加载数据库配置
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
echo "错误: 找不到配置文件 $CONFIG_FILE"
exit 1
fi
# 配置路径
DATAX_HOME="/usr/local/datax"
# 获取当前脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# JSON配置文件目录指向 json_inc
CONF_DIR="$SCRIPT_DIR/json_inc"
BIN_DIR="$DATAX_HOME/bin"
DATAX_PY="$BIN_DIR/datax.py"
# 明确指定要执行的15个文件
# 明确指定要执行的15个文件(增量同步)
JOBS=(
"t_equipment_charge_order.json"
"t_equipment_charge_order_detail.json"
@@ -49,29 +34,22 @@ JOBS=(
"t_user_upload_fault.json"
)
# 日志配置
LOG_DIR="$SCRIPT_DIR/logs"
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR"
fi
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="$LOG_DIR/run_inc_${TARGET}_${TIMESTAMP}.log"
echo "日志将同时记录到: $LOG_FILE"
# 定义全局参数
PARAMS="-Dsrc_user=ylt -Dsrc_pwd=Ycharge666 -Dsrc_jdbc=jdbc:mysql://rm-bp1ux6tuk49er80t9xo.mysql.rds.aliyuncs.com:3306/yltcharge -Ddest_user=root -Ddest_pwd=DsideaL147258369 -Ddest_load_url=192.168.10.250:8030 -Ddest_jdbc=jdbc:mysql://192.168.10.250:9030/yltcharge"
# 根据目标设置参数
if [ "$TARGET" == "doris" ]; then
DEST_PARAMS="$DORIS_DEST_PARAMS"
TITLE="MySQL -> Doris Incremental Sync"
else
DEST_PARAMS="$MYSQL_DEST_PARAMS"
TITLE="MySQL -> MySQL Incremental Sync"
fi
# 在脚本最开始记录开始时间
SCRIPT_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
SCRIPT_START_TIMESTAMP=$(date +%s)
echo "DataX增量同步脚本 ($TITLE)"
echo "DataX增量同步脚本 (Incremental Sync)"
echo "=========================="
echo "DataX路径: $DATAX_PY"
echo "配置文件目录: $CONF_DIR"
echo "任务数量: ${#JOBS[@]}"
echo "脚本开始时间: $SCRIPT_START_TIME"
echo "注意: 增量模式下不执行 Truncate,请确保目标表为 Unique Key 模型以实现 Upsert 效果"
echo "策略: 每次同步最近10000条数据(按ID倒序),利用Doris主键机制自动覆盖更新"
echo "=========================="
# 切换到配置文件目录
@@ -80,49 +58,127 @@ cd "$CONF_DIR" || {
exit 1
}
echo "当前目录: $(pwd)"
echo
# 执行计数器
SUCCESS_COUNT=0
FAIL_COUNT=0
TOTAL=${#JOBS[@]}
CURRENT=0
# 数组存储每个任务的执行详情
declare -a TASK_RESULTS=()
declare -a TASK_DURATIONS=()
declare -a TASK_STATUSES=()
for JOB in "${JOBS[@]}"; do
TABLE_NAME="${JOB%.json}"
echo "任务 [$((SUCCESS_COUNT + FAIL_COUNT + 1))/$TOTAL] $JOB"
CURRENT=$((CURRENT + 1))
# 动态构造增量 SQL:按 id 倒序取 1000 条
QUERY_SQL="SELECT * FROM $TABLE_NAME ORDER BY id DESC LIMIT 1000"
# 增量模式下 preSql 为空(不清空目标表)
PRE_SQL=""
echo "任务 [$CURRENT/$TOTAL] $JOB"
echo "任务开始时间: $(date '+%H:%M:%S')"
echo "----------------------------------------"
PARAMS="$SRC_BASE_PARAMS $DEST_PARAMS -Dsrc_query_sql=\"$QUERY_SQL\" -Ddest_pre_sql=\"$PRE_SQL\""
# 检查文件是否存在
if [ ! -f "$JOB" ]; then
echo "✗ 错误: 文件不存在 - $JOB"
FAIL_COUNT=$((FAIL_COUNT + 1))
TASK_RESULTS+=("$JOB")
TASK_STATUSES+=("文件不存在")
TASK_DURATIONS+=("0")
echo "----------------------------------------"
continue
fi
# 记录开始时间(用于计算耗时)
START_TIME=$(date +%s)
/usr/bin/python "$DATAX_PY" -p "$PARAMS" "$JOB" 2>&1 | tee -a "$LOG_FILE"
EXIT_CODE=${PIPESTATUS[0]}
# 执行任务 (添加 -p 参数传递变量)
/usr/bin/python "$DATAX_PY" -p "$PARAMS" "$JOB"
EXIT_CODE=$?
# 计算耗时
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
# 保存任务详情
TASK_RESULTS+=("$JOB")
TASK_DURATIONS+=("$DURATION")
# 处理执行结果
if [ $EXIT_CODE -eq 0 ]; then
echo "✓ 成功: $JOB (耗时: ${DURATION}秒)"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
TASK_STATUSES+=("成功")
else
echo "✗ 失败: $JOB (耗时: ${DURATION}秒)"
echo "错误代码: $EXIT_CODE"
FAIL_COUNT=$((FAIL_COUNT + 1))
TASK_STATUSES+=("失败")
# 增量任务通常无人值守,失败不暂停
fi
echo "任务结束时间: $(date '+%H:%M:%S')"
echo "----------------------------------------"
echo
# 可选:任务间等待时间(秒)
# sleep 1
done
# 记录脚本结束时间
SCRIPT_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
SCRIPT_END_TIMESTAMP=$(date +%s)
TOTAL_DURATION=$((SCRIPT_END_TIMESTAMP - SCRIPT_START_TIMESTAMP))
echo "=========================="
echo "执行结果汇总 (Incremental Sync to $TARGET)"
echo "执行结果汇总 (Incremental Sync)"
echo "=========================="
echo "脚本开始时间: $SCRIPT_START_TIME"
echo "脚本结束时间: $SCRIPT_END_TIME"
echo "脚本总耗时: ${TOTAL_DURATION}秒"
echo "=========================="
echo "任务执行详情:"
echo "----------------------------------------"
# 输出每个任务的执行结果
for i in "${!TASK_RESULTS[@]}"; do
STATUS_ICON="✓"
if [ "${TASK_STATUSES[$i]}" = "失败" ] || [ "${TASK_STATUSES[$i]}" = "文件不存在" ]; then
STATUS_ICON="✗"
fi
printf "%-40s %-2s %-10s %-8s秒\n" \
"${TASK_RESULTS[$i]}" \
"$STATUS_ICON" \
"${TASK_STATUSES[$i]}" \
"${TASK_DURATIONS[$i]}"
done
echo "----------------------------------------"
echo "汇总统计:"
echo "总任务数: $TOTAL"
echo "成功: $SUCCESS_COUNT"
echo "失败: $FAIL_COUNT"
if [ $TOTAL -gt 0 ]; then
SUCCESS_RATE=$((SUCCESS_COUNT * 100 / TOTAL))
echo "成功率: ${SUCCESS_RATE}%"
fi
# 计算平均耗时
if [ ${#TASK_DURATIONS[@]} -gt 0 ]; then
TOTAL_TASK_TIME=0
VALID_TASKS=0
for duration in "${TASK_DURATIONS[@]}"; do
if [ "$duration" -gt 0 ]; then
TOTAL_TASK_TIME=$((TOTAL_TASK_TIME + duration))
VALID_TASKS=$((VALID_TASKS + 1))
fi
done
if [ $VALID_TASKS -gt 0 ]; then
AVG_DURATION=$((TOTAL_TASK_TIME / VALID_TASKS))
echo "平均任务耗时: ${AVG_DURATION}秒"
fi
fi
echo "=========================="