| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #!/bin/bash
- # Production environment debug script for student status change scripts
- # This script helps diagnose MySQL output format issues
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
- CONFIG_FILE="${SCRIPT_DIR}/data.conf"
- if [[ ! -f "$CONFIG_FILE" ]]; then
- echo "错误:配置文件 $CONFIG_FILE 未找到!"
- exit 1
- fi
- source "$CONFIG_FILE"
- echo "=== 生产环境调试信息 ==="
- echo "时间: $(date)"
- echo "脚本目录: $SCRIPT_DIR"
- echo "SHELL: $SHELL"
- echo "BASH_VERSION: $BASH_VERSION"
- echo
- echo "=== MySQL版本信息 ==="
- mysql --version
- echo
- echo "=== 系统信息 ==="
- uname -a
- echo
- # Test basic connection
- echo "=== 测试数据库连接 ==="
- if mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "SELECT 1;" >/dev/null 2>&1; then
- echo "数据库连接成功"
- else
- echo "数据库连接失败"
- exit 1
- fi
- echo
- # Test query formats
- echo "=== 测试MySQL查询输出格式 ==="
- 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;"
- echo "查询SQL: $QUERY"
- echo
- echo "1. 标准mysql -e 输出 (可能包含表格格式):"
- echo "----------------------------------------"
- mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "$QUERY" 2>&1
- echo "----------------------------------------"
- echo
- echo "2. mysql -B 输出 (批量模式,无表格格式):"
- echo "----------------------------------------"
- mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" -B "$DB_NAME" -e "$QUERY" 2>&1
- echo "----------------------------------------"
- echo
- echo "3. mysql -ss 输出 (超静默模式):"
- echo "----------------------------------------"
- mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" -ss "$DB_NAME" -e "$QUERY" 2>&1
- echo "----------------------------------------"
- echo
- echo "=== 详细分析 -B 参数输出 ==="
- RESULT_B=$(mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" -B "$DB_NAME" -e "$QUERY" 2>&1)
- echo "原始输出 (包含警告):"
- echo "\"$RESULT_B\""
- echo
- echo "按行分割查看:"
- echo "$RESULT_B" | while IFS= read -r line; do
- echo "行: '$line'"
- done
- echo
- echo "过滤MySQL警告后的结果:"
- FILTERED_RESULT=$(echo "$RESULT_B" | grep -v "^mysql:" | grep -v "^$")
- echo "\"$FILTERED_RESULT\""
- echo
- echo "解析为变量 (使用tab分隔):"
- if [[ -n "$FILTERED_RESULT" ]]; then
- echo "$FILTERED_RESULT" | while IFS=$'\t' read -r record_id student_id student_no change_type operator_id; do
- echo "解析结果:"
- echo " record_id: '$record_id'"
- echo " student_id: '$student_id'"
- echo " student_no: '$student_no'"
- echo " change_type: '$change_type'"
- echo " operator_id: '$operator_id'"
- echo
- # Test if variables are numeric
- echo "变量类型检查:"
- echo " record_id 是数字: $([[ '$record_id' =~ ^[0-9]+$ ]] && echo '是' || echo '否')"
- echo " student_id 是数字: $([[ '$student_id' =~ ^[0-9]+$ ]] && echo '是' || echo '否')"
- echo " operator_id 是数字或空: $([[ -z '$operator_id' || '$operator_id' =~ ^[0-9]+$ ]] && echo '是' || echo '否')"
- echo
- # Simulate SQL construction
- echo "模拟SQL构造:"
- TEST_SQL="UPDATE xg_student_msg SET student_status = '2' WHERE id = '$student_id';"
- echo " $TEST_SQL"
- echo
- # Test SQL execution (dry run - just show what would be executed)
- echo "SQL执行测试 (仅显示,不实际执行):"
- echo " mysql -h'$DB_HOST' -P'$DB_PORT' -u'$DB_USER' -p'***' '$DB_NAME' -e \"$TEST_SQL\""
- done
- else
- echo "没有找到数据行,检查是否有待处理的记录"
- fi
- echo
- echo "=== 脚本兼容性检查 ==="
- # Check bash features
- echo "Bash特性检查:"
- echo " 支持pipefail: $(set -o | grep pipefail)"
- echo " 支持nounset: $(set -o | grep nounset)"
- echo
- echo "=== 环境变量检查 ==="
- echo "PATH: $PATH"
- echo "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH:-未设置}"
- echo
- echo "=== 建议的修复方案 ==="
- echo "如果上述解析失败,请尝试以下修改:"
- echo "1. 在脚本开头添加: export LANG=C"
- echo "2. 修改MySQL查询使用 -ss 参数而不是 -B"
- echo "3. 检查数据表中是否有实际的待处理记录"
- echo "4. 验证operator_id字段是否可能为NULL"
- echo
- echo "=== 调试完成 ==="
- echo "请将上述输出结果发送给开发人员"
|