作为SQL Trace的扩展功能,Oracle 10046 event(10046事件)是一个重要的调试事件,也可以说是系统性能分析时最重要的一个事件,它包含比SQL Trace更多的信息。但可惜的是,10046事件并不是Oracle官方提供给用户的诊断工具,官方文档上面也没有详细的说明,不过还是可以从很多国内外专家技术文档找到相关学习资料,本文主要参考Oracle MOS文档来学习总结下10046事件的用法。

关于SQL Trace的收集方式可以参考另一篇博文:Oracle 11g R2性能优化 SQL TRACE

关于10046 event trace的收集方式可以参考Oracle MOS文档:How To Collect 10046 Trace (SQL_TRACE) Diagnostics for Performance Issues (文档 ID 376442.1)

主要说明

10046 event根据跟踪的信息详细程度可以分成不同的等级,高级别向低级别兼容,即级别高的跟踪信息包含级别低的信息。

主要级别说明如下表所示:

级别(Level) 说明(Description)
0 不生成跟踪统计信息,相当于SQL_TRACE=FALSE
1 生成标准跟踪统计信息,相当于SQL_TRACE=TRUE,为默认级别
2 与级别1相同
4 级别1基础上 + 绑定变量跟踪
8 级别1基础上 + 等待事件跟踪
12 级别4 + 级别8
16 级别1基础上 + 每次执行时写入执行计划信息(11g新增)

通常使用的级别为12,10046 event跟踪信息可以基本满足分析的需求。关于级别的详细说明可以参考国外大神Christian Antognini的博文:Event 10046 – Full List of Levels

常用使用方式

会话级别开启

根据参考的MOS文档描述,会话级别开启10046 event跟踪之前需设置几个会话级参数选项,如下:

  • tracefile_identifier

    设置生成trace文件的标识符。

  • statistics_level

    指定数据库和操作系统统计信息的收集级别,取值为{typical|all|basic}。

  • timed_statistics

    指定是否收集与时间相关的统计信息,当statistics_level参数值为typical或all时默认值为true,当statistics_level参数值为basic时默认值为false。

  • max_dump_file_size

    指定trace文件(包括告警文件)的最大值,默认为unlimited,取值为{integer [K|M|G] | unlimited}。

会话级别参数设置:

SCOTT@dbabd> alter session set tracefile_identifier = '10046_SCOTT';
Session altered. SCOTT@dbabd> alter session set timed_statistics = true;
Session altered. SCOTT@dbabd> alter session set statistics_level = all;
Session altered. SCOTT@dbabd> alter session set max_dump_file_size = unlimited;
Session altered.
  • 开启10046 event跟踪:
-- 这里开启级别为12
SCOTT@dbabd> alter session set events '10046 trace name context forever,level 12';
Session altered.
  • 执行需要跟踪语句:
-- 以查询scott.dept表为例
SCOTT@dbabd> select * from dept; DEPTNO DNAME LOC
---------- ------------------------------------------ ---------------------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
  • 关闭10046 event跟踪:
SCOTT@dbabd> alter session set events '10046 trace name context off';
Session altered.

SCOTT@dbabd> exit;

ORADEBUG开启

oradebug是一个SQL*PLUS命令行工具,它可以跟踪会话、dump内存结构、唤醒进程等。同时,oradebug也可以用来开启10046事件跟踪,并且它可以直接显示trace文件的路径,想要使用oradebug需要有sysdba权限。

关于oradebug详细说明可以参考:ORADEBUG introduction

在oradebug工作之前,必须确定连接的进程号,oradebug主要有如下连接进程方式:

SETMYPID                          Debug current process              -- 跟踪当前会话进程
SETOSPID <ospid> Set OS pid of process to debug -- 通过操作系统的进程
SETORAPID <orapid> ['force'] Set Oracle pid of process to debug -- 通过Oracle的进程

如果无法获取OS pid或者Oracle pid,可以通过如下脚本获取:

  • 获取OS pid和会话id(session id)
