oceanbase终止sql查询

【 使用环境 】测试环境
【 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 查询

  1. 获取 SQL 的 CONNECTION_IDClient 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_idconnection_id。具体参考文档标题为:管理 OceanBase 数据库连接 → 客户端连接 → 终止客户端连接

  2. 终止目标 SQL 查询
    使用 KILL 命令终止指定的连接或会话。例如:

    obclient> KILL <connection_id>;
    

    或者:

    obclient> KILL <cs_id>;
    

    示例:

    obclient> KILL 68;
    

    验证是否成功终止会话,可以尝试执行一条简单的 SQL 查询,如果返回 Lost connection to MySQL server during query 错误,则说明会话已被成功终止。


自动配置超时时间终止 SQL 查询

如果您希望通过配置超时时间来自动终止长时间运行的 SQL 查询,可以使用以下方法:

  1. 设置 SQL 级别的超时时间
    使用 QUERY_TIMEOUT Hint 设置单条 SQL 的超时时间。语法如下:

    SELECT /*+ query_timeout(n) */ * FROM t1;
    

    其中 n 是整数,单位为微秒(us)。例如,将超时时间设置为 100 秒:

    SELECT /*+ query_timeout(100000000) */ * FROM t1;
    
  2. 设置会话级别的超时时间
    修改当前会话的超时时间:

    SET SESSION ob_query_timeout = n;
    

    示例:将超时时间设置为 100 秒(100,000,000 微秒):

    SET SESSION ob_query_timeout = 100000000;
    
  3. 设置租户级别的超时时间
    修改整个租户的默认超时时间:

    SET GLOBAL ob_query_timeout = n;
    

    示例:将超时时间设置为 100 秒:

    SET GLOBAL ob_query_timeout = 100000000;
    

    注意:修改租户级别的超时时间会影响所有会话,请谨慎操作。

  4. 查看当前超时时间配置
    可以通过以下命令查看当前的超时时间配置:

    SHOW VARIABLES LIKE 'ob_query_timeout';
    

总结

  • 手动终止 SQL 查询:通过 SHOW PROXYSESSIONGV$OB_SQL_AUDIT 查找目标 SQL 的 cs_idconnection_id,然后使用 KILL 命令终止。
  • 自动终止 SQL 查询:通过设置 SQL 级别、会话级别或租户级别的超时时间来实现。

以上方法均适用于测试环境。如果您需要更详细的文档参考,请查阅 管理 OceanBase 数据库连接 → 客户端连接 → 终止客户端连接阅读和管理 OceanBase 数据库 SQL 执行计划 → 通过 Hint 生成指定计划 → 常用 Hint → QUERY_TIMEOUT Hint

具体信息可参考以下文档:

  1. 管理 OceanBase 数据库连接
  2. 阅读和管理 OceanBase 数据库 SQL 执行计划
  3. 清理旧集群
  4. 日志
  5. OceanBase 数据库 TPC-C 测试
  6. 在您开始前
  7. 启用和关闭并行查询
  8. 通过 SQL Diagnoser 工具进行 SQL 性能诊断和分析
1 个赞

如果直连的show processlist;
proxy连接的使用SHOW PROXYSESSION;
使用KILL <cs_id>;即可

2 个赞

这个显示的是 本机 连接数据库的连接吗。 如果要中止其他ip的连接呢

select * from oceanbase.__all_virtual_processlist where info > ‘’ limit 10;
sys租户获取对应的session
业务租户直连对应proxy,进行kill seesion

我这版本4.2.1-10BP。
通过这个sql查询出id。
然后kill id
显示 unKnown thread id

查询的账号和 当前id的sql执行账号不是同一个