Erp100论坛's Archiver

xiangzhao 发表于 2008-8-13 10:35

日常监测分析数据库的DBA_Monitor.sql程序

set echo on
spool user_DBA_report.txt
set pages 333 lin 96
rem  ---------------------------------------------------
rem   执行说明:本程序第一部分需要DBA权限,
rem   第二部分针对实际用户,它们拥有表,索引,Source等。
  rem    # cat>; ding92sql
  rem    sqlplus system/passwd@standax <<EOFa1
  rem    @dba_monitor.sql
  rem    connect standaxxx/passwd@standax
  rem    @getuser_objects.sql
  rem    EOFa1
  rem    exit
rem 使用时服务器并不一定要设置为timed_statistics=true。
rem 《ORACLE数据库情况统计分析程序》, 2001.05创作,2003.08整理 Ding Jugang
rem 数据库性能调整包括三方面的内容:(硬件,软件,数据库)
rem 硬件,分别从CPU,Memory,Disk,NetWork提高;软件,就是应用程序的结构优化。
rem 数据库是我们DBA重点关心的,首先了解自己:
rem 表sys.DBA_tables : |名称|行数.变化|列数|Initail|Cache|TSpace|
rem 索引sys.DBA_indexes:|名称|表名|列数|类型|Initial|
rem 约束user_...:|名称|表名|相关性|类型|
rem 查询SQL的频率和效率v_$sqlarea,跟踪记录到sqls表中
rem 定期重建索引,做成脚本: index1rebld.sql, index2rebld.sql
  
rem 1、 参数dbwr_io_slave等三个从属进程可以分别设置为 40:12:6
rem 2、 参数process 一般是实际进程数据的1.5倍, 是为限制进程总数.
rem     process过大则占用系统资源,将降低系统的性能,可适当考虑降低该数值到600
rem 3、 当LOG FILE SWITCH时出现等待时,建议加大REDO LOG FILE,一般是30分钟
rem     一次切换。目前是128MB, 配合4MB LOG_BUFFER已经可以了(8M也不显效果).
rem 4、 在整个系统较繁忙时检测SHARED_POOL(一般情况下应该空余1/4)
rem 5、 SGA应该小于整个物理内存的一半,太大会导致OS内存换页出现(PI/PO)
rem 6、 MTS对于网站应用是理想选择,但在过分繁忙的客户端压力下,MTS会自动失败
rem     而重启专用进程(例如过多的PHP连接),估计是应用类型不兼容。
rem 7、 命令instat,vmstat,top,w 能从OS级评估系统负荷。
rem     监测下面语句的执行结果的变化率,能得出数据库级的硬盘读写流量。
rem select count(FILE#),sum(PHYRDS),sum(PHYWRTS),sum(PHYBLKRD) from sys.V_$filestat;

xiangzhao 发表于 2008-8-13 10:36

rem================================================================
rem 创建SQL跟踪表SQLS
rem  create table SQLS as select * from sys.v_$sqlarea where disk_reads>;500;

rem当需要查询性能时,设置为跟踪模式,并执行下面的查询:
rem insert into sqls select * from sys.v_$sqlarea where disk_reads>;500 and executions<10;
rem 1)最高频率的SQL
rem  select disk_reads,executions,rows_processed,sql_text from SQLS
rem      where  executions>; 99 ;  

rem 2)查询性能最差的SQL:
rem  select disk_reads,executions,rows_processed,first_load_time,sql_text from SQLS
rem   order by first_load_time;
select disk_reads,executions,rows_processed,first_load_time,sql_text  
from sys.v_$sqlarea where disk_reads>;10 and executions <10  order by first_load_time;
rem ========================================================================
rem 567890123456789_1234567890123456789_1234567890123456789_1234567890123456
rem ==RowCache,LibraryCache  依赖于Shared_pool,参看sys.v_$sgastat ===
rem 此二者应当达到95%,实际系统已经达到99%
select (sum(pins - reloads)) / sum(pins) "lib cache" from sys.v_$librarycache;
select (sum(gets-getmisses-usage-fixed)) / sum(gets) from sys.v_$rowcache;
  
