数据库性能监控?数据库性能监视的主要指标有
大家好,感谢邀请,今天来为大家分享一下数据库性能监控的问题,以及和数据库性能监视的主要指标有的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
如何查询Oracle性能监控
如果程序中使用了临时的LOB类型变量,Oracle会分配临时空间,如果并发很高,初始区很大,那么数据库可能产生严重的TEMP表空间的不足问题.可以通过测试轻易再现这种状况,在多个Session中执行如下代码:declare A CLOB;BEGIN A:=‘ABC‘; DBMS_LOCK.SLEEP(120);END;
查询v$sort_usage视图,可以获得临时表空间的使用情况(哪个用户、哪个Session因为什么原因使用了多少临时表空间):select s.username, s.sid, u.tablespace, u.contents, u.segtype,round(u.blocks*8192/1024/1024,2) MB from v$session s, v$sort_usage u where s.saddr= u.session_addrand u.contents=‘TEMPORARY‘ order by MB DESC;
SEGTYPE=SORT的是因为排序而用到临时表空间的。SEGTYPE=LOB_DATA是因为使用了临时的LOB类型变量而用到临时表空间的。
参考:http://www.eygle.com/archives/2006/03/lob_and_temporary_tablespace.html
实验:SQL> select max(sid) from v$mystat; MAX(SID)---------- 45SQL> DECLARE2 a clob;3 BEGIN4 dbms_lob.createtemporary(a, TRUE,dbms_lob.call);5 dbms_lob.freetemporary(a);6 END;7/PL/SQL procedure successfully completed.SQL> select count(*) from dual; COUNT(*)---------- 1SQL> SELECT se.inst_id, 2 se.username username, 3 se.SID sid, 4 se.status status, 5 se.sql_hash_value, 6 se.prev_hash_value, 7 su.TABLESPACE tablespace, 8 su.segtype, 9 su.CONTENTS CONTENTS,10 round(su.blocks* 8192/ 1024/ 1024, 2) MB 11 FROM gv$session se,12 gv$sort_usage su13 WHERE se.saddr=su.session_addr14 AND se.inst_id=su.inst_id15 ORDER BY MB;INST_ID USERNAME SID STATUS SQL_HASH_VALUE PREV_HASH_VALUE TABLESPACE SEGTYPE CONTENTS MB---------------------------------------------------------------------------------- 1 SYS 45 INACTI 317853294 317853294 TEMP LOB_DATA TEMPORARY 1
此时CLOB占用的TEMP空间不会自动释放,需要等待会话断开,才能释放。但这个空间,在本会话中,还是可以重用的,只是不供其它会话使用。
在10.2.0.3以前,只能让会话退出,以释放这部份空间,在10.2.0.4中当作一个BUG(Bug:5723140)来修复,但默认不激活,需要通过设置60025事件才可以释放这些lob的TEMP空间。参考:http://www.dbaroad.me/archives/2009/09/lob_temp.html
LOB类型变量:数据库中提供了两种字段类型 Blob和 Clob用于存储大型字符串或二进制数据(如图片)。 Blob采用单字节存储,适合保存二进制数据,如图片文件。 Clob采用多字节存储,适合保存大型文本数据。
临时表空间优化:(一)、创建用户时要记得为用户创建临时表空间。(二)、合理设置PGA,减少临时表空间使用的几率。(三)、要为临时表空间保留足够的硬盘空间。参考:http://database.51cto.com/art/200907/132965.htm
查看临时表空间占用率:select* from v$temp_space_header;
重建临时表空间的方法:Temporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。查看目前的Temporary TablespaceSQL> select name from v$tempfile;
NAME———————————————————————D:\ORACLE\ORADATA\ORCL\TEMP01.DBF
SQL> select username,temporary_tablespace from dba_users;USERNAME TEMPORARY_TABLESPACE------------------------------------------------------------MGMT_VIEW TEMPSYS TEMPSYSTEM TEMPDBSNMP TEMPSYSMAN TEMP
创建中转临时表空间create temporary tablespace TEMP1 TEMPFILE
‘D:\ORACLE\ORADATA\ORCL\temp02.DBF‘ SIZE 512M REUSE AUTOEXTEND ON NEXT
1M MAXSIZE UNLIMITED;改变缺省临时表空间为刚刚创建的新临时表空间temp1alter database default temporary tablespace temp1;删除原来临时表空间drop tablespace temp including contents and datafiles;重新创建临时表空间create
temporary tablespace TEMP TEMPFILE‘D:\ORACLE\ORADATA\ORCL\temp01.DBF‘
SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;重置缺省临时表空间为新建的temp表空间alter database default temporary tablespace temp;删除中转用临时表空间drop tablespace temp1 including contents and datafiles;
以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正的治本的方法是找出数据库中消耗资源比较大的sql语句,然后对其进行优化处理。参考:http://lanmh.javaeye.com/blog/643676
5、监控LibraryCache SELECT(SUM(PINS- RELOADS))/ SUM(PINS)"LIB CACHE" FROM V$LIBRARYCACHE;
SELECT(SUM(GETS- GETMISSES- USAGE- FIXED))/ SUM(GETS)"ROW CACHE" FROM V$ROWCACHE;
SELECT SUM(PINS)"EXECUTIONS", SUM(RELOADS)"CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE;
后者除以前者,此比率小于1%,接近0%为好。 SELECT SUM(GETS)"DICTIONARY GETS",SUM(GETMISSES)"DICTIONARY CACHE GET MISSES"FROM V$ROWCACHE
查找不能被充分共享利用的SQL语句(查询LibraryCache中执行次数偏低的SQL语句):SELECT sql_text FROM v$sqlarea WHERE executions< 5 ORDER BY UPPER(sql_text);
查找SQL执行次数和SQL解释次数(hard parse),对比两个值的差:SELECT sql_text, parse_calls, executions FROM v$sqlarea ORDER BY parse_calls;
查询v$librarycache视图的Reloads值(reparsing)的值,值应该接近0,否则应该考虑调整shared pool sizeinvalidations的值也应该接近0select namespace,gethitratio,pinhitratio,reloads,invalidations from v$librarycache;
重点关注SQL的命中率:SELECT gethitratio FROM v$librarycache WHERE namespace=‘SQL AREA‘;查看指定某条SQL语句的执行情况(执行次数、加载次数等):SELECT sql_text, users_executing, executions, loads FROM v$sqlarea where sql_text like‘select* from hr.tt‘;
*SQL语句运行过程1).使用hash算法得到sql语句的hash_value值2).如果hash_value值在内存中,叫做命中执行软解析3).如果hash_value值不存在,执行硬解析4).语法解析,查看是否有错误5).语意解析,查看权限是否符合6).若有视图,取出视图的定义7).进行sql语句的自动改写,如将子查询改写为连接8).选择最优的执行计划9).变量绑定10).运行执行计划11).返回结果给用户因为软解析是从此11步骤中第9步开始的,因此软解析比硬解析节约大量的系统开销,应该尽量降低硬解析的次数
诊断:1)检查v$librarycache中sql area的gethitratio是否超过90%,如果未超过90%,应该检查应用代码,提高应用代码的效率:Select gethitratio from v$librarycache where namespace=‘SQL AREA‘;2) v$librarycache中reloads/pins的比率应该小于1%,如果大于1%,应该增加参数shared_pool_size的值:Select sum(pins)"executions", sum(reloads)"cache misses",sum(reloads)/sum(pins) from v$librarycache;reloads/pins>1%有两种可能,一种是library cache空间不足,一种是sql中引用的对象不合法。3)查看某个session的hard parse个数:select
a.sid,a.value from v$sesstat a,v$session b,v$statname c where
a.sid=b.sid and a.statistic#=c.statistic# and a.sid= 137 and
c.name=‘parse count(hard)‘;
调优方法:1)、调整shared_pool_sizeSELECT shared_pool_size_for_estimate AS pool_size,estd_lc_size,estd_lc_time_saved FROM v$shared_pool_advice;
Alter System set shared_pool_size=120M;
2)、书写程序是尽量使用变量不要过多的使用常量实验:创建表格SQL>CREATE TABLE m(x int);创建存储过程proc1,使用绑定变量SQL>CREATE OR REPLACE PROCEDURE proc1ASBEGIN FOR i IN 1..10000 LOOPExecute immediate‘INSERT INTO m VALUES(:x)‘ USING i; END LOOP;END;/创建存储过程proc2,不使用绑定变量SQL>CREATE OR REPLACE PROCEDURE proc2ASBEGIN FOR i IN 1..10000 LOOPExecute immediate‘INSERT INTO m VALUES(‘||i||‘)‘; END LOOP;END;/执行proc2和proc1,对比执行效率SQL>SET TIMING ONSQL> exec proc2;PL/SQL procedure successfully completed.Elapsed: 00:00:08.93SQL> select count(*) from m; COUNT(*)---------- 10000Elapsed: 00:00:00.01SQL> TRUNCATE TABLE m;Table truncated.Elapsed: 00:00:01.76SQL> exec proc1;PL/SQL procedure successfully completed.Elapsed: 00:00:01.85SQL> select count(*) from m; COUNT(*)---------- 10000Elapsed: 00:00:00.00
3)、修改cursor_sharing参数为similar,让类似的SQL语句不做hard parse:有时候我们的应用程序没有使用绑定变量,而修改程序可能有点困难,我们可能需要设置CURSOR_SHARING=SIMILAR来强制ORACLE使用绑定变量。Show parameter cursorAlter system set cursor_sharing=SIMILAR参考:http://blog.csdn.net/biti_rainy/archive/2004/07/12/39466.aspxhttp://space.itpub.net/519536/viewspace-562987http://wiki.oracle.com/page/CURSOR_SHARING实验:SQL> show parameter cursor_sharingcursor_sharing string EXACTSQL> select* from test where object_id=1;no rows selectedSQL> select sql_text,parse_calls from v$sqlarea where sql_text like‘select* from test%‘;select* from test where object_id=:"SYS_B_0" 2select* from test where object_id=1 1SQL> alter system flush shared_pool;System altered.SQL> alter system flush shared_pool;System altered.SQL> alter session set cursor_sharing=similar;----secondSession altered.SQL> select* from test where object_id=1;no rows selectedSQL> select sql_text,parse_calls from v$sqlarea where sql_text like‘select* from test%‘;select* from test where object_id=:"SYS_B_0" 1SQL> select* from test where object_id=2;no rows selectedSQL> select sql_text,parse_calls from v$sqlarea where sql_text like‘select* from test%‘;select* from test where object_id=:"SYS_B_0" 2
4)、大对象保留查找没有保存在library cache中的大对象:Select* from
v$db_object_cache where sharable_mem>10000 and type in
(‘PACKAGE‘,‘PROCEDURE‘,‘FUNCTION‘,‘PACKAGE BODY‘) and kept=‘NO‘;将这些对象保存在library cache中:Execute dbms_shared_pool.keep(‘package_name‘);对应脚本:dbmspool.sql
参考:http://database.51cto.com/art/201004/194003.htm
6、找使用CPU多的用户session select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 valuefrom v$session a,v$process b,v$sesstat cwhere c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;*12是cpu used by this session
再找出使用CPU多的SQL语句:查找指定SPID正在执行的SQL语句:SELECT P.pid pid,S.sid sid,P.spid spid,S.username username,S.osuser osname,P.serial# S_#,P.terminal,P.program program,P.background,S.status,RTRIM(SUBSTR(a.sql_text, 1, 80)) SQLFROM v$process P, v$session S,v$sqlarea A WHERE P.addr= s.paddrAND S.sql_address= a.address(+) AND P.spid LIKE‘%&1%‘;
*在linux环境可以通过ps查看进程信息包括pid,windows中任务管理器的PID与v$process中pid不能一一对应。
windows是多线程服务器,每个进程包含一系列线程。这点于unix等不同,Unix每个Oralce进程独立存在,在Nt上所有线程由Oralce
进程衍生。
指定SID查看正在执行的SQL语句:SELECT P.pid pid,S.sid sid,P.spid spid,S.username username,S.osuser osname,P.serial# S_#,P.terminal,P.program program,P.background,S.status,RTRIM(SUBSTR(a.sql_text, 1, 80)) SQLFROM v$process P, v$session S,v$sqlarea A WHERE P.addr= s.paddrAND S.sql_address= a.address(+) AND s.sid=‘136‘;
7、回滚段的争用情况: select name,waits,gets,waits/gets ratio from v$rollstat a,v$rollname b where a.usn=b.usn;
对含有回滚段块的缓冲区的争用也会影响到对回滚段的争用。这可以通过查询动态性能表V$WAITSTAT来检测是否存在对回滚段的争用,例如:SELECT class,count FROM V$WAITSTAT WHERE class IN(‘system undo header‘,‘system undo block‘,‘undo header‘,‘undo block‘);其中参数含义如下:◆ system undo header:对含有SYSTEM回滚段标题块的缓冲区的等待次数。◆ system undo block:对含有SYSTEM回滚段非标题块的缓冲区的等待次数。◆ undo header:对含有非SYSTEM回滚段标题块的缓冲区的等待次数。◆ undo block:对含有非SYSTEM回滚段非标题块的缓冲区的等待次数。
如果任何等待次数大于总请求数的1%,则应创建更多的回滚段来减少竞争,可以周期性地检查这些统计数字,并将它与总的请求数据的次数作比较。总的请求数据次数可用如下语句求出:SELECT SUM(value) FROM V$SYSSTAT WHERE name IN(‘db block gets‘,‘consistent gets‘);
8.查询 Buffer命中率
select 1-((physical.value- direct.value- lobs.value)/ logical.value)"Buffer Cache Hit Ratio" from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logicalwhere physical.name=‘physical reads‘and direct.name=‘physical reads direct‘and lobs.name=‘physical reads direct(lob)‘and logical.name=‘session logical r
数据库监控是做些什么的
深入了解数据库响应对于单个web事务的效率。跟踪在应用程序中执行后台事务的数据库响应时间,这些事务是在后台线程中生成的。数据库性能监视器可以查明阻碍优化应用程序性能的SQL语句,并允许用户分析错误跟踪,在数据库性能问题影响您的业务之前解决它们。获取详细的性能指标,识别慢速的数据库调用、以及通过详细的图形和表格表示数据库的总体性能。
数据库监控是Applications Manager重要功能之一,它能够帮助数据库管理员(DBA)和系统管理员监控包含Oracle、SQL Server、MySQL、Sybase、IBM DB2等多种类异构型的数据库环境。作为无代理的数据库监控工具,Applications Manager通过执行数据库查询来采集性能数据。当数据库性能超过阈值时,生成告警通知管理员。通过直观丰富的数据库性能报表,DBA可以快速排查故障问题以及规划容量。网页链接
数据库性能监视的主要指标有
数据库性能监视的指标主要有:
1.吞吐量:数据库的处理能力,开始监视数据库的最简单方法是跟踪数据库接收的请求数。我们对数据库抱有很高的期望;我们希望它们能够可靠地存储数据并处理我们向它们提出的所有查询,这可能是一天中的一次大量查询,或者是用户整天的数百万次查询。吞吐量可以告诉您具体的处理情况。
2.执行时间:数据库完成工作需要多长时间这个指标看起来很明显,但往往被忽视了。您不仅想知道数据库收到了多少请求,还想了解数据库在每个请求上花费了多长时间。然而,使用上下文来处理执行时间非常重要:对于像InfluxDB这样的时间序列数据库而言,缓慢可能意味着毫秒,对于像MySQL这样的关系数据库的SLOW_QUERY变量默认值是10秒。
3.并发:数据库同时执行了多少个作业,一旦您知道数据库处理了多少请求以及每个请求需要多长时间,您就需要添加一层复杂性以开始从这些指标中获取实际价值。并发任务的数量会改变数据库资源的使用方式。当您考虑连接数和线程数等事项时,您将开始更全面地了解数据库指标。并发还可以影响延迟,其不仅包括完成任务所花费的时间(执行时间),还包括任务在处理之前需要等待的时间。
4.利用率:数据库繁忙的时间百分比是多少,利用率是描述吞吐量,执行时间和并发性的高峰值时,用于确定数据库可用的频率,或者,数据库忙于响应请求的频率。
此度量标准对于确定数据库的整体运行状况和性能特别有用。如果只有80%的时间可以响应请求,则可以重新分配资源,进行优化或以其他方式进行更改以更接近高可用性。
如果你还想了解更多这方面的信息,记得收藏关注本站。