oracle数据库dump命令使用,【学习笔记】Oracle使用sql_trace来dump指定的sql语句的方法...

这篇学习笔记介绍了如何在Oracle 11g中使用sql_trace功能,仅针对特定SQL生成10046追踪信息。通过trace_10046_sqlid.sql脚本配置,只捕获指定的SQL,适用于v$sql信息不完整的情况。注意,trace对新连接会话有效,需配合非trace语句确认关闭。
摘要由CSDN通过智能技术生成

【学习笔记】Oracle使用sql_trace来dump指定的sql语句的方法

时间:2016-10-31 21:53   来源:Oracle研究中心   作者:HTZ   点击:

天萃荷净

Oracle研究中心学习笔记:分享一篇关于Oracle数据库SQL诊断的笔记,使用sql_trace来dump指定的sql语句的方法案例。

在11G,sql_trace增加只对某个sql语句生成10046。在一些特殊的环境中我们可能使用到,如:v$sql中sql_fulltext为空,就可以通过配置sql_trace来dump只定的sql语句,而不需要生成更多的其它的trace信息。关于sql_trace对sid,pname,orapid的使用方法,见mos文件。

1,DB与OS版本

oracleplus.net> select * from v$version;

BANNER

——————————————————————————–

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production

PL/SQL Release 11.2.0.3.0 – Production

CORE 11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 – Production

NLSRTL Version 11.2.0.3.0 – Production

[oracle@www.htz.pw admin]$lsb_release -a

LSB Version: :core-3.0-amd64:core-3.0-ia32:core-3.0-noarch:graphics-3.0-amd64:graphics-3.0-ia32:graphics-3.0-noarch

Distributor ID: RedHatEnterpriseAS

Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 8)

Release: 4

Codename: NahantUpdate8

2,对指定SQL生成10046信息

这里使用了trace_10046_sqlid.sql脚本,脚本内容如下:

oracleplus.net> !cat trace_10046_sqlid.sql

set echo off

set lines 2000 pages 5000 verify off heading on

undefine system_or_session;

undefine level;

undefine sqllist;

#如果是多条sql,在sql之间使用,来隔开

alter &&system_or_session set events

‘sql_trace[SQL: &&sqllist ] level &level’;

oradebug setmypid

oradebug eventdump &&system_or_session;

pause Press return to stop tracing

alter &&system_or_session set events ‘sql_trace[SQL: &&sqllist ] off’;

oradebug eventdump &&system_or_session;

undefine system_or_session;

undefine level;

undefine sqllist;

oracleplus.net> conn scott/oracle

Connected.

oracleplus.net> select /*+ htz*/count(*) from scott.emp;

COUNT(*)

———-

14

oracleplus.net> @find_sql.sql

Enter value for sql_text: htz

Enter value for sql_id:

SQL_ID CHILD HASH_VALUE PLAN_HASH EXECS ETIME AVG_ETIME USERNAME

————- —— ———- ———- ———- ————- ————- ————-

SQLTEXT

—————————————————————————————–

1twzndftjst38 0 3004982376 2937609675 1 .00 .00 SCOTT

select /*+ htz*/count(*) from scott.emp

oracleplus.net> @trace_10046_sqlid.sql

Enter value for system_or_session: system

Enter value for sqllist: 1twzndftjst38

Enter value for level: 12

System altered.

Statement processed.

sql_trace[SQL: 1twzndftjst38 ] level 12

10949 trace name context forever

28401 trace name context forever, level 1

Press return to stop tracing

sql_trace配置后,只会对新连接的会话有效,原来已经连接的会话不生效的。

打开session2,session3连接的会话执行

oracleplus.net> select /*+ htz*/count(*) from scott.emp;

COUNT(*)

———-

14

可以看到生成下面的日志

PARSING IN CURSOR #182936901240 len=39 dep=0 uid=83 oct=3 lid=83 tim=1409812013408343 hv=3004982376 ad=’883540b0′ sqlid=’1twzndftjst38′

select /*+ htz*/count(*) from scott.emp

END OF STMT

EXEC #182936901240:c=0,e=33,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=2937609675,tim=1409812013408342

WAIT #182936901240: nam=’SQL*Net message to client’ ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1409812013408407

FETCH #182936901240:c=0,e=40,p=0,cr=1,cu=0,mis=0,r=1,dep=0,og=1,plh=2937609675,tim=1409812013408466Oracleо

STAT #182936901240 id=1 cnt=1 pid=0 pos=1 obj=0 op=’SORT AGGREGATE (cr=1 pr=0 pw=0 time=35 us)’

STAT #182936901240 id=2 cnt=14 pid=1 pos=1 obj=79714 op=’INDEX FULL SCAN PK_EMP (cr=1 pr=0 pw=0 time=34 us cost=1 size=0 card=14)’

FETCH #182936901240:c=0,e=2,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=2937609675,tim=1409812013408672

WAIT #182936901240: nam=’SQL*Net message to client’ ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1409812013408689

已经trace成功

生成了exec,wait,stat的信息,因为SQL没有绑定变量,所以未见绑定变量信息

3 关闭trace

回来session1

oracleplus.net> @trace_10046_sqlid.sql

Enter value for system_or_session: system

Enter value for sqllist: 1twzndftjst38

Enter value for level: 12

System altered.

Statement processed.

sql_trace[SQL: 1twzndftjst38 ] level 12

10949 trace name context forever

28401 trace name context forever, level 1

Press return to stop tracing

这是之前的显示的内容

按回车,取消trace。

System altered.

10949 trace name context forever

28401 trace name context forever, level 1

