为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:麒麟
【CPU】:鲲鹏
【问题描述】*:1.请问如何抓取sql快照(当前时间正在执行的sql语句)。
2.请问如何抓取正在执行的事务。
文档中查看到慢sql及阻塞的查询:
SELECT
DS.SESS_ID "被阻塞的会话ID",
DS.SQL_TEXT "被阻塞的SQL",
DS.TRX_ID "被阻塞的事务ID",
(CASE L.LTYPE WHEN 'OBJECT' THEN '对象锁' WHEN 'TID' THEN '事务锁' END CASE ) "被阻塞的锁类型",
DS.CREATE_TIME "开始阻塞时间",
SS.SESS_ID "占用锁的会话ID",
SS.SQL_TEXT "占用锁的SQL",
SS.CLNT_IP "占用锁的IP",
L.TID "占用锁的事务ID"
FROM
V$LOCK L
LEFT JOIN V$SESSIONS DS
ON
DS.TRX_ID = L.TRX_ID
LEFT JOIN V$SESSIONS SS
ON
SS.TRX_ID = L.TID
WHERE
L.BLOCKED = 1
此处的查询的阻塞数据等价于正在执行的事务吗?
1、当前正在执行的SQL:
select datediff(s, last_recv_time, sysdate) exectime,
dbms_lob.SUBSTR(sf_get_session_sql(sess_id)) sql_txt,
CUR_SQLSTR,
sess_id,
trx_id,
state,
user_name,
clnt_ip,
clnt_ver
from v$sessions
where state = 'ACTIVE'
order by exectime desc
2、阻塞查询
select * from v$trxwait;
---或者
select s1.user_name,s1.curr_sch,s1.sess_id "被阻塞sess_id",s1.sql_text,
s2.user_name,s2.curr_sch,s2.sess_id "产生阻塞sess_id",s2.sql_text,w1.wait_time
from v$sessions s1,v$sessions s2,v$trxwait w1
where
s1.trx_id=w1.id
and s2.trx_id=w1.WAIT_FOR_ID ;
阻塞查询查询的是会话,查到的产生阻塞的会话里面SQL有可能是那个会话里面最后执行的SQL语句。需要具体的分析那个会话、事务里面是否有其他的SQL。
V$SESSIONS 显示当前会话的具体信息,如执行的 sql 语句、主库名、当前会话状态、用户名等等。
详情可见系统管理员手册。
1、什么是堵塞
数据库中的阻塞指sql语句执行遇到所需资源不满足,挂起等待所需资源,无法正常往下继续执行。
常见情况为第一个事务占有资源没有释放,而第二个事务需要获取这个资源才能继续执行。如果第一个事务一直没有提交或者回滚完成事务,第二个事务会一直等待下去,直到第一个事务释放该资源为止。
2、什么是死锁
死锁是两个事务都在等待对方持有的资源锁,要等对方释放持有的资源锁之后才能继续工作。但是两个都在互相等待对方完成,而以目前这种状态,双方都完成不了,陷入死循环了。