通过LOGMNR查找程式带入的实际值

生产库中出现了大量的锁表,需要得到当时程式执行的SQL以及其带入的值

1.查看SQL

SELECT SQL_ID FROM V$SESSION WHERE SID=(SELECT FINAL_BLOCKING_SESSION FROM V$SESSION WHERE BLOCKING_SESSION IS NOT NULL);

查出来后,在通过V$SQL查找,此时发现程式使用了绑定变量,此方法不可行。

2.通过10046进行追踪

可以通过10046追踪某个会话,但是因为有好多程式,并不知道哪一个会锁表,因此无法确定追踪哪一个

3.通过LOGMNR得到

因为锁表的会话并没有提交,所以我们需要验证一下LOGMNR是否可以抓到未提交的SQL

复制代码
--1.执行一条更新语句
UPDATE TT SET NAME='MONKEY' WHERE ID=1;
--2.不提交
--3.归档当前的REDO
alter system archive log current;
--4.LOGMNR
EXEC  SYS.DBMS_LOGMNR.ADD_LOGFILE('/xxxx/xxxx/archivelog/1_1078_1047477936.dbf');
EXEC  SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS=>16);
SELECT * FROM V$LOGMNR_CONTENTS  WHERE lower(TABLE_NAME)='tt'
复制代码

 

根据这个原理,我们可以对锁表的会话的变量值进行抓取。

posted @   monkey6  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示