rem ==================== SGA ==============================================
rem ======= sys.v_$sgastat,SGA中详细说明 =====================
rem 剩余共享池: 保留Free Memory 大于25%
column name format A46
column value format 999999,999,999
select * from sys.v_$sgastat where rownum<5;

xiangzhao 发表于 2008-8-13 10:36

rem =================== SYS ===============================================
rem ========= sys.v_$SYSstat 详细列表,下面是几个指标的算法=======
rem 数据缓冲命中率:1- 40#/(39#+38#) = 99.8% >; 95%
rem 内存排序成功率:1- 162#/(161#) = 99.4% >; 92%
rem 脏缓冲区平均长度(oracle8i已废除之): 41#/42#=0.06<db_block_size/4
rem 应用效率:全表扫描<1%, 140#long/(139#short+140#long)
column class format 99999
column value format 999999,999,999
select * from sys.v_$sysstat
     where STATISTIC# in (38,39,40,41,42,43,139,140,141,106,161,162,163);

select name, value from v$parameter
where name in ('db_block_buffers',
'db_block_size', 'shared_pool_size','sort_area_size');

rem DETERMINE IF THE DATA BLOCK BUFFERS IS SET HIGH ENOUGH
select 1-(sum(decode(name, 'physical reads', value,0))/
(sum(decode(name, 'db block gets', value,0)) +
sum(decode(name, 'consistent gets', value,0))))
"Read Hit Ratio" from v$sysstat;


rem 日志缓存要满足空间请求极小,每日300次,还可更小:
rem LOG_BUFFER=4MB,还可再大。
rem select * from sys.v_$sysstat where name like 'redo%';
rem  
rem ==================回滚段1==============================================
rem 回滚段有效率:waits/gets<1%  即: 无等待命中率NoWait_Hit_Ratio接近于1
rem  回滚段数据量在4---100个,同样规格大小,尽可能稳定不变。
rem alter TABLESPACE RBS DEFAULT STORAGE
rem   (INITIAL 1M NEXT 1M MINEXTENTS 8 PCTINCREASE 0);
rem CREATE PUBLIC ROLLBACK SEGMENT RB21 TABLESPACE RBS;
rem ALTER ROLLBACK SEGMENT RB21 storage( minextents 4 optimal 8M);
rem CREATE PUBLIC ROLLBACK SEGMENT RB55 TABLESPACE RBS2 storage(minextents 8 optimal 8M);

column Ratios? format 99.9999
select count(*), sum(waits)/sum(gets) from sys.v_$rollstat;

rem rssize>;=最优保留值optimal,shrinks是动态收缩次数,每小时2次是允许的。
rem 例如,统计信息:rssize=8M,extents=8, waits和shrinks 小于每天2次

select usn,extents,gets,writes,rssize,waits,shrinks
  from sys.v_$rollstat;

xiangzhao 发表于 2008-8-13 10:36

rem =======****** 回滚段2 ****===========
rem  这里是回滚段的汇总统计,分析其扩展段之定义。其命中率统计见v_$roolstat
rem dba_rollback_segs 下面验证一致性。

select owner,initial_extent,NEXT_EXTENT,Min_EXTENTS,MAX_EXTENTS,count(*),
   TABLESPACE_NAME,STATUS
from dba_rollback_segs
group by owner,initial_extent,NEXT_EXTENT,min_extents,
   MAX_EXTENTS,TABLESPACE_NAME,STATUS;

rem dba_rollback_segs -->; detail 定义
column SEGMENT_name format a6
column TABLESPACE_NAME format a12
select SEGMENT_name,owner,initial_extent,NEXT_EXTENT,Min_EXTENTS,MAX_EXTENTS,
  TABLESPACE_NAME,STATUS  from dba_rollback_segs;
  