4,验证是否关闭trace

回到session 2窗口中

oracleplus.net> /

COUNT(*)

———-

14

仍然生成了trace信息

PARSING IN CURSOR #182936887640 len=39 dep=0 uid=83 oct=3 lid=83 tim=1409812149842911 hv=3004982376 ad=’883540b0′ sqlid=’1twzndftjst38′

select /*+ htz*/count(*) from scott.emp

END OF STMT

EXEC #182936887640:c=0,e=48,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=2937609675,tim=1409812149842909

WAIT #182936887640: nam=’SQL*Net message to client’ ela= 9 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1409812149842978

FETCH #182936887640:c=999,e=81,p=0,cr=1,cu=0,mis=0,r=1,dep=0,og=1,plh=2937609675,tim=1409812149843079

STAT #182936887640 id=1 cnt=1 pid=0 pos=1 obj=0 op=’SORT AGGREGATE (cr=1 pr=0 pw=0 time=83 us)’

STAT #182936887640 id=2 cnt=14 pid=1 pos=1 obj=79714 op=’INDEX FULL SCAN PK_EMP (cr=1 pr=0 pw=0 time=67 us cost=1 size=0 card=14)’

FETCH #182936887640:c=0,e=2,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=2937609675,tim=1409812149843273

WAIT #182936887640: nam=’SQL*Net message to client’ ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1409812149843301

执行一条其它的SQL后再回来执行原来的SQL

oracleplus.net> select count(*) from scott.emp;

COUNT(*)

———-

14

再次执行trace的sql语句

oracleplus.net> select /*+ htz*/count(*) from scott.emp;

COUNT(*)

———-

14

在trace中没有看到任何的TRACE了内容了

回到session 3窗口中

oracleplus.net> /

COUNT(*)

———-

14

PARSING IN CURSOR #182936910800 len=39 dep=0 uid=83 oct=3 lid=83 tim=1409812294019897 hv=3004982376 ad=’883540b0′ sqlid=’1twzndftjst38′

select /*+ htz*/count(*) from scott.emp

END OF STMT

EXEC #182936910800:c=0,e=56,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=2937609675,tim=1409812294019895

WAIT #182936910800: nam=’SQL*Net message to client’ ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1409812294019964

FETCH #182936910800:c=0,e=35,p=0,cr=1,cu=0,mis=0,r=1,dep=0,og=1,plh=2937609675,tim=1409812294020018

STAT #182936910800 id=1 cnt=1 pid=0 pos=1 obj=0 op=’SORT AGGREGATE (cr=1 pr=0 pw=0 time=42 us)’

STAT #182936910800 id=2 cnt=14 pid=1 pos=1 obj=79714 op=’INDEX FULL SCAN PK_EMP (cr=1 pr=0 pw=0 time=40 us cost=1 size=0 card=14)’

FETCH #182936910800:c=0,e=2,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=2937609675,tim=1409812294020203

WAIT #182936910800: nam=’SQL*Net message to client’ ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1409812294020231

还在成trace,所以排除窗口2是由于时间到而停止trace sql内容

再次执行其它SQL

oracleplus.net> select count(*) from SEQ;

COUNT(*)

———-

225

oracleplus.net> select /*+ htz*/count(*) from scott.emp;

COUNT(*)

———-

14

同时trace文件中再也没有生成sqlid的trace内容

*** 2014-09-04 14:33:02.697

WAIT #182936910800: nam=’SQL*Net message from client’ ela= 88676734 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1409812382696974

CLOSE #182936910800:c=0,e=12,dep=0,type=1,tim=1409812382697082

通过session 2,session 3操作,可以猜测,取消trace后,对会话来说,需要执行一条非trace的SQL语句后才会生效,如果一直执行trace sql,那么会一直生成10046的trace信息的。

本文固定链接: http://www.htz.pw/2014/09/07/sql_trace%e5%bc%80%e5%90%af%e5%af%b9sql%e8%af%ad%e6%b3%95%e7%9a%84trace.html | 认真就输

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle使用sql_trace来dump指定的sql语句的方法

9bd101509341196819122f36086c9a60.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一种开源的关系型数据库,它提供了多种管理工具来操作数据库,其中包括psql和pg_dump命令。 psql是一种命令行工具,可以用来与PostgreSQL数据库进行交互。它不仅能够执行SQL语句,还可以支持交互式命令。在使用psql命令时,有时需要在命令中包含密码信息。可以使用以下的方式来在命令行中带密码执行SQL语句: 1. 在命令行中输入psql命令,启动psql工具。 2. 输入连接数据库命令,例如:psql -U username -d dbname -h hostname -p port。 3. 输入密码,此时必须在命令行中输入密码。 4. 执行SQL语句,例如:SELECT * FROM tablename; pg_dump是PostgreSQL数据库备份工具,可以用来将数据库中的数据导出到一个文件中。使用pg_dump命令时,也需要在命令行中包含密码信息。可以使用以下的方式在命令行中带密码执行pg_dump命令: 1. 在命令行中输入pg_dump命令,启动pg_dump工具。 2. 输入数据库连接信息和密码,例如:pg_dump -U username -d dbname -h hostname -p port -W。 3. 执行备份操作,例如:pg_dump -U username -d dbname -h hostname -p port -W > backup.sql。 总的来说,在使用psql和pg_dump命令时,为了在命令中包含密码信息,需要使用“-W”参数将密码输入到命令行中。当然,这种方式存在一定的安全隐患,因为密码可以被其他人看到。因此,最好使用其他方式来进行密码管理,例如使用配置文件、环境变量或者其他安全的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值