重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6466|回复: 7
打印 上一主题 下一主题

[讨论] 跟踪ORACLE SQL语句有哪些方式?

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-13 10:30:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一用户抱怨操作慢,如何跟踪操作的SQL呢?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

沙发
 楼主| 发表于 2020-3-13 10:37:59 | 只看该作者
如果要跟踪当前会话的 SQL,我们可以在执行SQL语句之前,
执行以下语句开启跟踪 :

ALTER SESSION SET SQL_TRACE=TRUE;
之后执行的 SQL语句,就会保存到 当前会话对应的TRACE文件

SQL>CONN hr/hr
sql>alter session set sql_trace=true;
SQL> select * from v$diag_info where name='Default Trace File';

   INST_ID
----------
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
    CON_ID
----------
         1
Default Trace File
D:\ORACLE\diag\rdbms\orcl\orcl\trace\orcl_ora_10796.trc
         0

sql> select * from departments;

去查看      D:\ORACLE\diag\rdbms\orcl\orcl\trace\orcl_ora_10796.trc 文件,是否已经有了,而且里面有你刚才输入的SQL语句.
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-3-13 10:44:21 | 只看该作者
上面是跟踪自己,如何跟踪别人呢 ?

可以使用dbms_monitor来实现:
1.先找到对应的SQL会话的SID,SERIAL#
  
2.执行对应的SID监控  
   EXECUTE dbms_monitor.session_trace_enable (指定的sid,指定的serial#, waits=>TRUE, binds=>TRUE);

3.可以去检查对应的文件
  
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2020-3-13 10:55:10 | 只看该作者
本帖最后由 郑全 于 2020-3-13 10:57 编辑

通过10046 进行跟踪

1.登录用户,获取SPID
  获取SPID的方式有很多种.
SQL> conn hr/hr
已连接。

SQL> select distinct sid from v$mystat;
       SID
----------
       357
SQL> select spid from v$process p,v$session s where p.addr=s.paddr and s.sid=357;
SPID
------------------------------------------------
9100

2.另外开一个窗口,设置10046
  SQL> conn / as sysdba
  SQL> oradebug setospid 9100;
  SQL> oradebug event 10046 trace name context forever,level 12;

3.查看文件已经生成
  
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2020-3-13 11:02:34 | 只看该作者
11 g 以上,还可以比较简单的方式,只要知道对方的SPID,直接通过事件方式跟踪:

SQL> alter system set events 'sql_trace {process : ospid =9100} level=12';

或者跟踪EXPDP多个进程:
SQL> alter system set events 'sql_trace {process: pname = dw | process: pname = dm} level=12';

回复 支持 反对

使用道具 举报

6#
发表于 2020-3-13 14:00:08 | 只看该作者
郑全 发表于 2020-3-13 11:02
11 g 以上,还可以比较简单的方式,只要知道对方的SPID,直接通过事件方式跟踪:

SQL> alter system set eve ...

郑老师,通过客户端的形式查询数据(客户端有菜单界面,从菜单界面选择查询条件),怎么从后台中查询对应的sql语句呢?

执行下边的语句可以么?
SELECT b.sid oracleID,b.username 登录Oracle用户名,b.serial#,spid 操作系统ID,
paddr,sql_text 正在执行的SQL,b.machine 计算机名 FROM   v$session b left join  
v$process a on a.addr =b.paddr left join
v$sqlarea c on b.sql_hash_value = c.hash_value;


回复 支持 反对

使用道具 举报

7#
 楼主| 发表于 2020-3-13 14:19:49 | 只看该作者
你要确定操作的标识吧,比如用户名,登录时间等,PROGRAM,模块等 ,
当前会话不一定就一定在执行一条语句吧 .
回复 支持 反对

使用道具 举报

8#
发表于 2020-3-13 14:34:46 | 只看该作者
郑全 发表于 2020-3-13 11:02
11 g 以上,还可以比较简单的方式,只要知道对方的SPID,直接通过事件方式跟踪:

SQL> alter system set eve ...

我在备库上进行的实验操作,在客户端选择查询条件后,立刻就在plsql中 只找到这条查询语句,所以能确保此时数据库仅执行这个操作,且没有其他用户在查询。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-11-30 09:41 , Processed in 0.093360 second(s), 22 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表