verify_sync.sh 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/bin/bash
  2. # ===========================================
  3. # 统一身份认证同步结果校验脚本
  4. # ===========================================
  5. set -euo pipefail
  6. export LANG=C
  7. export LC_ALL=C
  8. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  9. CONFIG_FILE="${SCRIPT_DIR}/data.conf"
  10. [[ -f "$CONFIG_FILE" ]] || { echo "配置文件未找到"; exit 1; }
  11. source "$CONFIG_FILE"
  12. mysql_q() {
  13. python3 "${SCRIPT_DIR}/db_helper.py" \
  14. --host "$1" --port "$2" --user "$3" --password "$4" --database "$5" \
  15. scalar "$6" 2>/dev/null
  16. }
  17. oracle_counts() {
  18. if ! command -v sqlplus >/dev/null 2>&1; then
  19. echo "ERROR: 未找到 sqlplus,无法校验 Oracle 目标库" >&2
  20. return 1
  21. fi
  22. local conn="${TARGET_DB_USER}/${TARGET_DB_PASS}@${TARGET_ORACLE_CONNECT:-${TARGET_DB_HOST}:${TARGET_DB_PORT}/${TARGET_DB_NAME}}"
  23. sqlplus -S "$conn" <<'EOF'
  24. SET PAGESIZE 100
  25. SET LINESIZE 200
  26. SET HEADING OFF
  27. SET FEEDBACK OFF
  28. SET VERIFY OFF
  29. SELECT 'GXXX_YXSDWJBSJZL=' || COUNT(*) FROM GXXX_YXSDWJBSJZL;
  30. SELECT 'GXJG_JZGJCSJZLB=' || COUNT(*) FROM GXJG_JZGJCSJZLB;
  31. SELECT 'GXJG_GRTXFSZL=' || COUNT(*) FROM GXJG_GRTXFSZL;
  32. SELECT 'GXXS_XSJBSJZL=' || COUNT(*) FROM GXXS_XSJBSJZL;
  33. SELECT 'GXXS_GRTXZL=' || COUNT(*) FROM GXXS_GRTXZL;
  34. EXIT;
  35. EOF
  36. }
  37. echo "========== 统一身份认证同步校验 =========="
  38. echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
  39. echo ""
  40. # 源库统计
  41. SRC_DEPT=$(mysql_q "$SOURCE_DB_HOST" "$SOURCE_DB_PORT" "$SOURCE_DB_USER" "$SOURCE_DB_PASS" "$SOURCE_DB_NAME" "SELECT COUNT(*) FROM sys_dept;")
  42. SRC_TEACHER=$(mysql_q "$SOURCE_DB_HOST" "$SOURCE_DB_PORT" "$SOURCE_DB_USER" "$SOURCE_DB_PASS" "$SOURCE_DB_NAME" "SELECT COUNT(*) FROM sys_user WHERE account_type='1';")
  43. SRC_STUDENT=$(mysql_q "$SOURCE_DB_HOST" "$SOURCE_DB_PORT" "$SOURCE_DB_USER" "$SOURCE_DB_PASS" "$SOURCE_DB_NAME" "SELECT COUNT(*) FROM xg_student_msg WHERE deleted=0;")
  44. echo "[源库] sys_dept: ${SRC_DEPT}"
  45. echo "[源库] sys_user(教职工): ${SRC_TEACHER}"
  46. echo "[源库] xg_student_msg(有效): ${SRC_STUDENT}"
  47. echo ""
  48. if [[ "$TARGET_DB_TYPE" == "mysql" ]]; then
  49. TGT_DEPT=$(mysql_q "$TARGET_DB_HOST" "$TARGET_DB_PORT" "$TARGET_DB_USER" "$TARGET_DB_PASS" "$TARGET_DB_NAME" "SELECT COUNT(*) FROM GXXX_YXSDWJBSJZL;")
  50. TGT_TEACHER=$(mysql_q "$TARGET_DB_HOST" "$TARGET_DB_PORT" "$TARGET_DB_USER" "$TARGET_DB_PASS" "$TARGET_DB_NAME" "SELECT COUNT(*) FROM GXJG_JZGJCSJZLB;")
  51. TGT_TEACHER_TX=$(mysql_q "$TARGET_DB_HOST" "$TARGET_DB_PORT" "$TARGET_DB_USER" "$TARGET_DB_PASS" "$TARGET_DB_NAME" "SELECT COUNT(*) FROM GXJG_GRTXFSZL;")
  52. TGT_STUDENT=$(mysql_q "$TARGET_DB_HOST" "$TARGET_DB_PORT" "$TARGET_DB_USER" "$TARGET_DB_PASS" "$TARGET_DB_NAME" "SELECT COUNT(*) FROM GXXS_XSJBSJZL;")
  53. TGT_STUDENT_TX=$(mysql_q "$TARGET_DB_HOST" "$TARGET_DB_PORT" "$TARGET_DB_USER" "$TARGET_DB_PASS" "$TARGET_DB_NAME" "SELECT COUNT(*) FROM GXXS_GRTXZL;")
  54. TGT_ERR=$(mysql_q "$TARGET_DB_HOST" "$TARGET_DB_PORT" "$TARGET_DB_USER" "$TARGET_DB_PASS" "$TARGET_DB_NAME" "SELECT COUNT(*) FROM ZFTAL_XTGL_ERRLOG;")
  55. echo "[目标库] GXXX_YXSDWJBSJZL: ${TGT_DEPT}"
  56. echo "[目标库] GXJG_JZGJCSJZLB: ${TGT_TEACHER}"
  57. echo "[目标库] GXJG_GRTXFSZL: ${TGT_TEACHER_TX}"
  58. echo "[目标库] GXXS_XSJBSJZL: ${TGT_STUDENT}"
  59. echo "[目标库] GXXS_GRTXZL: ${TGT_STUDENT_TX}"
  60. echo "[目标库] ZFTAL_XTGL_ERRLOG: ${TGT_ERR}"
  61. echo ""
  62. echo "---------- 抽样数据对比 ----------"
  63. python3 "${SCRIPT_DIR}/db_helper.py" \
  64. --host "$TARGET_DB_HOST" --port "$TARGET_DB_PORT" \
  65. --user "$TARGET_DB_USER" --password "$TARGET_DB_PASS" --database "$TARGET_DB_NAME" \
  66. query "SELECT gh, xm, dwh, scbz FROM GXJG_JZGJCSJZLB LIMIT 3" 2>/dev/null
  67. python3 "${SCRIPT_DIR}/db_helper.py" \
  68. --host "$TARGET_DB_HOST" --port "$TARGET_DB_PORT" \
  69. --user "$TARGET_DB_USER" --password "$TARGET_DB_PASS" --database "$TARGET_DB_NAME" \
  70. query "SELECT xh, xm, dwh, szbh, scbz FROM GXXS_XSJBSJZL LIMIT 3" 2>/dev/null
  71. echo ""
  72. PASS=true
  73. [[ "$TGT_DEPT" -ge 1 ]] || { echo "WARN: 部门同步数量为0"; PASS=false; }
  74. [[ "$TGT_TEACHER" -ge 1 ]] || { echo "WARN: 教职工同步数量为0"; PASS=false; }
  75. [[ "$TGT_STUDENT" -ge 1 ]] || { echo "WARN: 学生同步数量为0"; PASS=false; }
  76. [[ "$TGT_TEACHER" == "$TGT_TEACHER_TX" ]] || echo "WARN: 教职工基础表与通讯表数量不一致"
  77. [[ "$TGT_STUDENT" == "$TGT_STUDENT_TX" ]] || echo "WARN: 学生基础表与通讯表数量不一致"
  78. if [[ "$PASS" == true ]]; then
  79. echo "校验结果: 通过(基础数据已写入)"
  80. exit 0
  81. else
  82. echo "校验结果: 未通过"
  83. exit 1
  84. fi
  85. elif [[ "$TARGET_DB_TYPE" == "oracle" ]]; then
  86. echo "[目标库 Oracle] 记录数:"
  87. ORACLE_OUT=$(oracle_counts) || { echo "校验结果: 未通过(sqlplus 失败)"; exit 1; }
  88. echo "$ORACLE_OUT"
  89. TGT_DEPT=$(echo "$ORACLE_OUT" | sed -n 's/.*GXXX_YXSDWJBSJZL=\([0-9][0-9]*\).*/\1/p' | head -1)
  90. TGT_TEACHER=$(echo "$ORACLE_OUT" | sed -n 's/.*GXJG_JZGJCSJZLB=\([0-9][0-9]*\).*/\1/p' | head -1)
  91. TGT_TEACHER_TX=$(echo "$ORACLE_OUT" | sed -n 's/.*GXJG_GRTXFSZL=\([0-9][0-9]*\).*/\1/p' | head -1)
  92. TGT_STUDENT=$(echo "$ORACLE_OUT" | sed -n 's/.*GXXS_XSJBSJZL=\([0-9][0-9]*\).*/\1/p' | head -1)
  93. TGT_STUDENT_TX=$(echo "$ORACLE_OUT" | sed -n 's/.*GXXS_GRTXZL=\([0-9][0-9]*\).*/\1/p' | head -1)
  94. echo ""
  95. echo "---------- 与源库对照 ----------"
  96. echo "部门: 源=${SRC_DEPT} 目标=${TGT_DEPT:-0}"
  97. echo "教职工: 源=${SRC_TEACHER} 目标=${TGT_TEACHER:-0} / 通讯=${TGT_TEACHER_TX:-0}"
  98. echo "学生: 源=${SRC_STUDENT} 目标=${TGT_STUDENT:-0} / 通讯=${TGT_STUDENT_TX:-0}"
  99. echo ""
  100. PASS=true
  101. [[ "${TGT_DEPT:-0}" -ge 1 ]] || { echo "WARN: 部门同步数量为0"; PASS=false; }
  102. [[ "${TGT_TEACHER:-0}" -ge 1 ]] || { echo "WARN: 教职工同步数量为0"; PASS=false; }
  103. [[ "${TGT_STUDENT:-0}" -ge 1 ]] || { echo "WARN: 学生同步数量为0"; PASS=false; }
  104. if [[ "$PASS" == true ]]; then
  105. echo "校验结果: 通过(Oracle 目标库已有数据)"
  106. exit 0
  107. else
  108. echo "校验结果: 未通过"
  109. exit 1
  110. fi
  111. else
  112. echo "不支持的目标库类型: $TARGET_DB_TYPE"
  113. exit 1
  114. fi