5. 分析表和索引(以得到更好的性能)
以下我将展示假如传送参数到一个脚本中:
####################################################################
## analyze_table.sh ##
####################################################################
#!/bin/ksh
# input parameter: 1: passWord # 2: SID
if (($#<1)) then echo "Please enter 'oracle' user password as the first parameter !" exit 0
fi
if (($#<2)) then echo "Please enter instance name as the second parameter!" exit 0
fi
要传入参数以执行该脚本,输入:
$ analyze_table.sh manager oradb1
脚本的第一部分产生了一个analyze.sql文件,里面包含了分析表用的语句。脚本的第二部分分析全部的表:
#################################################################
## analyze_table.sh ##
#################################################################
sqlplus -s '/ as sysdba' 《EOF
set heading off
set feed off
set pagesize 200
set linesize 100
spool analyze_table.sql
select 'ANALYZE TABLE ' || owner || '.' || segment_name ||
' ESTIMATE STATISTICS SAMPLE 10 PERCENT;'
from dba_segments
where segment_type = 'TABLE'
and owner not in ('SYS', 'SYSTEM');
spool off
exit
EOF
sqlplus -s '/ as sysdba' 《EOF
@./analyze_table.sql
exit
EOF
以下是analyze.sql的一个例子:
$ cat analyze.sql
ANALYZE TABLE HIRWIN.JANUSAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE HIRWIN.JANUSER_PROFILE ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE APPSSYS.HIST_SYSTEM_ACTIVITY ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE HTOMEH.QUEST_IM_VERSION ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE JSTENZEL.HIST_SYS_ACT_0615 ESTIMATE STATISTICS SAMPLE 10 PERCENT;
Linux :
#!/bin/bash
####################################################################
## analyze_table.sh ##
####################################################################
# input parameter: 1: passWord # 2: SID
if (($#<1)) ;if [ $# -lt 1 ]
then
echo "Please enter 'sys' user password as the first parameter !"
read pass ; sys 用户口令
fi
if (($#<2))
then
echo "Please enter service name as the second parameter!"
read name ;输入连接的tnsnames中的连接符
fi
sqlplus "sys/$pass@$name as sysdba" 《EOF
set heading off
set feedback off
set pagesize 200
set linesize 100
set echo off
set time off
set term off
set trims on
spool analyze_table.sql
select 'ANALYZE TABLE ' || owner || '.' || segment_name || ' ESTIMATE STATISTICS SAMPLE 10 PERCENT;' from dba_segments where
segment_type = 'TABLE' and owner not in ('SYS', 'SYSTEM');
spool off
exit
EOF
lines=`cat analyze_table.sql|wc -l`
taillines=`expr $lines - 1`
tail -$taillines analyze_table.sql >1.tmp
headlines=`expr $taillines - 1`
head -$headlines 1.tmp > analyze_tab.sql
rm 1.tmp
sqlplus '/ as sysdba' 《EOF
@./analyze_tab.sql
exit
EOF
改进版:
------------------------
#!/bin/bash
####################################################################
## analyze_table.sh ##
####################################################################
# input parameter: 1: passWord # 2: SID
if (($#<1))
then
echo "Please enter 'sys' user password as the first parameter !"
read pass
fi
if (($#<2))
then
echo "Please enter service name as the second parameter!"
read name
fi
sqlplus "sys/$pass@$name as sysdba" 《EOF
set heading off
set feedback off
set pagesize 200
set linesize 100
set echo off
set time off
set term off
set trims on
spool analyze_table.sql
select 'ANALYZE TABLE ' || owner || '.' || segment_name || ' ESTIMATE STATISTICS SAMPLE 10 PERCENT;' from dba_segments where
segment_type = 'TABLE' and owner not in ('SYS', 'SYSTEM');
spool off
exit
EOF
lines=`cat analyze_table.sql|wc -l`
taillines=`expr $lines - 1`
tail -$taillines analyze_table.sql >1.tmp
headlines=`expr $taillines - 1`
head -$headlines 1.tmp > analyze_tab.sql
rm 1.tmp
sqlplus '/ as sysdba' 《EOF
@./analyze_tab.sql
exit
EOF
----------------------------
6. 检查表空间的使用
以下的脚本检测表空间的使用。假如表空间只剩下10%,它将会发送一个警告email。
#####################################################################
## ck_tbsp.sh ##
#####################################################################
#!/bin/ksh
EDITOR=vi; export EDITOR
ORACLE_SID=PPRD10; export ORACLE_SID
ORACLE_BASE=/data/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
TNS_ADMIN=/var/opt/oracle;export TNS_ADMIN
NLS_LANG=american; export NLS_LANG
NLS_DATE_FORMAT='Mon DD YYYY HH24:MI:SS'; export NLS_DATE_FORMAT
ORATAB=/var/opt/oracle/oratab;export ORATAB
PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.; export
PATH
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";export DBALIST
sqlplus -s '/ as sysdba' 《EOF
set feed off
set linesize 100
set pagesize 200
column "USED (MB)" format a10
column "FREE (MB)" format a10
column "TOTAL (MB)" format a10
column PER_FREE format a10
spool tablespace.alert
SELECT F.TABLESPACE_NAME,
TO_CHAR ((T.TOTAL_SPACE - F.FREE_SPACE),'999,999') "USED (MB)",
TO_CHAR (F.FREE_SPACE, '999,999') "FREE (MB)",
TO_CHAR (T.TOTAL_SPACE, '999,999') "TOTAL (MB)",
TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)),'999')||' %' PER_FREE
FROM (
SELECT TABLESPACE_NAME,
ROUND (SUM (BLOCKS*(SELECT VALUE/1024
FROM V$PARAMETER
WHERE NAME = 'db_block_size')/1024)
) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME
) F,
(
SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES/1048576)) TOTAL_SPACE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME
) T
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME
AND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)) < 80;
spool off
exit
EOF
if [ `cat tablespace.alert|wc -l` -gt 0 ]
then
cat tablespace.alert > tablespace.tmp
mailx -s "TABLESPACE ALERT for PPRD10" $DBALIST < tablespace.tmp
fi
警告email输出的例子如下:
TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB) PER_FREE
------------------------------ ---------- ---------- ---------- ----------
SYSTEM 519 401 920 44 %
MILLDATA 559 441 1,000 44 %
SYSAUX 331 609 940 65 %
MILLREPORTS 146 254 400 64 %
linux:
查看表空间使用率
select a.tablespace_name,
round(a.total_size) "total_size(mb)",
round(a.total_size) - round(b.free_size,3) "unsed_size(mb)",
round(b.free_size,3) "free_size(mb)",
round(b.free_size/total_size *100,2) ||'%' free_rate
from
(select tablespace_name,sum(bytes) /1024/1024 total_size
from dba_data_files
group by tablespace_name) a,
(select tablespace_name,sum(bytes)/1024/1024 free_size
from dba_free_space
group by tablespace_name) b
where a.tablespace_name=b.tablespace_name(+);
7. 查找出无效的数据库对象
以下查找出无效的数据库对象:
#####################################################################
##invalid_object_alert.sh
#####################################################################
#!/bin/ksh
EDITOR=vi; export EDITOR
ORACLE_SID=PPRD10; export ORACLE_SID
ORACLE_BASE=/data/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
TNS_ADMIN=/var/opt/oracle;export TNS_ADMIN
NLS_LANG=american; export NLS_LANG
NLS_DATE_FORMAT='Mon DD YYYY HH24:MI:SS'; export NLS_DATE_FORMAT
ORATAB=/var/opt/oracle/oratab;export ORATAB
PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.; export PATH
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";export DBALIST
sqlplus -s '/ as sysdba' 《EOF
set feed off
set heading off
column OWNER format a10
column OBJECT_NAME format a35
column OBJECT_TYPE format a10
column STATUS format a10
spool invalid_object.alert
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS FROM DBA_OBJECTS WHERE STATUS = 'INVALID' ORDER BY OWNER, OBJECT_TYPE,
OBJECT_NAME;
spool off
exit
EOF
if [ `cat invalid_object.alert | wc -l` -gt 0 ] then
mailx -s "INVALID OBJECTS for PPRD10" $DBALIST < invalid_object.alert
fi
$ more invalid_object.alert
PUBLIC ALL_WM_LOCKED_TABLES SYNONYM INVALID
PUBLIC ALL_WM_VERSIONED_TABLES SYNONYM INVALID
PUBLIC DBA_WM_VERSIONED_TABLES SYNONYM INVALID
PUBLIC SDO_CART_TEXT SYNONYM INVALID
PUBLIC SDO_GEOMETRY SYNONYM INVALID
PUBLIC SDO_REGAGGR SYNONYM INVALID
PUBLIC SDO_REGAGGRSET SYNONYM INVALID
PUBLIC SDO_REGION SYNONYM INVALID
PUBLIC SDO_REGIONSET SYNONYM INVALID
PUBLIC USER_WM_LOCKED_TABLES SYNONYM INVALID
PUBLIC USER_WM_VERSIONED_TABLES SYNONYM INVALID
PUBLIC WM_COMPRESS_BATCH_SIZES SYNONYM INVALID
8. 监视用户和事务(死锁等)
以下的脚本在死锁发生的时候发送一个警告e-mail:
###################################################################
## deadlock_alert.sh ##
###################################################################
#!/bin/ksh
EDITOR=vi; export EDITOR
ORACLE_SID=PPRD10; export ORACLE_SID
ORACLE_BASE=/data/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
TNS_ADMIN=/var/opt/oracle;export TNS_ADMIN
NLS_LANG=american; export NLS_LANG
NLS_DATE_FORMAT='Mon DD YYYY HH24:MI:SS'; export NLS_DATE_FORMAT
ORATAB=/var/opt/oracle/oratab;export ORATAB
PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.; export PATH
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";export DBALIST
sqlplus -s '/ as sysdba' 《EOF
set feed off
set heading off
spool deadlock.alert
SELECT SID, DECODE(BLOCK, 0, 'NO', 'YES' ) BLOCKER,
DECODE(REQUEST, 0, 'NO','YES' ) WAITER
FROM V$LOCK
WHERE REQUEST > 0 OR BLOCK > 0
ORDER BY block DESC;
spool off
exit
EOF
if [ `cat deadlock.alert | wc -l` -gt 0 ]
then
mailx -s "DEADLOCK ALERT for PPRD10" $DBALIST < deadlock.alert
fi
四、结论
0,20,40 7-17 * * 1-5 /dba/scripts/ckinstance.sh > /dev/null 2>&1
0,20,40 7-17 * * 1-5 /dba/scripts/cklsnr.sh > /dev/null 2>&1
0,20,40 7-17 * * 1-5 /dba/scripts/ckalertlog.sh > /dev/null 2>&1
30 * * * 0-6 /dba/scripts/clean_arch.sh > /dev/null 2>&1
* 5 * * 1,3 /dba/scripts/analyze_table.sh > /dev/null 2>&1
* 5 * * 0-6 /dba/scripts/ck_tbsp.sh > /dev/null 2>&1
* 5 * * 0-6 /dba/scripts/invalid_object_alert.sh > /dev/null 2>&1
0,20,40 7-17 * * 1-5 /dba/scripts/deadlock_alert.sh > /dev/null 2>&1
通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。
(文章来自网络,如有侵权请来信告知,本站将在第一时间删除。)
总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089
中国UNIX用户协会 Copyright 2010 ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号 京公网安备110108006275号