【 使用环境 】生产环境 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 处理锁定用户和解锁用户?
论坛小助手
2024 年11 月 28 日 17:34
#3
问题1:多节点8个节点的OB集群,如何批量kill usera的所有用户连接?
根据文档库中的信息,您可以使用 obshell
工具来批量 kill 会话。以下是一个示例脚本,可以帮助您批量 kill 指定用户的会话:
查询所有会话 :
首先,您需要查询所有属于 usera
的会话 ID。可以使用以下 SQL 查询:
SELECT session_id FROM oceanbase.__all_session WHERE user_name = 'usera';
编写脚本 :
使用 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>
替换为实际的值。
运行脚本 :
保存脚本并赋予执行权限,然后运行:
chmod +x kill_sessions.sh
./kill_sessions.sh
问题2:锁定用户和解锁用户是否可以通过SQL处理?
根据文档库中的信息,您可以使用 SQL 语句来锁定和解锁用户。以下是具体的 SQL 语句:
锁定用户 :
ALTER USER usera ACCOUNT LOCK;
解锁用户 :
ALTER USER usera ACCOUNT UNLOCK;
总结
批量 kill 会话 :可以使用 obshell
工具编写脚本来批量 kill 指定用户的会话。
锁定和解锁用户 :可以通过 SQL 语句 ALTER USER ... ACCOUNT LOCK
和 ALTER USER ... ACCOUNT UNLOCK
来锁定和解锁用户。
希望这些信息对您有所帮助!如果有任何进一步的问题,请随时联系 OceanBase 的人工答疑以获取更多帮助。
检索到的文档如下:
删除 OBServer 节点
停止集群
ob_cluster_operation_info OB 集群运维操作提醒
停止 OBServer 节点服务
OCP V4.2.0
重启集群
停止 OceanBase 集群
锁定和解锁用户
重启节点
1 个赞
旭辉
2024 年11 月 28 日 17:47
#4
2 个赞
淇铭
2024 年11 月 28 日 17:53
#5
可以这样做,也可以写个存储过程或者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节点也可以执行查杀?
旭辉
2024 年11 月 29 日 11:09
#7
不可以在observer A kill observer B的会话,可以在ODP上kill所有会话
我们现在有8个ODP 节点,我们需要登陆8次ODP?
论坛小助手
2024 年11 月 29 日 11:11
#9
是的,您可以在任意一个节点上执行 KILL
命令来终止其他节点上的会话。这是因为 KILL
命令是全局的,可以在集群中的任何一个节点上执行,以终止集群中任何节点上的会话。
具体来说,您可以按照以下步骤操作:
查询所有会话 :
在任意一个节点上执行以下 SQL 查询,获取所有属于 usera
的会话 ID:
SELECT session_id FROM oceanbase.__all_session WHERE user_name = 'usera';
批量 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 的人工答疑以获取更多帮助。
详情请参考:
KILL
暂停服务
自动触发合并
全链路追踪方法
FLUSH PLAN CACHE
隔离节点
obshell 租户命令组
数据并发性和一致性概述
CANCEL REPLICA TASK
(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)
旭辉
2024 年11 月 29 日 11:16
#10
如果这个8节点的集群走的同一个或几个ODP,你登录其中一个ODP就可以处理了
任意一个ODP可以kill所有ODP上的process list session,但是如果session是通过直连observer的就不行,这样理解对吧?
旭辉
2024 年11 月 29 日 14:26
#12
你理解的基本是对的,在odp上可以kill所有想要kill的会话,不需要在跳转了
banjin
2024 年11 月 29 日 15:05
#13
想要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
淇铭
2024 年12 月 3 日 09:54
#16