#!/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 "请将上述输出结果发送给开发人员"