GBase 8a
运维管理
文章
精选

如何查看当前所有已连接的用户会话?如何安全地终止一个疑似异常或占用资源过多的会话?

发表于2026-03-27 10:11:4028次浏览3个评论

查看和管理GBase 8a用户会话是日常运维的核心操作。以下是具体的方法和步骤。

一、查看当前所有已连接的用户会话

主要有两种标准方法,推荐使用第二种以获得更详细的信息。

方法1:使用 SHOW PROCESSLIST 命令(基础视图)

这是最快捷的方式,显示当前连接到执行该命令的协调节点上的所有线程。

 

SHOW PROCESSLIST;

输出示例

| Id  | User | Host                  | db   | Command | Time | State               | Info                                   |
|-----|------|-----------------------|------|---------|------|---------------------|----------------------------------------|
| 1   | root | localhost             | NULL | Daemon  | 1051446 | Waiting for event lock | NULL                                   |
| 5593| root | localhost             | ssbm | Query   | 4    | Sending task to gnodes | insert into t1 select * from t1        |
| 5506| root | 172.16.4.142:44668    | ssbm | Sleep   | 301  | NULL                | NULL                                   |

关键字段

  • Id会话连接ID,是后续管理操作(如KILL)的关键标识。
  • User:连接用户名。
  • Host:客户端IP和端口。
  • Time:会话/查询已运行的时间(秒)。
  • State:当前状态(如 Sleep 空闲,Query 执行中)。
  • Info:正在执行的SQL语句(如果为空或NULL,则表示会话空闲)。

方法2:查询 information_schema.processlist 系统视图(推荐)

此方法功能更强大,可以过滤和排序,是运维分析的首选。

SELECT * FROM information_schema.processlist;
-- 或使用更精确的查询
SELECT id, user, host, db, command, time, state, info 
FROM information_schema.processlist 
WHERE command != 'Sleep' -- 过滤掉空闲连接
ORDER BY time DESC; -- 按运行时间降序排列,快速找到长耗时会话

优势:可以使用 WHERE 子句进行过滤(如找特定用户、运行时间长的会话),便于定位问题。

二、安全地终止异常或占用资源过多的会话

终止会话的核心命令是 KILL。根据不同的异常情况,必须谨慎选择终止模式,以最小化对业务的影响。

步骤1:精准定位目标会话

在终止前,务必确认目标会话的 Id 和当前状态。

-- 示例:查找运行时间超过5分钟的非空闲会话
SELECT id, user, time, state, info 
FROM information_schema.processlist 
WHERE command = 'Query' AND time > 300 
ORDER BY time DESC;

步骤2:根据场景选择合适的终止命令

终止场景推荐命令作用与影响适用情况
终止整个会话连接

KILL CONNECTION <thread_id>; 
KILL <thread_id>; (默认)

 

断开客户端与数据库的连接,回滚该连接未提交的事务,释放所有相关资源。会话完全僵死、无法交互、或确认需要彻底断开。影响最大
仅终止当前正在执行的查询KILL QUERY <thread_id>;只中止当前正在执行的SQL语句,但保持数据库连接本身不断开。某个复杂查询占用过多资源(CPU/内存),但希望用户连接保持,以便执行其他查询。影响较小
暂停与恢复(GBase 8a特有)PAUSE <thread_id>; 
CONTINUE <thread_id>;
暂停一个正在执行的查询,稍后可恢复执行。临时缓解资源压力进行诊断,或进行优先级调度。

语法

-- 语法
KILL [CONNECTION | QUERY] thread_id;
-- 示例:终止ID为5593的会话
KILL 5593;

步骤3:执行终止并验证

-- 假设要终止ID为 5593 的会话
KILL 5593;
-- 或仅终止其当前查询
KILL QUERY 5593;

-- 再次查看,确认会话已消失或状态改变
SHOW PROCESSLIST;

三、关键注意事项与最佳实践

  1. 权限要求
    • 查看所有会话需要 PROCESS 权限。
    • 执行 KILL 命令通常需要 SUPER 或同等高级权限。
  2. 终止前的检查清单
    • 确认会话状态State 是否为 Sending dataSorting result 等,表明正在执行。
    • 查看SQL内容Info 字段是否显示为异常循环或笛卡尔积等低效查询。
    • 评估影响:如果是业务关键连接,尝试联系应用负责人后再操作。
  3. 预防与监控
    • 设置资源池:通过资源管理功能限制单个查询的资源使用,避免单个会话拖垮集群。
    • 配置SQL超时:在资源池中设置 task_running_timeout,自动终止长时间运行的查询。
    • 使用GDOM监控:通过运维管理系统的“集群运行信息 -> 会话信息”模块进行可视化监控和操作。

       

  4. 多VC环境:如果集群有多个虚拟集群,需要先切换到对应的VC再查看和操作会话。

     

    USE VC vc_name;
    SHOW PROCESSLIST;
    

总结:安全终止会话的黄金法则是 “先诊断,后操作;能用 KILL QUERY 就不用 KILL CONNECTION。通过结合 information_schema.processlist 的精准定位和 KILL QUERY 的温和操作,可以在保障业务连续性的前提下,有效清理异常会话,恢复集群性能。对于频繁出现的问题,应深入分析SQL或应用逻辑,而非仅仅治标。

评论

登录后才可以发表评论
用户头像
山佳发表于 1个月前
11111
用户头像
柒柒天晴发表于 1个月前
学习下
流泪猫猫头发表于 18小时前
学习了。