rem ======================== 闩 ===========================================
rem 闩-Oracle内部锁,无等待命中率NoWait_Hit_Ratio接近于1
  
column name format A30
select  name, immediate_gets "Imme_gets",  immediate_misses "Imme_Mis",
round(immediate_gets/(immediate_gets+immediate_misses),3) "nowait_hit_ratio"
from  sys.v_$latch  where immediate_gets+immediate_misses != 0  order by name;
  
rem 闩-Oracle内部锁,命中率HITRATIO(即misses/gets)接近于0
rem  sleeps, immediate_gets "Imme_gets", 为了易于阅览,不要换行
column Mis/Get? format 99.999;
select     name, gets, misses, misses/gets "Mis/Get?",
  immediate_misses "Imme_Mis"
from  sys.v_$latch  where gets >; 0   order by name;
  
rem ================== 系统等待 ===========================================
rem  系统等待累计次数和累计时间
column class format A30
select * from sys.v_$waitstat ;
  
column event format A28
select * from sys.v_$system_event order by TOTAL_WAITS;
  
rem =======================================================================
rem ================ v_$session_wait ======================================
rem  会话正在等待的累计时间seconds
select event,sum(SECONDS_IN_WAIT),count(*)  
  from sys.v_$session_wait group by event ;

rem rdbms ipc message                    3648          6
rem slave wait                          31501         41 太大?
rem =======================================================================
rem  会话等待的累计次数和累计时间
column event format A32
select event,type, sum(total_waits) "Waits",
      sum(time_waited) "SumTime",count(*) "Count"
   from sys.v_$session s, sys.v_$session_event e
   where   s.sid = e.sid
   group by event,type
   order by type ;

xiangzhao 发表于 2008-8-13 10:37

rem =======================================================================
rem  这里是日志文件和控制文件的状态, 可用OS命令 ls -l 细看.
column member format A60
select * from sys.v_$logfile;
  
column name format A60
select * from sys.v_$controlfile;
rem 下面方法可以看出数据库的表空间创建方法。文件名要用单引号。
select 'create tablespace ',f.tablespace_name,
' datafile ' ||f.FILE_NAME||' SIZE '||BYTES/1024/1024||'M REUSE',
' DEFAULT STORAGE (INITIAL '||INITIAL_EXTENT/1024||'K NEXT '||NEXT_EXTENT/1024
||'K MaxEXTENTS '||Max_EXTENTS||' MinEXTENTS '||Min_EXTENTS||' PCTINCREASE '||PCT_INCREASE ||');'
from sys.dba_data_files f,dba_tablespaces ts where f.tablespace_name=ts.tablespace_name
order by f.FILE_id;

rem 创建表的语句,可由exp/imp导入时指定indexfile=''生成,或由DBA-Studio,
rem 及第三方SQL-Explorer,PowerBuilder:DB-Paint得到。

rem =======================================================================
set pages 333 lin 100
column FSFI format 999.999
column Percent format 999.9999
column file_name format A60
column tablespace_name format A15
  