-- 脚本
column line format a80
set heading off
select 'ospid: ' || p.spid || ' # ''' || s.sid || ',' || s.serial# || ''' ' ||
s.osuser || ' ' || s.machine || ' ' || s.username || ' ' ||
s.program line
from v$session s, v$process p
where p.addr = s.paddr
and s.username <> ' '; -- 输出
SYS@dbabd> column line format a80
SYS@dbabd> set heading off
SYS@dbabd> select 'ospid: ' || p.spid || ' # ''' || s.sid || ',' || s.serial# || ''' ' ||
2 s.osuser || ' ' || s.machine || ' ' || s.username || ' ' ||
3 s.program line
4 from v$session s, v$process p
5 where p.addr = s.paddr
6 and s.username <> ' '; ospid: 24561 # '12,29' oracle dbabd SYS sqlplus@dbabd (TNS V1-V3)
ospid: 9769 # '138,365' oracle dbabd SCOTT sqlplus@dbabd (TNS V1-V3)
ospid: 24668 # '18,9' oracle dbabd SYS sqlplus@dbabd (TNS V1-V3)

一般通过操作系统进程就可以确定跟踪会话,也可以通过Oracle pid来跟踪。通过以上脚本也可以获取到会话id(session id),这里以SCOTT用户为例,SCOTT用户的sid为138。

  • 获取Oracle pid
-- 脚本
select p.PID, p.SPID, s.SID
from v$process p, v$session s
where s.paddr = p.addr
and s.sid = &SESSION_ID; -- 输入上述脚本得到的sid,如138 -- 输出
SYS@dbabd> select p.PID, p.SPID, s.SID
2 from v$process p, v$session s
3 where s.paddr = p.addr
4 and s.sid = &SESSION_ID;
Enter value for session_id: 138
old 4: and s.sid = &SESSION_ID
new 4: and s.sid = 138 25 9769 138
  • 确定oradebug连接进程
SYS@dbabd> oradebug setospid 9769
Oracle pid: 25, Unix process pid: 9769, image: oracle@dbabd (TNS V1-V3)

SYS@dbabd> oradebug setorapid 25
Oracle pid: 25, Unix process pid: 9769, image: oracle@dbabd (TNS V1-V3)
  • 配置trace文件的标识符
SYS@dbabd> oradebug settracefileid 10046_SCOTT_ORADEBUG;
Statement processed.
  • 开启10046 event跟踪
SYS@dbabd> oradebug event 10046 trace name context forever, level 12;
Statement processed.
  • SCOTT用户模拟执行语句
SCOTT@dbabd> select * from dept;

    DEPTNO DNAME                                      LOC
---------- ------------------------------------------ ---------------------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
  • 关闭10046 event跟踪
SYS@dbabd> oradebug event 10046 trace name context off;
Statement processed.
  • 关闭trace文件
SYS@dbabd> oradebug close_trace;
Statement processed.
  • 查询当前trace文件路径
SYS@dbabd> oradebug tracefile_name;
/data/app/oracle/diag/rdbms/dbabd/dbabd/trace/dbabd_ora_9769_10046_SCOTT_ORADEBUG.trc

DBMS_SYSTEM包开启

通过DBMS_SYSTEM包也可以开启10046 event跟踪,主要是包中存储过程SET_EV来完成,查看存储过程所需的参数选项:

PROCEDURE SET_EV
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SI BINARY_INTEGER IN -- SID
SE BINARY_INTEGER IN -- SERIAL#
EV BINARY_INTEGER IN -- 事件代码,如10046
LE BINARY_INTEGER IN -- 事件级别,如12
NM VARCHAR2 IN

通过以上参数选项分析,采用DBMS_SYSTEM包的方式最少需要获取SID,获取SID可以参考oradebug当中的脚本,这里不再重复说明,为了方便查找trace文件,也可以事先配置trace文件的标识符,还是以SCOTT用户为例,trace文件标识符为10046_SCOTT_DBMSSYSTEM。

  • 配置trace文件标识符
