背景

gp随着使用场景越来越多,数据量越来越大,需要增加查杀进程的优化脚本,防止连接数卡死的问题

gp连接监控及查询终止脚本

#!/bin/bash
# Greenplum连接监控及查询终止脚本

# 配置数据库连接参数
GPHOME=/home/gpadmin/greenplum-db
source $GPHOME/greenplum_path.sh

export PGUSER='gpadmin'          # 替换为实际管理账号
export PGDATABASE='youdata'      # 替换为监控数据库名
BACKUP_DIR="/home/${PGUSER}/mpp_stat_monitor"
LOG_FILE="${BACKUP_DIR}/mpp_conn_mon.log"
THRESHOLD=180                     # 设置最大连接阈值

# 获取有效用户连接数(排除系统进程)
active_conn=$(psql -t -A -c "SELECT COUNT(*)
FROM pg_stat_activity
WHERE usename NOT IN ('${PGUSER}', 'postgres') AND application_name NOT IN ( 'GPCMD',  'psql') ;")
mkdir -p ${BACKUP_DIR}

# 阈值判断与处理逻辑
if [ $active_conn -gt $THRESHOLD ]; then
    # 获取活动查询进程ID
    pids=$(psql -t -A -c "SELECT procpid
    FROM pg_stat_activity
    WHERE usename NOT IN ( '${PGUSER}', 'postgres' )
    AND NOT waiting ;")
    echo "$(date +"%Y-%m-%d %T") INFO: start to record proc" >> $LOG_FILE
    TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
    FILENAME="stat_${TIMESTAMP}.csv"
    psql -c "copy (select * from pg_stat_activity) TO '${BACKUP_DIR}/${FILENAME}' "

    # 终止所有活动查询
    for pid in $pids; do
        echo "$(date +"%Y-%m-%d %T") INFO: try to cancel backend $pid" >>$LOG_FILE
        psql -c "SELECT pg_terminate_backend($pid);" >/dev/null
    done

    # 记录审计日志
    echo "$(date +"%Y-%m-%d %T") WARNING: Connection surge detected ($active_conn). Terminated ${#pids[@]} active queries." >> $LOG_FILE
else
    echo "$(date +"%Y-%m-%d %T") INFO: Current connections: $active_conn" >> $LOG_FILE
fi

以上第一二行参数需要根据实际配置来更改,THRESHOLD=180的含义是连接数超过180之后,杀掉卡死的进程,并记录在日志文件中。

将这个脚本放在计划任务中,每分钟执行一次。