prod_debug.sh 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/bin/bash
  2. # Production environment debug script for student status change scripts
  3. # This script helps diagnose MySQL output format issues
  4. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  5. CONFIG_FILE="${SCRIPT_DIR}/data.conf"
  6. if [[ ! -f "$CONFIG_FILE" ]]; then
  7. echo "错误:配置文件 $CONFIG_FILE 未找到!"
  8. exit 1
  9. fi
  10. source "$CONFIG_FILE"
  11. echo "=== 生产环境调试信息 ==="
  12. echo "时间: $(date)"
  13. echo "脚本目录: $SCRIPT_DIR"
  14. echo "SHELL: $SHELL"
  15. echo "BASH_VERSION: $BASH_VERSION"
  16. echo
  17. echo "=== MySQL版本信息 ==="
  18. mysql --version
  19. echo
  20. echo "=== 系统信息 ==="
  21. uname -a
  22. echo
  23. # Test basic connection
  24. echo "=== 测试数据库连接 ==="
  25. if mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "SELECT 1;" >/dev/null 2>&1; then
  26. echo "数据库连接成功"
  27. else
  28. echo "数据库连接失败"
  29. exit 1
  30. fi
  31. echo
  32. # Test query formats
  33. echo "=== 测试MySQL查询输出格式 ==="
  34. QUERY="SELECT id, student_id, student_no, change_type, operator_id FROM xg_student_status_change WHERE process_status = 0 AND change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE') AND deleted = 0 AND effective_date <= NOW() ORDER BY create_time ASC LIMIT 2;"
  35. echo "查询SQL: $QUERY"
  36. echo
  37. echo "1. 标准mysql -e 输出 (可能包含表格格式):"
  38. echo "----------------------------------------"
  39. mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "$QUERY" 2>&1
  40. echo "----------------------------------------"
  41. echo
  42. echo "2. mysql -B 输出 (批量模式,无表格格式):"
  43. echo "----------------------------------------"
  44. mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" -B "$DB_NAME" -e "$QUERY" 2>&1
  45. echo "----------------------------------------"
  46. echo
  47. echo "3. mysql -ss 输出 (超静默模式):"
  48. echo "----------------------------------------"
  49. mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" -ss "$DB_NAME" -e "$QUERY" 2>&1
  50. echo "----------------------------------------"
  51. echo
  52. echo "=== 详细分析 -B 参数输出 ==="
  53. RESULT_B=$(mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" -B "$DB_NAME" -e "$QUERY" 2>&1)
  54. echo "原始输出 (包含警告):"
  55. echo "\"$RESULT_B\""
  56. echo
  57. echo "按行分割查看:"
  58. echo "$RESULT_B" | while IFS= read -r line; do
  59. echo "行: '$line'"
  60. done
  61. echo
  62. echo "过滤MySQL警告后的结果:"
  63. FILTERED_RESULT=$(echo "$RESULT_B" | grep -v "^mysql:" | grep -v "^$")
  64. echo "\"$FILTERED_RESULT\""
  65. echo
  66. echo "解析为变量 (使用tab分隔):"
  67. if [[ -n "$FILTERED_RESULT" ]]; then
  68. echo "$FILTERED_RESULT" | while IFS=$'\t' read -r record_id student_id student_no change_type operator_id; do
  69. echo "解析结果:"
  70. echo " record_id: '$record_id'"
  71. echo " student_id: '$student_id'"
  72. echo " student_no: '$student_no'"
  73. echo " change_type: '$change_type'"
  74. echo " operator_id: '$operator_id'"
  75. echo
  76. # Test if variables are numeric
  77. echo "变量类型检查:"
  78. echo " record_id 是数字: $([[ '$record_id' =~ ^[0-9]+$ ]] && echo '是' || echo '否')"
  79. echo " student_id 是数字: $([[ '$student_id' =~ ^[0-9]+$ ]] && echo '是' || echo '否')"
  80. echo " operator_id 是数字或空: $([[ -z '$operator_id' || '$operator_id' =~ ^[0-9]+$ ]] && echo '是' || echo '否')"
  81. echo
  82. # Simulate SQL construction
  83. echo "模拟SQL构造:"
  84. TEST_SQL="UPDATE xg_student_msg SET student_status = '2' WHERE id = '$student_id';"
  85. echo " $TEST_SQL"
  86. echo
  87. # Test SQL execution (dry run - just show what would be executed)
  88. echo "SQL执行测试 (仅显示,不实际执行):"
  89. echo " mysql -h'$DB_HOST' -P'$DB_PORT' -u'$DB_USER' -p'***' '$DB_NAME' -e \"$TEST_SQL\""
  90. done
  91. else
  92. echo "没有找到数据行,检查是否有待处理的记录"
  93. fi
  94. echo
  95. echo "=== 脚本兼容性检查 ==="
  96. # Check bash features
  97. echo "Bash特性检查:"
  98. echo " 支持pipefail: $(set -o | grep pipefail)"
  99. echo " 支持nounset: $(set -o | grep nounset)"
  100. echo
  101. echo "=== 环境变量检查 ==="
  102. echo "PATH: $PATH"
  103. echo "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH:-未设置}"
  104. echo
  105. echo "=== 建议的修复方案 ==="
  106. echo "如果上述解析失败,请尝试以下修改:"
  107. echo "1. 在脚本开头添加: export LANG=C"
  108. echo "2. 修改MySQL查询使用 -ss 参数而不是 -B"
  109. echo "3. 检查数据表中是否有实际的待处理记录"
  110. echo "4. 验证operator_id字段是否可能为NULL"
  111. echo
  112. echo "=== 调试完成 ==="
  113. echo "请将上述输出结果发送给开发人员"