多节点的ob 集群,如何批量kill session ,可否提供脚本

【 使用环境 】生产环境 or 测试环境 生产
【 OB or 其他组件 】 4。0
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

问题1:
多节点8个节点 的ob 集群,如何批量usera 的所有用户连接,kill session ,可否提供脚本。
我知道OCP 可以在会话管理批量kill,但是usera 连接数达到了1000多个。所以OCP
无法一次kill 1000多个会话,所以想知道是否有shell脚本或者其他可以提供,
可以批量kill session ?

问题2: 锁定用户和解锁用户这个也可以在白屏操作,请问能否通过SQL 处理锁定用户和解锁用户?

问题1:多节点8个节点的OB集群,如何批量kill usera的所有用户连接?

根据文档库中的信息,您可以使用 obshell 工具来批量 kill 会话。以下是一个示例脚本,可以帮助您批量 kill 指定用户的会话:

  1. 查询所有会话
    首先,您需要查询所有属于 usera 的会话 ID。可以使用以下 SQL 查询:

    SELECT session_id FROM oceanbase.__all_session WHERE user_name = 'usera';
    
  2. 编写脚本
    使用 obshell 工具编写一个脚本来批量 kill 会话。以下是一个示例脚本:

    #!/bin/bash
    
    # 获取所有 usera 的会话 ID
    SESSION_IDS=$(obclient -h<host> -P<port> -u<user> -p<password> -D<database> -e "SELECT session_id FROM oceanbase.__all_session WHERE user_name = 'usera';" | grep -v session_id | tr -d ' ')
    
    # 遍历每个会话 ID 并 kill
    for SESSION_ID in $SESSION_IDS; do
        echo "Killing session: $SESSION_ID"
        obclient -h<host> -P<port> -u<user> -p<password> -D<database> -e "KILL $SESSION_ID;"
    done
    

    请将 <host>, <port>, <user>, <password>, 和 <database> 替换为实际的值。

  3. 运行脚本
    保存脚本并赋予执行权限,然后运行:

    chmod +x kill_sessions.sh
    ./kill_sessions.sh
    

问题2:锁定用户和解锁用户是否可以通过SQL处理?

根据文档库中的信息,您可以使用 SQL 语句来锁定和解锁用户。以下是具体的 SQL 语句:

  1. 锁定用户

    ALTER USER usera ACCOUNT LOCK;
    
  2. 解锁用户

    ALTER USER usera ACCOUNT UNLOCK;
    

总结

  • 批量 kill 会话:可以使用 obshell 工具编写脚本来批量 kill 指定用户的会话。
  • 锁定和解锁用户:可以通过 SQL 语句 ALTER USER ... ACCOUNT LOCKALTER USER ... ACCOUNT UNLOCK 来锁定和解锁用户。

希望这些信息对您有所帮助!如果有任何进一步的问题,请随时联系 OceanBase 的人工答疑以获取更多帮助。

检索到的文档如下:

  1. 删除 OBServer 节点
  2. 停止集群
  3. ob_cluster_operation_info OB 集群运维操作提醒
  4. 停止 OBServer 节点服务
  5. OCP V4.2.0
  6. 重启集群
  7. 停止 OceanBase 集群
  8. 锁定和解锁用户
  9. 重启节点
1 个赞

可以通过ODP或者直连方式kill,可参考如下方式

KILL

https://www.oceanbase.com/docs/common-odp-doc-cn-1000000001601244

OceanBase 数据库 V4.2 版本,关于锁冲突问题的排查手册

https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000664387?back=kb

2 个赞

可以这样做,也可以写个存储过程或者bash脚本
举例:
select concat(‘KILL ‘,id,’;’) from GV$OB_PROCESSLIST where USER=‘root’ and STATE=‘SLEEP’ INTO OUTFILE ‘/tmp/outfile.sql’;
source /tmp/outfile.sql;

3 个赞

你的意思是不用编写脚本,即时这个sesssion_id 在b节点跑,在A节点也可以执行查杀?

不可以在observer A kill observer B的会话,可以在ODP上kill所有会话

我们现在有8个ODP 节点,我们需要登陆8次ODP?

是的,您可以在任意一个节点上执行 KILL 命令来终止其他节点上的会话。这是因为 KILL 命令是全局的,可以在集群中的任何一个节点上执行,以终止集群中任何节点上的会话。

具体来说,您可以按照以下步骤操作:

  1. 查询所有会话
    在任意一个节点上执行以下 SQL 查询,获取所有属于 usera 的会话 ID:

    SELECT session_id FROM oceanbase.__all_session WHERE user_name = 'usera';
    
  2. 批量 kill 会话
    在同一个节点上,使用 KILL 命令批量终止这些会话。例如,如果您已经获取了会话 ID 列表,可以使用以下 SQL 语句:

    KILL <session_id1>;
    KILL <session_id2>;
    -- 依次类推
    

或者,您可以编写一个脚本来自动化这个过程,如前所述:

#!/bin/bash

# 获取所有 usera 的会话 ID
SESSION_IDS=$(obclient -h<host> -P<port> -u<user> -p<password> -D<database> -e "SELECT session_id FROM oceanbase.__all_session WHERE user_name = 'usera';" | grep -v session_id | tr -d ' ')

# 遍历每个会话 ID 并 kill
for SESSION_ID in $SESSION_IDS; do
    echo "Killing session: $SESSION_ID"
    obclient -h<host> -P<port> -u<user> -p<password> -D<database> -e "KILL $SESSION_ID;"
done

请将 <host>, <port>, <user>, <password>, 和 <database> 替换为实际的值。

解释

  • 全局性KILL 命令是全局的,可以在集群中的任何一个节点上执行,以终止集群中任何节点上的会话。
  • 脚本自动化:使用脚本可以方便地批量处理大量会话,避免手动操作的繁琐和错误。

希望这些信息对您有所帮助!如果有任何进一步的问题,请随时联系 OceanBase 的人工答疑以获取更多帮助。

详情请参考:

  1. KILL
  2. 暂停服务
  3. 自动触发合并
  4. 全链路追踪方法
  5. FLUSH PLAN CACHE
  6. 隔离节点
  7. obshell 租户命令组
  8. 数据并发性和一致性概述
  9. CANCEL REPLICA TASK

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

如果这个8节点的集群走的同一个或几个ODP,你登录其中一个ODP就可以处理了

任意一个ODP可以kill所有ODP上的process list session,但是如果session是通过直连observer的就不行,这样理解对吧?

你理解的基本是对的,在odp上可以kill所有想要kill的会话,不需要在跳转了

想要kill的session是server上直连的,也可以通过odp kill吗

谢谢

MySQL [oceanbase]> select concat(‘KILL ‘,id,’;’) from GV$OB_PROCESSLIST where USER=‘usert’ and STATE=‘SLEEP’ INTO OUTFILE ‘/tmp/outfile.sql’;

->/tmp权限没问题,但是报错Access denied
ERROR 1227 (42501): Access denied

使用 OUTFILE 语句导出数据

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001499516