rem  这里是数据库文件的状态, 可用OS命令 ls -l /oracle/h?/*细看.
rem DBF I/O List;
rem select FILE_ID, BYTES,blocks,maxbytes, autoextensible,
rem   TABLESPACE_NAME,file_name
rem   from sys.dba_data_files order by file_name;
  
rem =======数据库文件:读写频率、空闲率、碎片=============================

rem =====   数据库文件: 读写频率 ======

rem  这里是数据库文件的I/O统计状态, DATA >; RBS >; indexes, 但是,
rem  除此之外的Redolog则有更大的流量.(可用OS命令 iostat 5 5)
rem Tablespace DBF I/O weight;
select   FILE#, PHYRDS, PHYWRTS, PHYBLKRD, PHYBLKWRT,
PHYBLKRD + PHYBLKWRT TotalIO,
( PHYBLKRD + PHYBLKWRT )/MaxIO Percent
from sys.V_$filestat,
  (select max(PHYBLKRD + PHYBLKWRT) MaxIO from sys.V_$filestat) ;
rem  下面的方法可以
rem select sum(PHYRDS),sum(PHYWRTS),sum(PHYBLKRD) from sys.V_$filestat;
rem 由于用户要关心的是自己的详细数据的存放位置,下面分别得出index,tables
rem select tablespace_name,table_name,cache,initial_extent/1024 "Init"
rem    from user_tables  order by tablespace_name,table_name;
rem select tablespace_name,table_name,index_name,initial_extent/1024 "Init"
rem    from user_indexes  order by tablespace_name,table_name,index_name;

xiangzhao 发表于 2008-8-13 10:37

rem ======= 数据库文件:空闲率 =======

rem  这里是数据库文件的利用率统计状态, DATA,indexes,RBS 大于25%
rem Tablespace Free/Used/Total %
column %Free format 99.999 ;
select b.file_id "File#",   substr(b.tablespace_name,1,12) "TableSpace",
  b.bytes/1024 "kBytes", (b.bytes- sum(nvl(a.bytes,0)))/1024 "kb-Used",
sum(nvl(a.bytes,0))/1024 "kb-Free",(sum(nvl(a.bytes,0))/(b.bytes))*100 "%Free"
  from sys.dba_free_space  a, sys.dba_data_files b
where a.file_id(+) = b.file_id
group by b.tablespace_name,b.file_id,b.bytes
order  by b.tablespace_name;
  
rem =======数据库文件: 碎片  =======

rem  这里是数据库文件的碎片统计状态,可用Alter tablespace xxx coalesce;整理
rem FSFI free segment frage index
Alter tablespace temp coalesce;
Alter tablespace system coalesce;
Alter tablespace RBS2 coalesce;
Alter tablespace indexes coalesce;
Alter tablespace indexes2 coalesce;
Alter tablespace data coalesce;

select tablespace_name,
Sqrt(max(blocks)/ sum(blocks)) * (100/Sqrt(Sqrt(count(blocks)))) FSFI,
   count(blocks),sum(blocks),max(blocks)
   from sys.dba_free_space group by tablespace_name;
  
rem =======================================================================
rem  这里是表空间的结构,类似回滚段的参数

select initial_extent,NEXT_EXTENT,Min_EXTENTS,MAX_EXTENTS,pct_increase,
  TABLESPACE_NAME,contents
from dba_tablespaces;
  
rem ===========================
rem  这里是表空间中碎片的又一指标,返回结果不精练,不常用.
rem  Segments where extents>;9
rem  select  tablespace_name, segment_type, Extents,bytes,blocks , owner
rem  from sys.dba_segments where extents>;9 order by tablespace_name;
  
rem ========================用户对象======================================
rem  这里是表空间中group的对象(表,索引),索引可调整或重建
rem Objects in every Tablespace
select tablespace_name,owner,count(*)||' Tables' Objects
   from sys.DBA_tables  by Tablespace_name,owner
union  select tablespace_name,owner,count(*)||' Index' Objects
   from sys.DBA_indexes group by Tablespace_name,owner;
rem select * from sys.DBA_indexes where owner='xxx' AND table_NAME LIKE 'ICQ%';
rem user_tables,user_indexes,all_users;

xiangzhao 发表于 2008-8-13 10:37

rem ==========================安全=========================================
rem  这里是数据库授权安全的几个指标(用户,权限,资源),可调整
rem select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from sys.dba_users;
rem select * from sys.DBA_TS_QUOTAS;
rem select * from sys.dba_role_privs;
rem alter user cartoonxx default tablespace data temporary  tablespace temp;
  
rem ===================非缺省的参数========================================
rem  这里是数据库参数中自定义的几个参数指标,可调整init_sid.ora
Rem The init.ora parameters currently in effect:
column name format a34
column  value format a45
rem column  isdefault format a6
select name, value from sys.v_$parameter
where isdefault = 'FALSE'   order by isdefault,name;
  
rem ========================MTS============================================
rem  以下是MTS 多线程服务器的几个性能指标,
rem  参数可查: (关键是mts_dispathers),
rem $ lsnrctl services
rem select name, value,isdefault from sys.v_$parameter
rem  where name like 'mts_%'  order by isdefault,name DESC;
  
select  count(*) "Count",  sum(idle)/(sum(busy)+sum(idle))*100 "Free%" ,
  substr(network,1,23) "Network Dispatcher" from sys.v_$dispatcher
  group by substr(network,1,23);
  
select  count(*) "Count",sum(wait), sum(totalq),   
  ROUND(sum(wait)/(sum(totalq) + 0.01),2) ||' %Sec'
  "Avg Response Queue Wait=1s",
substr(network,1,23) "Net Dispatcher"
  from  sys.v_$queue a, sys.v_$dispatcher b
  where a.type ='DISPATCHER' AND A.PADDR=B.PADDR
  group by substr(network,1,23);
  
select totalq, TYPE, ROUND(wait/(totalq+0.01),2) "%Sec Avg Response Wait=1s"
  from  sys.v_$queue ;
  
rem //SELECT *  FROM   sys.V_$SHARED_SERVER;
select  count(*) "Count", status, sum(idle)/(sum(busy)+sum(idle))*100 "Free%"
from sys.v_$shared_server  group by status;
rem SELECT COUNT(*),STATUS FROM   sys.V_$SHARED_SERVER GROUP BY STATUS;
SELECT count(*), sum(MESSAGES),sum(BYTES),sum(BREAKS) FROM SYS.V_$CIRCUIT;
  
rem alter system set mts_dispatchers='TCP,8';
rem alter system set mts_servers=24;
  
rem ============================================================
rem  =LARGE_pool_size Optional-Para for MTS=  
rem select sum(value) from sys.v_$sesstat a , sys.v_$statname b
rem   where a.statistic# =b.statistic# and name='session uga memory';
rem select sum(value) from sys.v_$sesstat a , sys.v_$statname b
rem   where a.statistic# =b.statistic# and name='session uga memory max';
rem select * from sys.v_$sgastat where pool='shared pool' and name='free memory';
rem xxx select &pumem , &numusers , &sql,(&pumem * &numusers + &sql) from  dual;
rem

xiangzhao 发表于 2008-8-13 10:37

rem ========= 磁盘优化建议 ======================================
rem 建立独立多个独立物理硬盘分区,分别存放[系统/软件/数据1234/备份]等等,
rem   减少磁盘碎片,易于重建系统,保证资源优先级.
rem 建立文件符号连接(快捷方式),易于快速查看和备份文件,例如: ls -l /oracle/h1/*
rem ========== SQL 跟踪选项示例 =========================================
rem 设置跟踪选项SQL_TRACE=TRUE,Timed_statictics=true,Max_dump_file_size=1280*512
rem 在user_dump_dest中记录SID_ora_PID.trc,再用tkprof解释和排序
rem 可以合并*1.trc为一个大文件,
rem $ cat *1.trc >; MD_SID1.trc
rem 从中统计全表扫描的表,建议用Excel打开,可以"="为分隔符,处理列,统计行数(导入DB整理).
rem 从中找出全表扫描的语句
rem $ cat *1.trc|grep FULL >; fullMD_SID1.txt
rem 从中找出select语句
rem $ cat *1.trc|grep select >; selectMD_SID1.txt
rem 从中找出对某表(master)的访问
rem $ cat *1.trc|grep master >; masterMD_SID1.txt
rem $ cat *1.trc|grep MASTER >; MASTERMD_SID1.txt
rem 可以合并*1.trc,
rem $ tkprof MD_SID1.trc MD_SID1.txt explain=dbuser/logpasswd
rem           =============== End of File ==================

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.