该脚本适用于新环境数据库的初步检测。
数据库检查:check_db_stats.sql
Rem Rem check_db_stats_v1.2.sql Rem modify by ludatou Rem Rem only for single instance database Rem Rem Rem This script do health check . Rem Must run under system or user has dba privilege. Rem set pages 0 set lines 1000 set trimspool on set head off set feedback off set echo off set verify off Rem get report name based on database name and report date Rem col logname noprint new_value log_name select lower(name)||to_char(sysdate,'yyyymmddhh24mi')||'.txt' logname from v$database; spool &log_name Rem Rem report header Rem prompt select 'Report produced at '||to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual; prompt prompt Basic information: prompt -------------------------------------------------------------------------------- Rem Rem Check database information Rem set head on set pages 45 col dbid heading "Database|ID" format a11 col name heading "Database|Name" col open_mode heading "Open |Mode" col force_logging heading "Force|Logging" format a7 select to_char(dbid,9999999999) dbid , name , open_mode , force_logging from v$database ; Rem Rem Check instance information Rem col instance_name heading "Instance|Name" format a10 col host_name heading "Host|Name" format a10 col status heading "Instance|Status" format a8 col archiver heading "Archiver|Status" format a8 col up_time heading "Running Time" format a30 select host_name , instance_name , status , archiver , trunc(sysdate - startup_time) || ' Days ' || trunc(mod(sysdate-startup_time, 1) *24) || ' Hours ' || trunc(mod((sysdate-startup_time)*24,1)*60) || ' Minutes ' up_time from v$instance ; prompt prompt prompt Check hit ratio prompt These value expected higher than 90% prompt -------------------------------------------------------------------------------- Rem Rem Check buffer cache hit ratio Rem col pr heading "Physical|Reads" format 999,999,999 col prd heading "Phy_Reads|Direct" format 999,999,999 col prl heading "Phy_Reads|Direct_LOB" format 999,999,999 col bg heading "Block|Gets" format 999,999,999,999 col cg heading "Consistent|Gets" format 999,999,999,999 col ht heading "Buffer|Hit Ratio" select to_char((1-((pr - prd - prl) / (bg + cg - prd - prl))) * 100, '999.9')||'%' ht , bg, cg, pr, prd, prl from (select value pr from v$sysstat where name = 'physical reads') pr , (select value prd from v$sysstat where name = 'physical reads direct') prd , (select value prl from v$sysstat where name = 'physical reads direct (lob)') prl , (select value bg from v$sysstat where name = 'db block gets') bg , (select value cg from v$sysstat where name = 'consistent gets') cg ; Rem Rem check library hit ratio Rem col ht heading "Libray|Hit Ratio" format a10 select to_char(sum(pinhits) / sum(pins) * 100, 999.9)||'%' ht from v$librarycache ; prompt prompt Check session informations prompt -------------------------------------------------------------------------------- Rem Rem Check session high water mark Rem col sessions_current heading "Sessions|Current" format 999,999,999 col sessions_highwater heading "Sessions|High Water" format 999,999,999 select sessions_current , sessions_highwater from v$license ; Rem Rem Check session wait events Rem col username heading "User Name" format a15 col program heading "Program" format a35 col event heading "Wait Event" format a25 prompt prompt Session wait events, excluding waiting for user's message prompt _________________ col event format a32 col wait_class format a18 col segment_name format a30 select event, count(*) from v$session_wait where event not in (select name from v$event_name where wait_class = 'Idle') group by event order by 2 desc; Rem Rem Check session status Rem col status heading "Session|Status" col nu heading "Number|of Sessions" compute sum of nu on report break on report prompt prompt Session status prompt ----------------- select status, count(*) nu from v$session where username is not null group by status ; clear break; Rem Rem detail information for sessions which idle for more than 4 hours Rem col lc heading "Idle Time|(Hours)" format a8 col username format a10 heading "Database|Username" col machine format a17 heading "Machine" col osuser format a10 heading "OS|Username" col prg format a35 heading "Program" prompt prompt Idle sessions prompt ----------------- select username, machine, osuser, program prg , to_char(trunc(last_call_et/3600, 1), 99999.9) lc from v$session where last_call_et > 14400 and username is not null order by last_call_et desc ; prompt prompt Redo log files information prompt -------------------------------------------------------------------------------- Rem Rem Online redo logfile information Rem col grp format 99 heading "Log Group|Number" col bytes format 999,999.99 heading "Bytes|(M)" col status heading "Status" col member heading "Log File|Members" format a45 break on grp on bytes on status skip 1 prompt prompt Online redo log file prompt ----------------- select l.group# grp , l.bytes/1024/1024 bytes , l.status , lf.member from v$log l, v$logfile lf where l.group# = lf.group# order by 1 ; clear break; Rem Rem Online redo logfile switch frequency Rem col dt heading "Begin Time (1 hour)" format a25 col cnt heading "Switch times" format 999 prompt prompt Switch frequency prompt ----------------- select to_char(trunc(first_time, 'hh'), 'yyyy-mm-dd hh24:mi') dt , count(*) cnt from v$loghist where first_time > sysdate - 30 group by trunc(first_time,'hh') order by 1 ; Rem Rem Space usage check Rem prompt prompt Tablespace usage prompt -------------------------------------------------------------------------------- col tbsn heading "Tablespace|Name" format a20 col bytes heading "Current|Size(M)" format 999,999.99 col max_b heading "Maximum|Size(M)" format 999,999.99 col fre_b heading "Free Space|Size(M)" format 999,999.99 col usg heading "Free Space|persentage" format a10 col em heading "Extent|Management" format a10 col ssm heading "Segment|Management" format a10 select tb.tbsn , bytes , fre_b , lpad(to_char(nvl(fre_b,0)/bytes*100, 999.99)||'%',10) usg , max_b from (select tablespace_name tbsn, sum(bytes)/1024/1024 bytes , sum( decode(AUTOEXTENSIBLE, 'YES', greatest(bytes, maxbytes), bytes))/1024/1024 max_b from dba_data_files group by tablespace_name ) tb, (select tablespace_name tbsn, sum(bytes)/1024/1024 fre_b from dba_free_space group by tablespace_name ) fre where tb.tbsn = fre.tbsn (+) order by 4 ; prompt prompt Table usage prompt ----------------- set serveroutput on exec dbms_output.enable(100000000); declare type seg is record ( seg_owner dba_segments.owner%type, seg_name dba_segments.segment_name%type, par_name dba_segments.PARTITION_NAME%type, seg_type dba_segments.segment_type%type, tbs_name dba_segments.TABLESPACE_NAME%type ); type usg is record ( t_bck number, t_byt number, u_bck number, u_byt number, luefi number, luebi number, lub number); v_seg seg; v_usg usg; v_tbsname dba_tablespaces.tablespace_name%type; v_tbsseg dba_tablespaces.SEGMENT_SPACE_MANAGEMENT%type; cursor c_tbs is select tablespace_name, SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where CONTENTS = 'PERMANENT' order by 1 ; cursor c_seg is select owner, segment_name, PARTITION_NAME, segment_type from dba_segments where owner not in ('SYS', 'SYSTEM', 'OUTLN', 'DBSNMP', 'WMSYS') and tablespace_name = v_tbsname order by 1, 2, 3 ; begin open c_tbs; fetch c_tbs into v_tbsname, v_tbsseg; while c_tbs%found loop dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'); dbms_output.put_line('Tablespace: '||v_tbsname); dbms_output.put_line ( rpad('Owner',15) ||rpad('Segment Name', 30) ||rpad('Par', 8) ||rpad('Seg Type', 10) ||rpad('Bytes(K)',10) ||'Used(K)' ); dbms_output.put_line ( rpad('-',14, '-')||' ' ||rpad('-',29, '-')||' ' ||rpad('-',7, '-')||' ' ||rpad('-', 9, '-')||' ' ||rpad('-',9, '-')||' ' ||' ------------' ); open c_seg; fetch c_seg into v_seg.seg_owner, v_seg.seg_name, v_seg.par_name, v_seg.seg_type; while c_seg%found loop if v_seg.seg_type in ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION', 'INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION', 'CLUSTER','LOB') then dbms_space.unused_space ( v_seg.seg_owner, v_seg.seg_name, v_seg.seg_type , v_usg.t_bck, v_usg.t_byt, v_usg.u_bck, v_usg.u_byt , v_usg.luefi, v_usg.luebi, v_usg.lub, v_seg.par_name); dbms_output.put_line(rpad(v_seg.seg_owner,15) ||rpad(v_seg.seg_name, 30) ||rpad(substr(nvl(v_seg.par_name,'NULL'),1,7), 8) ||rpad(substr(v_seg.seg_type, 1, 9), 10) ||to_char(v_usg.t_byt/1024, '9,999,999') ||to_char((v_usg.t_byt-v_usg.u_byt)/1024, '9,999,999') ); end if; fetch c_seg into v_seg.seg_owner, v_seg.seg_name, v_seg.par_name, v_seg.seg_type; end loop; close c_seg; fetch c_tbs into v_tbsname, v_tbsseg; end loop; close c_tbs; end; / spool off; exit;
脚本效果:
[ora10g@ludatou ~]$ sqlplus '/as sysdba' SQL*Plus: Release 10.2.0.4.0 - Production on Mon Jul 28 17:25:00 2014 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> @check_db_heath.sql Report produced at 2014-07-28 17:25:04 Basic information: ------------------------------------------------------------------------------- Database Database Open Force ID Name Mode Logging ----------- --------- ---------- ------- 2580936880 LU10G READ WRITE NO Host Instance Instance Archiver Name Name Status Status Running Time ---------- ---------- -------- -------- ------------------------------ ludatou lu10g OPEN STOPPED 1 Days 18 Hours 9 Minutes Check hit ratio These value expected higher than 90% ------------------------------------------------------------------------------- Buffer Block Consistent Physical Phy_Reads Phy_Reads Hit Rat Gets Gets Reads Direct Direct_LOB ------- ---------------- ---------------- ------------ ------------ ------------ 98.8% 221,523 1,181,248 16,972 34 0 Libray Hit Ratio ---------- 95.3% Check session informations ------------------------------------------------------------------------------- Sessions Sessions Current High Water ------------ ------------ 1 10 Session status ---------------- Session Number Status of Sessions -------- ----------- ACTIVE 1 ----------- sum 1 Idle sessions ---------------- Redo log files information ------------------------------------------------------------------------------- Online redo log file ---------------- Log Group Bytes Log File Number (M) Status Members --------- ----------- -------- --------------------------------------------- 1 50.00 CURRENT /oradata/lu10g/redo01.log 2 50.00 INACTIVE /oradata/lu10g/redo02.log 3 50.00 INACTIVE /oradata/lu10g/redo03.log Switch frequency ---------------- Begin Time (1 hour) Switch times ------------------------- ------------ 2014-07-24 13:00 2 2014-07-26 23:00 1 Tablespace usage ------------------------------------------------------------------------------- Tablespace Current Free Space Free Space Maximum Name Size(M) Size(M) persentage Size(M) -------------------- ----------- ----------- ---------- ----------- SYSTEM 480.00 4.25 .89% 32,767.98 SYSAUX 260.00 9.38 3.61% 32,767.98 UNDOTBS1 25.00 21.88 87.50% 32,767.98 USERS 5.00 4.56 91.25% 32,767.98 Table usage ---------------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Tablespace: SYSAUX Owner Segment Name Par Seg Type Bytes(K) Used(K) -------------- ----------------------------- ------- --------- --------- ------------ CTXSYS DR$CLASS NULL TABLE 64 64 CTXSYS DR$INDEX NULL TABLE 64 64 CTXSYS DR$INDEX_ERROR NULL TABLE 64 24 CTXSYS DR$INDEX_PARTITION NULL TABLE 64 24 CTXSYS DR$INDEX_SET NULL TABLE 64 64 CTXSYS DR$INDEX_SET_INDEX NULL TABLE 64 24 CTXSYS DR$INDEX_VALUE NULL TABLE 64 64 CTXSYS DR$NUMBER_SEQUENCE NULL TABLE 64 64 CTXSYS DR$NVTAB NULL TABLE 64 24 CTXSYS DR$OBJECT NULL TABLE 64 64 CTXSYS DR$OBJECT_ATTRIBUTE NULL TABLE 64 64 CTXSYS DR$OBJECT_ATTRIBUTE_LOV NULL TABLE 64 64 CTXSYS DR$POLICY_TAB NULL TABLE 64 24 CTXSYS DR$PREFERENCE NULL TABLE 64 64 CTXSYS DR$PREFERENCE_VALUE NULL TABLE 64 64 CTXSYS DR$SECTION NULL TABLE 64 24 CTXSYS DR$SECTION_GROUP NULL TABLE 64 64 CTXSYS DR$STATS NULL TABLE 64 24 CTXSYS DR$STOPLIST NULL TABLE 64 64 CTXSYS DR$SUB_LEXER NULL TABLE 64 24 CTXSYS DR$THS NULL TABLE 64 24 CTXSYS DR$THS_BT NULL TABLE 64 24 CTXSYS DR$THS_PHRASE NULL TABLE 64 24 CTXSYS DR$WAITING NULL TABLE 64 24 CTXSYS DRC$DEL_KEY NULL INDEX 64 32 CTXSYS DRC$IDX_COLSPEC NULL INDEX 64 32 CTXSYS DRC$IDX_COLUMN NULL INDEX 64 32 CTXSYS DRC$IDX_KEY NULL INDEX 64 32 CTXSYS DRC$IXO_KEY NULL INDEX 64 32 CTXSYS DRC$IXP_KEY NULL INDEX 64 32 CTXSYS DRC$IXS_KEY NULL INDEX 64 32 CTXSYS DRC$IXS_NAME NULL INDEX 64 32 CTXSYS DRC$IXX_KEY NULL INDEX 64 32 CTXSYS DRC$OAT_KEY NULL INDEX 64 32 CTXSYS DRC$OAT_NAME NULL INDEX 64 32 ...............