| 适用系统 | 适用场景 |
|---|---|
| OceanBase数据库V3/V4 | 低效SQL/高并发等导致资源使用冲高 |
一、黑屏杀连接
查询语句
复制SELECT
-- 基础会话信息
a.id, -- 会话 ID
user, -- 用户名(注意去掉前缀,避免解析问题)
a.host, -- 客户端主机
a.tenant, -- 租户名称
a.command, -- 当前执行的命令类型
a.user_client_ip, -- 用户客户端 IP
a.svr_ip, -- 服务器 IP
a.sql_id, -- SQL 的唯一标识
a.total_time, -- 当前会话运行的总时长
-- 全局并发量统计(不受 WHERE 条件限制)
b.concurrency_count AS concurrency_count,
SUBSTR(a.info, 1, 6) AS info, -- SQL 语句的部分信息
-- 登录命令(用于快速连接目标节点)
'--obclient -h' || a.svr_ip || ' -P2881 -u' || user || '@' || a.tenant ||
' -paaAA11__;' AS login_command,
-- 杀进程命令(用于释放异常会话)
'--kill ' || a.id || ' /*' || a.svr_ip || ':2881*/;' AS kill_command,
-- 限流命令(限制高并发 SQL 的执行)
'--CREATE OUTLINE ' || a.sql_id || '_' || TO_CHAR(SYSDATE, 'YYYYMMDDHH24') ||
' ON ''' || a.sql_id || ''' USING HINT /*+max_concurrent(1)*/;' AS limit_command,
-- 取消限流命令(撤销限流策略)
'--DROP OUTLINE ' || a.sql_id || '_' || TO_CHAR(SYSDATE, 'YYYYMMDDHH24') ||
';' AS drop_limit_command
FROM
gv$ob_processlist a
-- 子查询计算全局并发量
LEFT JOIN (
SELECT
sql_id,
COUNT(*) AS concurrency_count -- 每个 SQL ID 的全局活动会话数
FROM
gv$ob_processlist
WHERE
STATE = 'ACTIVE'
AND COMMAND <> 'SLEEP'
GROUP BY
sql_id
) b
ON a.sql_id = b.sql_id
WHERE
-- 主查询的过滤条件
a.COMMAND <> 'SLEEP' -- 排除无活动的会话
AND a.STATE = 'ACTIVE' -- 仅查看活跃会话
AND user NOT IN ('proxyro', 'ocp_monitor', 'root', 'oms_drc') -- 排除系统用户
AND a.tenant <> 'sys' -- 排除系统租户
-- AND a.total_time > 20 -- 可选:筛选运行时间超过 20 秒的会话
-- AND a.sql_id = '56C3F66B0597D3B6E958DC477ADE47E3' -- 可选:筛选特定 SQL ID
-- AND a.id = 3222022760 -- 可选:筛选特定会话 ID
ORDER BY
a.svr_ip, -- 按服务器分布排序
a.total_time DESC, -- 按会话运行时长倒序排序
b.concurrency_count DESC; -- 按并发量倒序排序
执行样例:


二、cdas杀连接
复制操作:点击运维工具——数据库运维——实例运维——定位具体集群点击运维管理——实例会话定位具体sql进行对应操作



三、关于事务介绍
OceanBase 数据库的事务按照参与者的个数和位置可以分为三种类型:普通事务、分布式事务、XA 事务;
普通事务、分布式事务又可以统称为非 XA 事务。
而事务按照执行的时间和状态可以分为其他事务、长事务、悬挂事务三种。
其中,长事务和悬挂事务会导致资源长时间不释放,等待会话长时间被阻塞,影响业务系统。
在日常工作中,需要重点关注这类异常的事务。
长事务
长事务指那些长时间未提交的事务。普通事务、分布式事务、XA 事务都可能处于长事务的状态。
当普通事务、分布式事务处于长事务状态时,可以通过 kill session 的方式来回滚事务;
当 XA 事务处于长事务状态时可以终止 XA 事务。
长事务产生的原因可能是事务中的某条 SQL 执行时间较长,或执行完 SQL 后长时间未完成提交或回滚。
如果当前的长事务对系统造成了资源阻塞,可以通过回滚普通长事务会话或终止 XA 事务进行处理。
以下代码示例默认使用 sys 租户
查看数据库里是否存在长事务
复制SELECT * FROM OCEANBASE.__all_virtual_trans_stat WHERE part_trans_action <= 2 AND ctx_create_time < date_sub(now(), INTERVAL 600 SECOND) AND is_exiting != 1
查看事务是否为 XA 事务,其中事务 ID 为上述 sql 中查出的svr_ip。如果sql执行结果为空,则表明长事务非XA事务;如果执行有结果,则对应的结果即为 XA 事务
复制SELECT * FROM OCEANBASE.__all_virtual_global_transaction WHERE trans_id LIKE '%事务ID%';
处理长事务,请执行下列命令
回滚普通长事务。注意,kill 会话需要直连对应的 OBServer 节点,无需通过 proxy 连接数据库
复制查询需要登录的节点:
SELECT svr_ip FROM OCEANBASE.__all_virtual_processlist WHERE id=会话ID;
成功登录后kill对应ID:
kill 会话ID;
终止 XA 事务,请执行下列命令
前往系统租户,查找 XA 事务的 XID
复制SELECT
hex(gtrid),
hex(bqual),
format_id
FROM
OCEANBASE.__all_virtual_global_transaction
WHERE
tenant_id = 租户ID
AND format_id <> -2
AND state = 3
AND gmt_modified < date_sub(now(), INTERVAL 1800 SECOND);
如果是 Oracle 模式租户,可以前往普通租户查看 XA 事务的 XID
复制SELECT
rawtohex(gtrid),
rawtohex(bqual),
format_id
FROM
sys.all_virtual_tenant_global_transaction_agent
WHERE
format_id <> -2
AND state = 3
AND ROUND((sysdate - cast(GMT_MODIFIED as date)) * 86400) > 1800;
前往普通租户执行,终止 XA 事务。
复制set
serveroutput on;
declare
l_xid DBMS_XA_XID;
l_ret PLS_INTEGER;
BEGIN
l_xid.formatid := format_id;
l_xid.gtrid := hextoraw('hex(gtrid)');
l_xid.bqual := hextoraw('hex(bqual)');
l_ret := DBMS_XA.XA_ROLLBACK(xid = > l_xid);
dbms_output.put_line(l_ret);
END;
/
白屏分析操作
1.ocp 点击事务查看长事务,长连接,并查杀。
2.登陆集群,查询长事务。
复制SELECT count(1)
FROM GV$OB_TRANSACTION_PARTICIPANTS
WHERE CTX_CREATE_TIME < date_sub(now(), INTERVAL 600 SECOND)
AND STATE = 'INIT';
获取到该事务的事务 ID(TX_ID)、scheduler 所在节点(SCHEDULER_ADDR)以及会话 ID(SESSION_ID)后
登录相应主机kill session;
sql限流处理
场景描述
在数据库正常运行过程中,经常会碰到异常的 SQL 执行导致的 CPU 使用率飙升、IO 过高,或内存激增等情况。
在应急处置时,可能涉及到使用限流手段,临时降低其并发流量。
SQL 异常通常分为以下几种情况:
- 业务应用没有新版本发布,也就是没有新增 SQL这种情况又分为两类:
- 外部业务流量变化,SQL 执行次数突增或数据量激增。
- 原SQL执行计划异常。
- 业务应用有新版本发布,出现了新的 SQL查询逻辑,其中包含了慢 SQL。
业务影响
SQL 问题容易导致 CPU 冲高,内存耗尽等现象,从而产生业务卡顿甚至崩溃等影响。
限流手段:
可以通过绑定 SQL 的执行计划加入 hint max_concurrent 来限制 SQL 并发,实现对 SQL 的限流
CREATE OUTLINE outline_name ON sql_id USING HINT /+max_concurrent(1)/;
内存写入达到一定阈值 OB 会主动限制客户端导入速度。
writing_throttling_trigger_percentage 是租户级参数,该参数是调整写入速度的阈值,当 MemStore 已使用的内存达到该阈值时,触发写入限速。
该参数的默认值是 100,表示关闭写入限速机制。该参数的取值范围为 [0, 100],修改该参数无需重启 OBServer 即刻生效。
另一个参数 writing_throttling_maximum_duration 表示触发限速后,剩余内存最多支持多长时间的写入时间,默认为1小时,该项一般不做修改。
ALTER SYSTEM SET writing_throttling_trigger_percentage = 80;
ALTER SYSTEM SET writing_throttling_maximum_duration = ‘1h’;
白屏操作:
SQL并发限制:




天馨