SYS@dbabd> oradebug setospid 9769
Statement processed.
SYS@dbabd> oradebug settracefileid 10046_SCOTT_DBMSSYSTEM;
Statement processed.
  • 开启10046 event跟踪:
SYS@dbabd> exec dbms_system.set_ev(138,365,10046,12,'');
PL/SQL procedure successfully completed.
  • 关闭10046 event跟踪:
SYS@dbabd> exec dbms_system.set_ev(138,365,10046,0,'');
PL/SQL procedure successfully completed.

SYS@dbabd> exec dbms_system.set_sql_trace_in_session(138,365,false);
PL/SQL procedure successfully completed.

DBMS_MONITOR包开启

DBMS_MONITOR包也可以开启10046 event跟踪,通地包中存储过程SESSION_TRACE_ENABLE来完成。从本文前面部分的说明也可以了解到,级别为12的10046 event跟踪就是包含绑定变量与等待事件信息。关于存储过程SESSION_TRACE_ENABLE选项说明可以参考另一篇博文:DBMS_MONITOR包跟踪,这里以SCOTT用户为例,trace文件标识符为10046_SCOTT_DBMSMONITOR。

  • 配置trace文件标识符
SYS@dbabd> oradebug setospid 9769
Statement processed.
SYS@dbabd> oradebug settracefileid 10046_SCOTT_DBMSMONITOR;
Statement processed.
  • 开启10046 event跟踪
SYS@dbabd> exec dbms_monitor.session_trace_enable(138,365,true,true,'all_executions');
PL/SQL procedure successfully completed.
  • 关闭10046 event跟踪
SYS@dbabd> exec dbms_monitor.session_trace_disable(138,365);
PL/SQL procedure successfully completed.

DBMS_SUPPORT包开启

还有一个DBMS_SUPPORT包可以开启10046 event跟踪。不过这个包的说明在官方文档中没有找到,默认没有安装,可以通过查看Oracle MOS文档安装:How to Install the DBMS_SUPPORT Package (文档 ID 377204.1),关于包的说明也可以参考文档:The DBMS_SUPPORT Package (文档 ID 62294.1)。这里以SCOTT用户为例,trace文件标识符为10046_SCOTT_DBMSSUPPORT。

  • 查看DBMS_SUPPORT包信息
SYS@dbabd> desc dbms_support;
ERROR:
ORA-04043: object dbms_support does not exist

默认没有安装,提示未找到。

  • 安装DBMS_SUPPORT包
SYS@dbabd> @?/rdbms/admin/dbmssupp.sql
Package created.
Package body created. SYS@dbabd> grant execute on dbms_support to schema_owner; -- 授权执行权限给需要用户,如SCOTT SYS@dbabd> create public synonym dbms_support for dbms_support; -- 创建同名的同义词
Synonym created.
  • 查看DBMS_SUPPORT包
SYS@dbabd> desc dbms_support;
FUNCTION MYSID RETURNS NUMBER -- 查询当前会话的SID
FUNCTION PACKAGE_VERSION RETURNS VARCHAR2 -- 查询包版本
PROCEDURE START_TRACE -- 开启当前会话跟踪
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
WAITS BOOLEAN IN DEFAULT
BINDS BOOLEAN IN DEFAULT
PROCEDURE START_TRACE_IN_SESSION -- 开启其他会话跟踪
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN -- 对应SID
SERIAL NUMBER IN -- 对应SERIAL#
WAITS BOOLEAN IN DEFAULT -- 对应是否加入等待事件跟踪
BINDS BOOLEAN IN DEFAULT -- 对应是否加入绑定变量跟踪
PROCEDURE STOP_TRACE -- 关闭当前会话跟踪
PROCEDURE STOP_TRACE_IN_SESSION -- 关闭其他会话跟踪
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN
SERIAL NUMBER IN -- 查询当前会话的SID
SYS@dbabd> select dbms_support.mysid from dual; MYSID
----------
12 -- 查询包版本
SYS@dbabd> select dbms_support.package_version from dual; PACKAGE_VERSION
--------------------------------------------------------------------------------
DBMS_SUPPORT Version 1.0 (17-Aug-1998) - Requires Oracle 7.2 - 8.0.5
  • 配置trace文件标识符
