()OracleSQL跟踪技术—在职员工(技术篇)部门:培训部日期:2012.03.23本文档及其所含信息为内部保密材料,由北京九恒星科技股份有限公司拥有,公司专属知识产权未经书面授权,不得对外泄露COPYRIGHT©保留所有权利课程修订修订编号修订作者变更页码版本号变更日期课程状态备注第一次郭鹏1-74V1.02012-03-26待评审第二次第三次第四次第五次第六次课程介绍您将掌握SQL跟踪技术原理、方法及过程,熟悉动态性能视图表的作用及用法,掌握SQLTrace、TKPROF工具应用,并能分析各类ORACLE语句问题,为实际工作做到方法的指引。课程名称《OracleSQL跟踪技术》培训目标实施、开发、测试岗位各级技术人员培训对象2个小时培训课时培训方式面授课程层级初、中级培训内容纲要通过本次培训,您将学习到以下核心内容:数据库连接体系结构客户端、服务器SQL跟踪原理及过程方法SQLTrace工具介绍、使用方法及实践TKPROF工具介绍、使用方法及实践目录TABLEOFCONTENTS一、数据库连接体系介绍二、SQL跟踪原理解析三、Oracle“SQLTarce”工具用法四、Oracle“TKPROF”工具用法五、Q&A单击此处添加段落文字内容DB网络连接架构•多进程(单线程)P/T•单进程多线程P/T•多进程多线程P/T流行单击此处添加段落文字内容三层技术架构DatabaseMCVCacheAJAX(AsynchronousJavaScriptandXML)JPA(HibernateEntityManager)JSPHTMLEXTServletControllerQuartzJBMPRPCJMS业务逻辑…SpringJersey(JAXRS)WEB服务器单击此处添加段落文字内容DB连接模式OracleServer对外提供两种服务的链接:•共享服务器模式多个连接过来,则后台只有一个进程进行服务。•专有服务器模式一个连接过来,则后台生成一个单独的进程进行服务。(selectsid,serial#,username,status,program,serverfromv$sessionwhereusernameisnotnull;)单击此处添加段落文字内容DB连接模式DB采用专有服务器模式:目录TABLEOFCONTENTS二、SQL跟踪原理解析一、数据库连接体系介绍三、Oracle“SQLTarce”工具用法四、Oracle“TKPROF”工具用法五、Q&A单击此处添加段落文字内容任务假如很多用户访问DB服务器,我如何知晓:1.是那个用户访问DB服务器?2.那个用户对应那个事务?3.那个事务执行很慢?(如何找到对应SQL语句)单击此处添加段落文字内容1.netstat查询两台计算机TCP、UDP连接情况信息Linux/UNIX下:netstat–antpWin下:netstat-ano|findstrTCP工具单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程步骤一:通过客户端连接DB服务器单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程步骤二:从DB服务器查询数据库客户端连接信息。命令为::netstat–antp|more如下图红框所示,查看单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程ps-ef|grep4311ps-ef|grep4317此时通过在DB服务器端运行netstat命令,我们找到与客户端通信的DB服务器端进程信息:4311和4317则:单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程步骤三:通过在客户端键入如下命令,查看客户端连接进程信息及客户端进程信息:netstat–bnetstat-ano单击此处添加段落文字内容工具介绍采用工具:列出当前连接DB的用户数列出当前DB有多少事务查看当前执行的SQL语句DB服务器进程信息单击此处添加段落文字内容1.v$session数据字典关注点:•SADDR:Sessionaddress•SID:唯一标识Sessionidentifier•PADDR:拥有这个会话的进程地址•USERNAME:用户名空的标识是oracle的实例,后台进程的process内部session•PROCESS:操作系统客户机进程ID•MACHINE:客户端machinename。•SQL_ADDRESS:指当前执行的SQL语句的地址•PREV_SQL_ADDR:找到上一次已经执行过的SQL语句地址•SERVER:servertype(dedicatedorshared)•OSUSER:客户端操作系统用户名•PROGRAM:客户端应用程序•STATUS:Statusofthesession:A.ACTIVE-SessioncurrentlyexecutingSQLB.INACTIVE-等待操作C.KILLED-被标注为删除selectsaddr,sid,paddr,PROCESS,username,statusfromv$session;v$session单击此处添加段落文字内容1.v$transaction数据字典关注点:•ADDR:标识这个事务的唯一地址•SES_ADDR:用户会话对象地址与session的SADDR挂钩selectADDR,SES_ADDRfromv$transaction;v$transaction单击此处添加段落文字内容1.v$process数据字典:包含oracle运行的所有进程信息。常被用于将oracle或服务进程的操作系统进程ID与数据库session之间建立联系。关注点:•ADDR:进程对象地址•SPID:操作系统进程ID•PID:Oracle进程identifier•USERNAME:操作系统进程的用户名。并非Oracle用户名。•PROGRAM:进程正在执行的程序,和v$session中的program类似。selectaddr,spidfromv$process;v$process单击此处添加段落文字内容1.v$sql数据字典关注点:•sql_text:前1000个字符•addressselectsql_text,addressfromv$sql;v$sql单击此处添加段落文字内容查看当前所有非系统用户的连接DB信息:spid(操作系统进程)--连接DB客户端的进程号(netstat–antp查)machine--DB所在服务器机器名selectp.spid,sid,paddr,s.program,osuser,machine,PROCESS,s.username,statusfromv$sessions,v$processpwherep.addr=s.paddrands.usernameisnotnull;练习单击此处添加段落文字内容动态性能视图分析获取客户端、服务器端进程信息,结合db数据字典,将获取一系列数据库信息:#单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程步骤四:1.查询v$transaction数据字典,查看当前存在的事务信息及SES_ADDR如下:selectaddr,ses_addrfromv$transaction;2.根据v$transaction中SES_ADDR字段,从v$session查询如下信息及对象的PADDR:selectsaddr,sid,paddr,username,statusfromv$session;selectsaddr,sid,paddr,serial#,username,status,prev_sql_addr,prev_hash_valuefromv$session;单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程3.根据v$session中信息及PADDR,从v$process表中查询ADDR及服务器端对应的进程SPID:selectaddr,spidfromv$process;单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程4.根据从v$process表中查询到的SPID,通过如下查询该DB服务器运行的进程信息:单击此处添加段落文字内容跟踪、监控客户端连接db服务器过程5.在DB服务器端运行命令,如下所示:单击此处添加段落文字内容步骤五:从v$session表中获取SQL_ADDRESS字段与PREV_SQL_ADDR字段。selectsid,prev_sql_addr,username,statusfromv$session;如何知道该进程执行的SQL语句单击此处添加段落文字内容如何知道该进程执行的SQL语句步骤六:根据v$session表中查询到的PREV_SQL_ADDR字段,再从v$sql表中查询到如下信息。selectsql_text,addressfromv$sqlwhereaddress=‘3091B2DC’;最后就找到了那个用户从什么客户端发送什么样的语句到服务器端什么进程去处理的整个过程,从而获取。单击此处添加段落文字内容跟踪语句小结--查找sesssionselectsid,serial#,username,status,machine,osuser,program,logon_timefromv$sessionwherestatus=upper('INACTIVE')orderbylogon_timeasc;selectaddr,ses_addrfromv$transaction;selectsaddr,sid,serial#,username,statusfromv$session;selectsaddr,sid,serial#,username,status,prev_sql_addr,prev_hash_valuefromv$session;--查找活动用户客户端进程号,程序、tranactionselectsid,username,MACHINE,process,programfromv$transactiont,v$sessionswheret.ses_addr=s.saddr;selectaddr,pid,spid,programfromv$process;selectsaddr,sid,paddr,username,statusfromv$session;--根据sid,查找相应inactivesessions对应的sql操作selectsql_text,address,hash_valuefromv$sqlq,v$sessionswheres.sid=144ands.prev_sql_addr=q.address;单击此处添加段落文字内容跟踪语句小结--查看当前用户的spid:selectspidfromv$processp,v$sessionswheres.audsid=userenv('sessionid')ands.paddr=p.addr;selectspidfromv$processpjoinv$sessionsonp.addr=s.paddrands.audsid=userenv('sessionid');查看当前用户的sid和serial#:selectsid,serial#,statusfromv$sessionwhereaudsid=userenv('sessionid');查看当前用户的tracefile路径:selectp.value||'\'||t.instance||'_ora_'||ltrim(to_char(p.spid,'fm99999'))||'.trc'fromv$processp,v$sessions,v$parameterp,v$threadtwherep.addr=s.paddrands.audsid=userenv('sessionid')andp.name='user_dump_dest';单击此处添加段落文字内容跟踪语句小结--已知spid,查看当前正在执行或最近一次执行的语句:select/*+ordered*/