【 使用环境 】测试环境
【 OB or 其他组件 】
oceanbase4.2.1.7
【问题描述】清晰明确描述问题
假如我有一个查询时间很长的sql在运行,我是通过一个服务下发到数据库执行的。这种情况应该怎么终止这个sql。
如果有ocp可以直接通过ocp进行kill
我自己的服务可不可以用什么方法停掉了,用ocp肯定不现实吧,生产环境不会部署的
手动:kill [id];
自动:set global ob_query_timeout= 默认值为 10000000
微秒(即 10 秒)。
是这样嘛,手动需要查到这个sql的id出来,自动就配置一个超时时间终止掉
手动查id有没有相关文档之类的
不知道这样行吗?对你来说。
select id from information_schema.processlist where info like ‘%keyworld%’;
根据您的问题描述,您希望在 OceanBase 数据库中终止一个长时间运行的 SQL 查询。以下是针对手动和自动两种方式的具体解决方法:
手动终止 SQL 查询
-
获取 SQL 的
CONNECTION_ID
或Client Session ID
首先需要找到正在运行的 SQL 查询对应的连接 ID 或会话 ID。可以通过以下步骤实现:-
使用
SHOW PROXYSESSION
命令查询当前所有会话信息,并找到目标 SQL 对应的cs_id
(Client Session ID)。obclient> SHOW PROXYSESSION;
输出示例:
+---------------------+--------+---------+--------+------+-----------------+------+-------------+-------------------+-------------------+------+------+-----------+ | proxy_sessid | Id | Cluster | Tenant | User | Host | db | trans_count | svr_session_count | state | tid | pid | using_ssl | +---------------------+--------+---------+--------+------+-----------------+------+-------------+-------------------+-------------------+------+------+-----------+ | 7230691418559283266 | 68 | ob1.cc | sys | root | 127.0.0.1:50260 | NULL | 0 | 1 | MCS_ACTIVE_READER | 8728 | 8728 | 0 | +---------------------+--------+---------+--------+------+-----------------+------+-------------+-------------------+-------------------+------+------+-----------+ 1 rows in set
在此示例中,
Id
列表示 Client Session ID。 -
如果无法通过
SHOW PROXYSESSION
找到目标 SQL 的会话信息,也可以通过系统视图GV$OB_SQL_AUDIT
查找正在运行的 SQL 查询及其对应的trace_id
或connection_id
。具体参考文档标题为:管理 OceanBase 数据库连接 → 客户端连接 → 终止客户端连接。
-
-
终止目标 SQL 查询
使用KILL
命令终止指定的连接或会话。例如:obclient> KILL <connection_id>;
或者:
obclient> KILL <cs_id>;
示例:
obclient> KILL 68;
验证是否成功终止会话,可以尝试执行一条简单的 SQL 查询,如果返回
Lost connection to MySQL server during query
错误,则说明会话已被成功终止。
自动配置超时时间终止 SQL 查询
如果您希望通过配置超时时间来自动终止长时间运行的 SQL 查询,可以使用以下方法:
-
设置 SQL 级别的超时时间
使用QUERY_TIMEOUT Hint
设置单条 SQL 的超时时间。语法如下:SELECT /*+ query_timeout(n) */ * FROM t1;
其中
n
是整数,单位为微秒(us)。例如,将超时时间设置为 100 秒:SELECT /*+ query_timeout(100000000) */ * FROM t1;
-
设置会话级别的超时时间
修改当前会话的超时时间:SET SESSION ob_query_timeout = n;
示例:将超时时间设置为 100 秒(100,000,000 微秒):
SET SESSION ob_query_timeout = 100000000;
-
设置租户级别的超时时间
修改整个租户的默认超时时间:SET GLOBAL ob_query_timeout = n;
示例:将超时时间设置为 100 秒:
SET GLOBAL ob_query_timeout = 100000000;
注意:修改租户级别的超时时间会影响所有会话,请谨慎操作。
-
查看当前超时时间配置
可以通过以下命令查看当前的超时时间配置:SHOW VARIABLES LIKE 'ob_query_timeout';
总结
-
手动终止 SQL 查询:通过
SHOW PROXYSESSION
或GV$OB_SQL_AUDIT
查找目标 SQL 的cs_id
或connection_id
,然后使用KILL
命令终止。 - 自动终止 SQL 查询:通过设置 SQL 级别、会话级别或租户级别的超时时间来实现。
以上方法均适用于测试环境。如果您需要更详细的文档参考,请查阅 管理 OceanBase 数据库连接 → 客户端连接 → 终止客户端连接 和 阅读和管理 OceanBase 数据库 SQL 执行计划 → 通过 Hint 生成指定计划 → 常用 Hint → QUERY_TIMEOUT Hint。
具体信息可参考以下文档:
如果直连的show processlist;
proxy连接的使用SHOW PROXYSESSION;
使用KILL <cs_id>;即可
这个显示的是 本机 连接数据库的连接吗。 如果要中止其他ip的连接呢
select * from oceanbase.__all_virtual_processlist where info > ‘’ limit 10;
sys租户获取对应的session
业务租户直连对应proxy,进行kill seesion