SYS@dbabd> oradebug setospid 9769
Statement processed.
SYS@dbabd> oradebug settracefileid 10046_SCOTT_DBMSSUPPORT;
Statement processed.
  • 开启10046 event跟踪
SYS@dbabd> exec dbms_support.start_trace_in_session(138,365,true,true);
PL/SQL procedure successfully completed.
  • 关闭10046 event跟踪
SYS@dbabd> exec dbms_support.stop_trace_in_session(138,365);
PL/SQL procedure successfully completed.

数据库级别开启

10046 event跟踪也可以在数据库级别开启,但通常很少会这样用,因为会导致所有会话都被跟踪而影响整体性能。当动态开启整个数据库的跟踪时,会对之后创建的每个会话进行跟踪,而已经存在的会话不会被跟踪。

数据库级别的10046 event跟踪通常用于当提前知道会话会出现性能问题,但却无法明确具体是哪个会话时。

当问题会话被定位以及跟踪之后,确认收集了相关的跟踪信息就可以将数据库级别的跟踪进行关闭,因为这会影响系统整体的性能。开启数据库级别跟踪的用户需要有sysdba的权限,动态开启可以使用以下方式:

  • 语句开启10046 event跟踪
SYS@dbabd> alter system set events '10046 trace name context forever,level 12';
System altered.
  • 语句关闭10046 event跟踪
alter system set events '10046 trace name context off';
System altered.

DBMS_MONITOR包也可以开启数据库级别的10046 event跟踪,主要由DATABASE_TRACE_DISABLEDATABASE_TRACE_ENABLE存储过程来完成。关于这两个存储过程的参数选项说明如下:

PROCEDURE DATABASE_TRACE_ENABLE                                          -- 开启
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
WAITS BOOLEAN IN DEFAULT -- 对应是否加入等待事件跟踪
BINDS BOOLEAN IN DEFAULT -- 对应是否加入绑定变量跟踪
INSTANCE_NAME VARCHAR2 IN DEFAULT -- 实例名,如dbabd
PLAN_STAT VARCHAR2 IN DEFAULT
PROCEDURE DATABASE_TRACE_DISABLE -- 关闭
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
INSTANCE_NAME VARCHAR2 IN DEFAULT -- 实例名,如dbabd
  • DBMS_MONITOR包开启10046 event跟踪
SYS@dbabd> exec dbms_monitor.database_trace_enable(true,true,'dbabd','all_executions');
PL/SQL procedure successfully completed.
  • DBMS_MONITOR包关闭10046 event跟踪
SYS@dbabd> exec dbms_monitor.database_trace_disable('dbabd');
PL/SQL procedure successfully completed.

总结

以上总结了主要的几种开启10046 event跟踪的方法,但还是有很多方面并未涉及,包括多会话跟踪、指定sql_id过滤跟踪等,这些跟踪涉及得更为细致,对于具体问题的分析更为有效,日后也会进行总结梳理。对于10046 event产生的trace文件,同样也可以通过tkprof工具进行格式化后增加可阅读性,关于tkprof工具的主要使用方式也可参考另一篇博文:Oracle 11g R2性能优化 tkprof

参考

How To Collect 10046 Trace (SQL_TRACE) Diagnostics for Performance Issues (文档 ID 376442.1)

The DBMS_SUPPORT Package (文档 ID 62294.1)

Oracle TKPROF & SQL_TRACE

https://antognini.ch/2012/08/event-10046-full-list-of-levels/

http://www.juliandyke.com/Diagnostics/Tools/ORADEBUG/ORADEBUG.php

https://www.cnblogs.com/youngerger/p/8541885.html

https://oracle-base.com/articles/misc/sql-trace-10046-trcsess-and-tkprof

☆〖本人水平有限,文中如有错误还请留言批评指正!〗☆

Oracle 11g R2性能优化 10046 event的更多相关文章

  1. Oracle 11g R2性能优化 tkprof

    另一篇博文总结了关于SQL TRACE工具的使用方式,但是产生的trace文件格式阅读起来并不是十分友好,为了更好的分析trace文件,Oracle也自带了一个格式化工具tkprof.tkprof工具 ...

  2. Oracle 11g R2性能优化 SQL TRACE

    作为Oracle官方自带的一种基本性能诊断工具,SQL Trace可以用来评估当前正在运行的SQL语句的效率,同时为该语句生成统计信息等,并保存这些信息到指定路径下的跟踪文件(trace)当中.SQL ...

  3. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

  4. 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cm ...

  5. Oracle 11g r2 Enterprise Manager (EM) 中文页面调整为英文页面

    Oracle 11g r2 Enterprise Manager (EM) 在中文语言环境下, 部分功能(如包含时间的查询数据库实例: orcl  >  指导中心  >  SQL 优化概要 ...

  6. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA

     环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterpris ...

  7. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机HA

    环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterprise ...

  8. centos 安装oracle 11g r2(一)-----软件安装

    centos 安装oracle 11g r2(一)-----软件安装 1.进入管理员权限 [anzerong@localhost ~]# su - root password [root@localh ...

  9. Oracle 11g R2在 win7 64位的安装流程图解【含常见问题解决方案】

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.Oracle 11 ...

随机推荐

  1. ssh项目问题01,为创建数据库抛出的异常

    框架什么都搭建好了,但是一直抛出如图问题,网上资料很多让你设置时间之类的,也设置了还是继续抛异常,最后带我的师傅说没有创建数据库,我都要郁闷死了,网上那么多,很多写的都不能解决问题,还乱写,浪费别人时 ...

  2. lxml.etree.HTML(text) 解析HTML文档

    0.参考 http://lxml.de/tutorial.html#the-xml-function There is also a corresponding function HTML() for ...

  3. 使php支持pdo_mysql

    1.下载pdo_mysql包 wget https://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 2.追加编译php,使其module目录下生产pdo_mysql.so ...

  4. Linux系统(和mac系统)chmod修改权限总结

    在 Mac 系统的终端上修改文件权限使用的是 Linux 中的 chmod 命令. chmod 用户+操作+权限+文件 用户部分:使用字母 u 表示文件拥有者(user),g 表示拥有者所在群组(gr ...

  5. mac上adb command not found

    第一种报错(使用的自带mac命令行) bash: adb: command not found 1.vim ~/.bash_profile ,如果.bash_profile不存在,先touch ~/. ...

  6. bootstrap_栅格系统_响应式工具_源码分析

    -----------------------------------------------------------------------------margin 为负 ​使盒子重叠 ​等高 等高 ...

  7. Go语言基础之map

    Go语言基础之map Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能 ...

  8. [LeetCode] Similar RGB Color 相似的红绿蓝颜色

    In the following, every capital letter represents some hexadecimal digit from 0 to f. The red-green- ...

  9. 27 ArcMap加载天地图服务一片空白怎么办

    在ArcMap中添加WMTS Server,连接上了,但是不显示 天地图升级向导:http://lbs.tianditu.gov.cn/authorization/authorization.html ...

  10. windows系统 phpstudy2018 配置阿里云https最简单的流程!

    一.从阿里去下载ssl文件放到C:\phpStudy\PHPTutorial\Apache\conf\cert 二.首先phpstudy开户php_openssl扩展,具体如下图 一般网上的教程,都要 ...