ORACLE数据库管理员的职责
一.概述
ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控:
(1). 每天对ORACLE数据库的运行状态,日志文件,备份情况,数据库的空间使用情况,数据库的性能情况,系统资源的使用情况进行检查,发现并解决问题。
(2). 每周对数据库对象的空间扩展情况,数据的增长情况进行监控,对数据库做健康检查,对数据库的安全情况做检查,对数据库对象的状态做检查。
(3). 每月对表和索引等进行Analyze,检查表空间碎片,寻找数据库性能调整的机会,进行数据库性能调整,查看I/O瓶颈,检查数据增长速度,提出下一步空间管理计划。对ORACLE数据库状态进行一次全面检查。
二.每天的工作
1 确认所有的INSTANCE状态正常
登陆到所有数据库或例程,检测ORACLE后台进程:
$ps –ef | grep ora
问题:
2 检查文件系统的使用(剩余空间)
如果文件系统的剩余空间小于20%,需删除不用的文件以释放空间。
$df –k
df –m
df -h
3 检查日志文件
trace文件记录alert和trace文件中的错误。
3.1 连接到每个需管理的系统
3.2 使用’telnet’
3.3 对每个数据库,cd 到bdump目录,通常是$ORACLE_BASE/<SID>/bdump
3.4 使用 Unix ‘tail’命令来查看alert_<SID>.log文件
3.5 如果发现任何新的ORA- 错误,记录并解决,同时检查重复出现的ORA-错误,记录并仔细研究。
grep ORA- ALERT_SID.LOG
4 检查数据库当日备份的有效性
对RMAN备份方式:
检查第三方备份工具的备份日志以确定备份是否成功。
对EXPORT备份方式:
检查exp日志文件以确定备份是否成功
对其他备份方式:
检查相应的日志文件。(检查备份的磁带文档是否成功)
5 检查数据文件的状态
记录状态不是“online”的数据文件,并做恢复
Select file_name from dba_data_files where status='OFFLINE';
6 检查在表空间中的剩余空间
对每一个实例来说,检查在表空间中是否存在有剩余空间来满足当天的预期的需要。当数据库中已有的数据是稳定的,数据日增长的平均数也是可以计算出来,最小的剩余空间至少要能满足每天数据的增长。
6.1 检查剩余空间
SELECT tablespace_name, sum ( blocks ) as free_blk , trunc ( sum ( bytes ) /
(1024*1024) ) as free_m, max ( bytes ) / (1024) as big_chunk_k, count (*) as num_chunks FROM dba_free_space GROUP BY tablespace_name
/
6.2 检查剩余空间百分率
SELECT tablespace_name, max_m, count_blocks free_blk_cnt, sum_free_m,to_char(100*sum_free_m/sum_m, '99.99') || '%' AS pct_free
FROM ( SELECT tablespace_name,sum(bytes)/1024/1024 AS sum_m FROM dba_data_files GROUP BY tablespace_name),
( SELECT tablespace_name AS fs_ts_name, max(bytes)/1024/1024 AS max_m, count(blocks) AS count_blocks, sum(bytes/1024/1024) AS sum_free_m FROM dba_free_space GROUP BY tablespace_name )
WHERE tablespace_name = fs_ts_name
/
该语句执行效率很低。
7 检查回滚段
回滚段的状态一般是在线的,除了一些为复杂工作准备的专用段,它一般状态是离线的。
7.1你可以用V$ROLLSTAT 来查询在线或是离线的回滚段的现在状态
select usn,latch,Extents,writes,hwmsize,status From v$rollstat
/
7.2对于所有回滚段的存储参数及名字, 可用DBA_ROLLBACK_SEGS 来查询。但是它不如V$ROLLSTAT 准确。
select segment_name,owner,tablespace_name,segment_id,file_id,block_id status from dba_rollback_segs;
8 识别过分的增长
查看数据库中超出资源或是增长速度过大的段,这些段的存储参数需要调整。
8.1收集日数据大小的信息,可以用 ‘ANALYZE5PCT.SQL’。如果你收集的是每晚的信息, 则可跳过这一步。
BEGIN
dbms_utility.analyze_schema ( '&OWNER', 'ESTIMATE', NULL, 5 );
END ;
/
8.2检查当前的范围。
SELECT e.owner, e.segment_type , e.segment_name , count(*) as nr_extents ,
s.max_extents
, to_char ( sum ( e.bytes ) / ( 1024 * 1024 ) , '999,999.90') as MB
FROM dba_extents e , dba_segments s
WHERE e.segment_name = s.segment_name
GROUP BY e.owner, e.segment_type , e.segment_name , s.max_extents
HAVING count(*) > &THRESHOLD
OR ( ( s.max_extents - count(*) ) < &&THRESHOLD )
ORDER BY count(*) desc
8.3查询当前表的大小信息。
8.4 查询当前索引大小的信息。
8.5 查询增长趋势。
9 确定空间的范围
如果范围空间对象的NEXT_EXTENT 比表空间所能提供的最大范围还要大,那么这将影响数据库的运行。如果我们找到了这个目标,可以用’ALTER TABLESPACE COALESCE’调查它的位置,或加另外的数据文件。运行下面脚本,如果都是正常的,将不返回任何行。
SELECT a.table_name, a.next_extent, a.tablespace_name
FROM all_tables a,
(SELECT tablespace_name, max(bytes) as big_chunk
FROM dba_free_space
GROUP BY tablespace_name ) f
WHERE f.tablespace_name = a.tablespace_name
AND a.next_extent > f.big_chunk
/
10 监控数据库性能
使用STATSPACK/AWR收集统计数据,生成报告
11 检查数据库性能
记录数据库的cpu使用、内存使用、IO、buffer命中率等等使用vmstat , iostat,glance,top,sar等命令
12 检查DBSNMP 是否在运行
检查每个被管理机器的’DBSNMP’进程并将它们记录到日志中。在UNIX 中,在命令行中,键入ps –ef | grep dbsnmp,将回看到2 个DBSNMP 进程在运行。如果没有,重启DBSNMP。snmp是用来采集oracle数据库的相关信息。
Oracle数据库系統如果採用典型安裝,除了創建前面介紹的幾個用戶外,另外還自動創建了一個叫做DBSNMP的用戶,該用戶負責咝蠴racle系統的 智能代理(Intelligent Agent),該用戶的缺省密碼也是“DBSNMP”。如果忘記修改該用戶的口令,任何人都可以通過該用戶存取数据库系統。現在我們來看一下該用戶具有哪 些權限和角色,然來分析一下該用戶對数据库系統可能造成的損失。
这个服务在我们的系统里面有没有意义。
13 将存档日志复制到备用数据库中
如果有一个备用数据库,将适当的存档日志复制到备用数据库的期望位置,备用数据库中保存最近期的数据。
监控当前数据库谁在运行什么SQL语句
Select Osuser, Username, Sql_Text
From V$session a, V$sqltext b
Where a.Sql_Address = b.Address
Order By Address, Piece;
14 日常出现问题的处理
开发人员支持,系统的小问题。
15 晚间的工作
大部分的数据库产品将受益于每晚确定的检查进程的运行。收集VOLUMETRIC 数据,分析计划和收集数据,更准确的分析计算并保存结果。
15.1如果你现在没有作这些的话,用下面的脚本来创建测定体积的表。
CREATE TABLE utl_vol_facts (
table_name VARCHAR2(30),
num_rows NUMBER,
meas_dt DATE )
TABLESPACE platab
STORAGE (
INITIAL 128k
NEXT 128k
PCTINCREASE 0
MINEXTENTS 1
MAXEXTENTS unlimited
)
/
15.2收集晚间数据大小的信息,用下面的脚本。
BEGIN
sys.dbms_utility.analyze_schema ( '&OWNER','COMPUTE');
END ;
/
15.3收集统计结果,下面的脚本。
insert into utl_vol_facts
select table_name
, NVL ( num_rows, 0) as num_rows
, trunc ( last_analyzed ) as meas_dt
from all_tables -- or just user_tables
where owner in ('&OWNER'); -- or a comma-separated list of owners
/
Commit;
/
15.4在空闲的时候检查数据,可能的话,每周或每个月进行,可以用MS EXCEL 和ODBC 的联接来检查数据和图表的增长
16 经常查阅DBA 用户手册
如果有可能的话,要广泛的阅读,包括DBA 手册,行业杂志,新闻组或是邮件列表。下面是供应商的网页
http://www.oracle.com
http://technet.oracle.com
http://www.oracle.com/support
http://www.oramag.com
2. Quest Software
http://www.quests.com
3. Sun Microsystems
http://www.sun.com
三.每周的工作
1 监控数据库对象的空间扩展情况
根据本周每天的检查情况找到空间扩展很快的数据库对象,并采取相应的措施
----删除历史数据
----扩表空间
alter tablespace <name> add datafile '<file>' size <size>
--- 调整数据对象的存储参数
next extent
pct_increase
2 监控数据量的增长情况
根据本周每天的检查情况找到记录数量增长很快的数据库对象,并采取相应的措施
----删除历史数据
----扩表空间
alter tablespace <name> add datafile '<file>' size <size>
3 系统健康检查,检查以下内容:
init<sid>.ora
controlfile
redo log file
archiving
sort area size
tablespace(system,temporary,tablespace fragment)
datafiles(autoextend,location)
object(number of extent,next extent,index)
rollback segment
logging &tracing(alert.log,max_dump_file_size,sqlnet)
4 数据库对象有效性检查
4.1检查无效的数据库对象
SELECT owner, object_name, object_type FROM dba_objects
WHERE status='INVALID'
/
4.2 检查不起作用的约束
SELECT owner, constraint_name, table_name,
constraint_type, status
FROM dba_constraints
WHERE status = 'DISABLED' AND constraint_type = 'P'
/
4.3 检查没有主键的表
SELECT table_name FROM all_tables
WHERE owner = '&OWNER'
MINUS
SELECT table_name FROM all_constraints
WHERE owner = '&&OWNER'
AND constraint_type = 'P'
/
4.4 检查索引主键不唯一
SELECT index_name, table_name, uniqueness
FROM all_indexes
WHERE index_name like '&PKNAME%'
AND owner = '&OWNER' AND uniqueness = 'NONUNIQUE'
SELECT c.constraint_name, i.tablespace_name, i.uniqueness
FROM all_constraints c , all_indexes i
WHERE c.owner = UPPER ( '&OWNER' ) AND i.uniqueness = 'NONUNIQUE'
AND c.constraint_type = 'P' AND i.index_name = c.constraint_name
/
4.5 检查索引是否在索引表空间
SELECT 'alter index ' || index_name || ' rebuild '
, 'tablespace INDEXES storage '
|| ' ( initial 256 K next 256 K pctincrease 0 ) ; '
FROM all_indexes
WHERE ( tablespace_name != 'INDEXES'
OR next_extent != ( 256 * 1024 ))
AND owner = '&OWNER'
/
4.6 检查生产环境与测试环境的数据类型一致性
SELECT
table_name, column_name,data_type, data_length, data_precision, data_scale, nullable
FROM all_tab_columns -- first environment
WHERE owner = '&OWNER'
MINUS
SELECT
table_name, column_name,data_type, data_length, data_precision,data_scale,
nullable
FROM all_tab_columns@&my_db_link -- second environment
WHERE owner = '&OWNER2'
order by table_name, column_name
4.7 检查不同实例中对象的不同点
SELECT object_name, object_type
FROM user_objects
MINUS
SELECT object_name, object_type
FROM user_objects@&my_db_link
4.8 检查无效的trigger
SELECT owner, trigger_name, table_name, status
FROM dba_triggers
WHERE status = 'DISABLED'
/
4.9 检查Next_Extent设置
SELECT segment_name, segment_type, ds.next_extent as Actual_Next
, dt.tablespace_name, dt.next_extent as Default_Next
FROM dba_tablespaces dt, dba_segments ds
WHERE dt.tablespace_name = ds.tablespace_name
AND dt.next_extent !=ds.next_extent
AND ds.owner = UPPER ( '&OWNER' )
ORDER BY tablespace_name, segment_type, segment_name
/
4.10 检查已有的EXTENTS
SELECT segment_name, segment_type
, count(*) as nr_exts
, sum ( DECODE ( dx.bytes,dt.next_extent,0,1) ) as nr_illsized_exts
, dt.tablespace_name, dt.next_extent as dflt_ext_size
FROM dba_tablespaces dt, dba_extents dx
WHERE dt.tablespace_name = dx.tablespace_name
AND dx.owner = '&OWNER'
GROUP BY segment_name, segment_type, dt.tablespace_name, dt.next_extent
/
5 查看是否有危害到安全策略的问题。
6 查看SQL*NET日志并归档报错日志
四 每月的工作
1 分析表和索引
如果使用CBO
Analyze Tables/Indexes/Cluster
analyze table <name> estimate statistics sample 50 percent;
表和索引是否定期进行分析?还是已经设置为会自动分析?
2 查看对数据库会产生危害的增长速度
从每周记录或报告中回顾段增长的变化以此来确定段增长带来危害。
3 检查表空间碎片
根据本月每周的检查分析数据库碎片情况,找到相应的解决方法。
LMT的的表空间是否存在碎片?怎么整理。在本地曾经遇到一个问题,SYSAUX表空间的*空间碎片索引值很低,在做一些字典访问的时候,速度很慢。重建了库之后,就很快了。
*空间碎片索引值:
rem FSFI Value Compute
rem fsfi.sql
column FSFI format 999,99
select tablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks)))) FSFI
from dba_free_space
group by tablespace_name order by 1;
spool fsfi.rep;
/
spool off;
该值最大可能值为100,在建库的时候,大多数表空间应该是100,随着数据库的运行,该值会下降,下降至30以下的时候,表明碎片比较严重。
alter tablespace temp default storage(pctincrease 1);
---- 这样 SMON 便会将*范围自动合并。也可以手工合并*范围
alter tablespace temp coalesce;
段的碎片整理:
exp user/password file=exp.dmp compress=Y grants=Y indexes=Y
tables=(table1,table2);
---- 若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:
imp user/password file=exp.dmp commit=Y buffer=64000 full=Y
4 数据库性能调整
比较每天对数据库性能的监控报告,回顾以前的性能调整,比较目前的报告和以前的报告,确定有害的趋势,如有必要,进行性能调整。
针对该项要求,是否有必要每周来做性能分析报告。
5 预测数据库将来的性能
比较ORACLE 和操作系统的CPU,内存,网络,及硬盘的利用率以此来确定在近期将会有的一些资源争夺的趋势,根据此趋势提出将来的解决方案。
该问题应该从日常做起。
6 调整和维护工作
使修改在系统正常运行的前提下,满足避免系统资源的争夺的需要,这里面包括增加新资源或使预期的停工。
调整和维护工作我们的数据库是否会定期做。
7 提出下一步空间管理计划
根据每周的监控以及数据库的预测报告,给出分析报告,提出空间管理的改进方法。
这个应该是根据每天的记录来进行。都应该记录哪些。
附录1 DBA需要掌握的技能
1. OS : linux,solaris或其他unix起码要一种
2. bash (不精通也要熟) LINUX与UNIX SHELL编程指南.pdf
3. perl 包括:
Perl_CD_BookShelf.chm
learning perl
perl pragramming
4. java(掌握)包括jdbc thin,oci等4类不同的连接方式,性能设置,一些中间件的知识,了解一些就够了
5. oracle performance tuning(范围很广)
ocp performance book
下tom的书《Wrox - Expert one-on-one Oracle》,
http://www.ebookcn.net/Soft/Soft_12042.htm
http://zuse.esnig.cifom.ch/database/doc_oracle/Oracle920_Linux/
server.920/a96533/toc.htm[/url]
oracle sql hign performance tuning 2nd editon by guy harrison
6. pl/sql
OReilly_oracle_Bookshelf 包括:
Oracle PL/SQL Programming, 2nd Edition by Steven Feuerstein
Oracle Built-in Packages by Steven Feuerstein,
7. oracle network
ocp network book
8. os tuning
system performance tuning 2nd editon by gian-paolo
9. sql loader & exp/imp
有很多这样的资料
export one to one by Tom
10. oracle sql
http://zuse.esnig.cifom.ch/database/doc_oracle/Oracle920_Linux/
server.920/a96540/toc.htm
11. oracle rac
http://zuse.esnig.cifom.ch/database/doc_oracle/Oracle920_Linux/
rac.920/a96597/toc.htm[/url]
dataguard
12.存储:netapp;emc;nfs ;san;nas;das;iscsi等...
data ontap version 6.4 nfs administrator by netapp
13. practice oracle 8i by jenathon
metalink bug and patch search
安全控制
14.数据库安装升级,OS安装升级
15.数据库备份与恢复
16.数据库迁移
附录2 ORACLE常用工具快速指南
本指南快捷的给出ORACLE常用的几个组件的使用方法,如果不明白请看详细文档后使用。
1 STATSPACK
alter system set job_queue_processes = 6 scope=both;
alter system set timed_statistics = true;
sqlplus “/ as sysdba”
create tablespace perfstat
datafile 'd:\oracle\oradata\eygle\perfstat.dbf'
size 500M
extent management local;
@$ORACLE_HOME\\rdbms\admin\spcreate
Default_tablespace: perfstat
temporary_tablespace: temp
明文口令:perfstat
如果出异常:@$ORACLE_HOME\\rdbms\admin\spdrop.sql
execute statspack.snap
PL/SQL procedure successfully completed.
----间隔30分钟至1小时
execute statspack.snap
PL/SQL procedure successfully completed.
@$ORACLE_HOME\\rdbms\admin\spreport.sql
输入快照号以及报告名称,可以出对应的报告。
2 AWR
Sqlplus “/ as sysdba”
----统计方式修改
exec dbms_workload_repository.modify_snapshot_settings(2*24*60,10,50);
生成AWR报告文档:
@$ORACLE_HOME\\rdbms\admin\awrrpt.sql
根据提示输入html或者其他格式
输入快照号以及报告名称,可以出对应的报告,报告阅读和statspack差不多。
手工创建快照:
Exec dbms_workload_repository.create_snapshot();
3 SQL_TRACE及相关
3.1 SQL_TRACE:
alter system set sql_trace=true;
alter session set sql_trace=true;
alter session set tracefile_identifier ="foxmile_test";
select count(*) from dba_users;
alter session set sql_trace=false;
3.2 DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION:
select sid,serial#,username from v$session where username is not null;
alter session set tracefile_identifier ="foxmile_test";
exec dbms_system.set_sql_trace_in_session(SID, serial#,true);
exec dbms_system.set_sql_trace_in_session(SID, serial#,false);
3.3 10046事件说明
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 加上绑定值(bind values)
8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8
参数文件:
event="10046 trace name context forever,level 12"
当前session设置:
alter session set tracefile_identifier ="foxmile_test";
alter session set events '10046 trace name context forever';
alter session set events '10046 trace name context forever, level 8';
alter session set events '10046 trace name context off';
其他session设置:
select sid,serial#,username from v$session where username is not null;SID SERIAL# USERNAME
启动:
alter session set tracefile_identifier ="username";
exec dbms_system.set_ev(sid,serial#,10046,8, username);
exec dbms_system.set_ev(sid,serial#,10046,0, username);
4 LOGMINER
执行脚本:
Sqlplus “/ as sysdba”
@$ORACLE_HOME/rdbms/admin/dbmslm.sql
@$ORACLE_HOME/rdbms/admin/dbmslmd.sql
产生数据字典:
alter system set utl_file_dir = 'C:\arc_zero' scope=spfile;
shutdown immediate;
startup;
EXECUTE dbms_logmnr_d.build(dictionary_filename => 'v10201dict.ora', dictionary_location =>'C:\arc_zero');
----添加及移除日志
EXECUTE dbms_logmnr.add_logfile(LogFileName=>'D:\oracle\product\10.1.0\oradata\zero\REDO01.log', Options=>dbms_logmnr.new);
EXECUTE dbms_logmnr.add_logfile(LogFileName=>'D:\oracle\product\10.1.0\oradata\zero\redo02.log',Options=>dbms_logmnr.addfile);
EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:\arc_zero\00108_0657628042_001.ARC', Options=>dbms_logmnr.new);
EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:\arc_zero\00109_0657628042_001.ARC', Options=>dbms_logmnr.addfile);
EXECUTE dbms_logmnr.add_logfile(LogFileName=>'D:\oracle\product\10.1.0\oradata\zero\redo02.log', Options=>dbms_logmnr. REMOVEFILE);
----无限制分析日志
EXECUTE dbms_logmnr.start_logmnr(DictFileName=>'C:\arc_zero\v10201dict.ora');
----限制时间分析日志
EXECUTE dbms_logmnr.start_logmnr(DictFileName =>'C:\arc_zero\v10201dict.ora',
StartTime => to_date('2001-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS'),EndTime => to_date(''2001-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
----限制起止scn分析日志
EXECUTE dbms_logmnr.start_logmnr(DictFileName =>'C:\arc_zero\v10201dict.ora', StartScn => 20, EndScn => 50);
----观察分析结果(v$logmnr_contents)
SELECT sql_redo FROM v$logmnr_contents;
SELECT sql_redo FROM v$logmnr_contents WHERE username='DB_ZGXT' AND tablename='SB_DJJL';
5 TKPROF
tkprof zero_ora_856374.trc zero.txt explain=system/manager aggregate=yes sys=no waits=yes sort=fchela
sys=no:表示阻止所有以sys用户执行的sql被显示出来,默认为YES,这个参数设置为no可以阻止所有以sys用户执行的sql被显示出来,减少分析出来的文件的复杂度,便于查看
aggregate=yes|no 若用户指定AGGREGATE=NO,TKPROF将不会对相同SQL文本的多个用户进行汇总
waits=yes|no Record summary for any wait events found in the trace file.
print=integer List only the first 'integer' SQL statements. 只列出输出文件中的第一个INTEGER的SQL语句,若忽略,则TKPROF将列出所有跟踪的SQL语句
insert=filename List SQL statements and data inside INSERT statements. SQL脚本的一种,用于将跟踪文件的动机信息存储到数据库中
record=filename Record non-recursive statements found in the trace file. 对于跟踪文件中的所用非递归SQL语句,TKPROF 将以指定的名称来创建某个SQL脚本。用于对跟踪文件中的用户时间进行重放
sort=option Set of zero or more of the following sort options: 在将被跟踪的SQL语句列表输出到跟踪文件之前,先将其按照指定排序选项的降序关系对其进行排序;若指定了多种排序选项,那么根据排序选项所指定值的和的降序关系对其进行排序;若忽略此参数,那么TKPROF将按照使用次序把语句列表到输出文件中,其中比较有用的一个排序选项是fchela,即按照elapsed time fetching来对分析的结果排序(记住要设置初始化参数time_statistics=true),生成的.prf文件将把最消耗时间的sql放在最前面显示。下面是所有的排序选项:
prscnt number of times parse was called 语句解析的数目
prscpu cpu time parsing 语句解析所占用的CPU时间
prsela elapsed time parsing 语句解析所占用的时间(总是大于或等于CPU时间);
prsdsk number of disk reads during parse 语句解析期间,从磁盘进行物理读取的数目
prsqry number of buffers for consistent read during parse 语句解析期间,一致模式块读取(CONSISTENT MODE BLOCK READ)的数目
prscu number of buffers for current read during parse 语句解析期间,当前模式读取(CURRENT MODE BLOCK READ)的数目
prsmis number of misses in library cache during parse 语句解析期间,库缓存失败的数目
execnt number of execute was called 语句执行的数目
execpu cpu time spent executing 语句执行所占用的CPU时间
exeela elapsed time executing 语句执行所占用的时间(总是大于或等于CPU时间)
exedsk number of disk reads during execute 语句执行期间,从磁盘进行物理读取的数目
exeqry number of buffers for consistent read during execute 语句执行期间,一致模式块读取(CONSISTENT MODE BLOCK READ)的数目
execu number of buffers for current read during execute 语句执行期间,当前模式读取(CURRENT MODE BLOCK READ)的数目
exerow number of rows processed during execute 语句执行期间,所处理的语句行数
exemis number of library cache misses during execute 语句执行期间,库缓存失败的数目
fchcnt number of times fetch was called 取数据的数目
fchcpu cpu time spent fetching 取数据所占用的CPU时间
fchela elapsed time fetching 取数据所占用的时间(总是大于或等于CPU时间)
fchdsk number of disk reads during fetch 取数据期间,从磁盘进行物理读取的数目
fchqry number of buffers for consistent read during fetch 取数据期间,一致模式块读取(CONSISTENT MODE BLOCK READ)的数目
fchcu number of buffers for current read during fetch 取数据期间,当前模式读取(CURRENT MODE BLOCK READ)的数目
fchrow number of rows fetched 所获取的行数
userid userid of user that parsed the cursor
5 ORACLE的诊断事件(Event)
5.1 格式
EVENT="<事件名称><动作><跟踪项目><范围限定>"
附录3 DBA必须掌握的几个ix系统的命令
top
top监控工具可以显示CPU占用率为前几位的进程,并提供CPU的实时活动情况
top监控命令在FreeBSD上的使用
top监控工具可以显示CPU占用率为前几位的进程,并提供CPU的实时活动情况
语法:top [-s time] [-d count] [-q] [-h] [-n number] [-f filename] [-o field][-U usename]
-S 将系统进程信息也显示到屏幕上,默认情况下,top不显示系统进程的信息
-b 使用”batch”方式运行top。在此种方式下,所有来自终端的输入都将被忽略,但交互键(比如C and )
依然起使用。这是运行top输出到哑终端或输到非终端的默认运行方式
-i 使用交互运行top程序,在此种方式下,命令会被进程立即被处理。不管命令是不是能被top所理解执行,
屏幕都将立即更新。这是top的默认运行方式。
-I 不显示空闲进程,在默认情况下,top连同空闲进程的信息一同输出。
-t 不显示top进程自己
-n 不以交互方式使用top命令,作用同”batch”方式。
-s time 设置屏幕刷新的延时,单位为秒,默认值5秒
-d count 设置屏幕刷新的次数,刷新显示完count次后退出
-q 如果经过nice授权,使用-q可以使top运行的更快一些,这样,在系统反应缓慢的时候,可以会更快的找到存在的问题。
此选项在FreeBSD下只有root可以使用
-n number 设置每一屏幕显示的进程数目,number值超过进程最大数目,则设置无效
-u 用显示User ID代替username,提高命令运行速度
-v 显示程序版本号后,立即退出。如果要在top运行时查看版本号,输入”?”
-o 以指定的字段排序显示进行信息。字段名必须为输入在屏幕的可见列的名字,而且必须是小写。
比如”cpu”、”size”、”res”与”time”,但不同的操作系统间有许多的不同。注意不是每个UNIX操
作系统都支持此选项。
-U 只显示属于后面所跟用户名的进程的信息
屏幕控制命令
交换方式下,可以使用以下命令控制top
^L – 刷新屏幕
q – 退出
h or ? – 显示帮助
d – 修改刷新显示的次数
e – 显示最近”kill”或”renice”命令所产生的错误
i – 显示/不显示处于空闲的进程
I – 作用同 ‘i’
k – kill 进程; 发送一个信号到某个进程列表
n or # – 修改显示进程的数目
o – 以特定的字段排序 (pri, size, res, cpu, time)
r – renice 一个进程
s – 修改输入的更新时间
u – 只显示属于某个用户的进程 (+ selects all users)
顺序显示下面三个常规的信息
一. 系统信息:
last pid: 22228; load averages: 0.25, 0.97, 1.56 up 44+03:25:56 21:39:36
274 processes: 3 running, 259 sleeping, 12 zombie
CPU states: 2.9% user, 0.0% nice, 4.2% system, 0.4% interrupt, 92.5% idle
Mem: 483M Active, 120M Inact, 222M Wired, 25M Cache, 112M Buf, 153M Free
Swap: 2048M Total, 143M Used, 1905M Free, 6% Inuse
首部的几行显示系统的几个信息,其中包括:
+ Load averages:1分钟、5分钟和15分钟内运行的负载平均数
+ system:系统名和当前日期.
一般来说只要每个CPU的当前活动进程数不大于 3那么系统的性能就是良好的,如果每个CPU的任务数大于5,
那么就表示这台机器的性能有严重问题
+ 最近一次更新时存在的进程总数,并分别列出run(运行)、sleep(睡眠)、idle(停止)和zomb(‘僵尸’)状态的进程数
+ CPU state:用户占用时间的百分比、系统占用CPU时间的百分比、被nice命令改变优先级的任务占用的CPU时间百分比、以及CPU空闲时间的百分比。
(被nice命令改变优先级的任务仅指那些nice值为负的任务)。花费在被nice命令改变优先级的任务上的时间也将被计算在系统和用户时间内,因此
整个时间加起来可能会超过百分之百
二.内存信息
Memory: 610008K (24424K) real, 995344K (30304K) virtual, 12588K free Page# 1/4
Memory:关于内存使用情况的统计,包括实际(real)内存的活动值/总值,虚拟(virtual)内存的使用值/总值,剩余的内存。
DESCRIPTION OF MEMORY
Mem: 9220K Active, 1032K Inact, 3284K Wired, 1MB Cache, 2M Buf, 1320K
Free Swap: 91M Total, 79M Free, 13% Inuse, 80K In, 104 K Out
K: Kilobyte(K)
M: Megabyte(兆)
%: 1/100(百分比)
Active:
活动页的数目
Inact: 非活动页的数目
Wired: 已经被写入页的数目, 包括缓存文件数据页码
Cache: 被用于 VM-level 磁盘缓冲的页的数目
Buf: 被用于 BIO-level 磁盘缓冲的页的数目
Free: 空闲页
Total: 总的可使用交换区
Free: 总共空闲的交换区
Inuse: 交换区的使用情况
In: pages paged in from swap devices (最近的时间间隔)
Out: pages paged out to swap devices (最近的时间间隔)
三.进程信息
CPU PID USERNAME PRI NI SIZE RES STATE TIME %WCPU %CPU COMMAND
1 33 root 152 20 0K 0K run 153:43 1.18 1.18 vxfsd
0 1751 root 154 20 2500K 868K sleep 2084:19 0.52 0.52 ARMServer
0 1730 root 154 20 4500K 332K sleep 1664:55 0.44 0.44 acactmgr
列出系统里每一个处理器的信息,当信息在一个屏幕内无法显示时,会被分成多个屏幕显示,可以前面提到l,k和t命令查看
(1)CPU:处理器号(仅当多处理器系统时列出)
(2)PID:进程号
(3)USERNAME:用户名
(4)PRI:任务的优先级
(5)NICE:任务的nice值,一个具有较低值的进程在系统上将具有优先权。可以通过改变nice值提高某些进程速度,但是这实际上是一种交易,因为那些nice值被升高的进程此时将运行得很慢。
(6)SIZE:任务的代码加上数据再加上栈空间的大小。
(7)RES:任务使用的物理内存的总数量。
(8)STATE:任务的状态
(9)TIME:自任务开始时使用的总CPU时间,单位为秒,如153:43,对应是153秒43毫秒
(10)%WCPU:进程的CPU利用率权重百分比
(11)%CPU:进程的原始的CPU利用率百分比,自上一次屏幕刷新以来任务占用CPU 时间的份额
(12)COMMAND:启动进程的命令名。如果名字太长而不能在一行显示时,它将被截短
iostat 和vmstat
CPU处理单元是系统中最快的组件。在某一时间对单个程序来说,相对很少保持 100% 的 CPU 占用率(也就是说,空闲 0%,等待 0%)超过几秒钟。甚至在高负载的多用户系统中,偶尔会出现一些 10 毫秒(ms)的时期,在其结束时所有线程处于等待状态。如果一个监视器显示在一段延长的时期内 CPU 占用率为 100%,很有可能是陷入了死循环。甚至如果该程序“仅仅”是占用较多资源,而不是崩溃了,也需要将它识别出来并进行处理。
在这里,要使用的工具是 vmstat 命令,该命令可提供关于各种系统资源和各种与之相关的性能问题的简明信息。
vmstat 命令报告了关于内核线程的统计信息,包括处于运行和等待队列中的、内存中的、页面调度中的、磁盘中的、中断、系统调用、上下文切换和 CPU 活动的内核线程。所报告的 CPU 活动是用户模式、系统模式、空闲时间和等待磁盘 I/O 的百分比细分类目。
注:如果使用 vmstat 命令时不带任何选项,或者只带有间隔和任意的计数参数,例如 vmstat 2 10,那么第一行数字为自系统重新引导以来的平均值。
作为一个 CPU 监视器,vmstat 命令比 iostat 命令优先级要高,因为 vmstat 命令是滚动的,使得它的每报告一行的输出更容易扫描,并且如果有很多磁盘连接到系统中,由此所引起的开销更少。
下面的例子会帮助您识别一个程序失控时或过度占用 CPU 以至于不能在一个多用户环境中运行的情况。
# vmstat 2
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
1 0 22478 1677 0 0 0 0 0 0 188 1380 157 57 32 0 10
1 0 22506 1609 0 0 0 0 0 0 214 1476 186 48 37 0 16
0 0 22498 1582 0 0 0 0 0 0 248 1470 226 55 36 0 9
2 0 22534 1465 0 0 0 0 0 0 238 903 239 77 23 0 0
2 0 22534 1445 0 0 0 0 0 0 209 1142 205 72 28 0 0
2 0 22534 1426 0 0 0 0 0 0 189 1220 212 74 26 0 0
3 0 22534 1410 0 0 0 0 0 0 255 1704 268 70 30 0 0
2 1 22557 1365 0 0 0 0 0 0 383 977 216 72 28 0 0
2 0 22541 1356 0 0 0 0 0 0 237 1418 209 63 33 0 4
1 0 22524 1350 0 0 0 0 0 0 241 1348 179 52 32 0 16
1 0 22546 1293 0 0 0 0 0 0 217 1473 180 51 35 0 14
这个输出结果显示了在一个繁忙的多用户系统中引入一个有死循环的程序所带来的效果。最开始的三个报告(摘要已被删除)表明系统稳定在用户模式 50—55%、系统模式 30—35% 和 I/O 等待 10—15%。当循环程序开始运行,所有的 CPU 周期被占用。因为循环程序不进行 I/O,所以它可以占有前面因为 I/O 等待而未用的所有周期。更糟糕的是这意味着,当一个有用进程放弃 CPU 的使用权时,这个进程总是准备占用 CPU。因为死循环程序的优先级与所有其它前台进程一样,所以当另一个进程变得可调度时它也没必要让出 CPU 的使用权。该程序运行大约 10 秒钟(五个报告),然后由 vmstat 命令报告的活动恢复到较正常的模式。
CPU 统计信息在设备中断负载很高的系统上会有一定程度的失真。这种情况是因为该工具是对定时器中断采样。定时器是优先级最低的设备,所以它很容易被其它中断抢先。为了消除失真,当操作系统版本晚于 AIX 4.3.3 时,采用了一种不同的方法来对定时器进行采样。
注:对对称多处理系统 us、sy、id 和 wa 几列只是对各处理器求平均值(sar 命令可以报告每个处理器的统计信息)。
一个 I/O 等待和空闲时间只能从未决 I/O 的状态来区分。如果有一个未决磁盘 I/O,并且处理器不忙,那么这是一个 I/O 等待时间。AIX 4.3.3 和其后的系统中用一个增强的方法来计算花费在磁盘 I/O 上的 CPU 时间(wio 时间)所占的百分比。
在最佳使用时,CPU 在 100% 的时间中都在工作。在单用户系统中更是这样,这里不需要共享 CPU。总的来说,如果 us + sy 时间低于 90%,则不认为该单用户系统 CPU 受限制。但是,如果在一个多用户系统中 us + sy时间超过 80%,其中的进程将要花时间在运行队列中等待。响应时间和吞吐量会受损害。
要检查 CPU 是否是瓶颈,考虑 vmstat 报告中的四个 cpu 列和两个 kthr(内核线程)列,也应该查看 faults 列。
cpu列 在该时间间隔内使用 CPU 时间的百分比细分。cpu 列如下:
us参数 us 列显示了用户模式所消耗的 CPU 时间。一个 UNIX 进程可以在用户模式下执行,也可以在系统(内核)模式下执行。当在用户模式下执行时,进程在它自己的应用程序代码中之行,不需要内核资源来进行计算、管理内存或设置变量。
sy参数
sy 列详细显示了 CPU 在系统模式下执行一个线程所花时间的百分比。包括内核进程(kprocs)和其它需要访问内核资源的进程所消耗的 CPU 资源。如果一个进程需要内核资源,它必须执行一个系统调用,并因此被切换到系统模式从而可以使用该资源。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找指定的位置和读写数据,除非使用内存映射文件。
id参数
id 列显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待时间的百分比。如果没有线程可以执行(运行队列为空)系统调度一个叫做 wait 的线程,也就是 idlekproc。在一个对称多处理系统中,每个处理器都有一个 wait 线程可调度。由 ps 命令(带有 -k 或 -g 0选项)将它确定为 kproc 或 wait。如果报告中 ps 显示这个线程的总计时间高,这表明存在显著的时期,没有其它线程在这个 CPU 上准备运行或等待执行。系统因此大部分时间或任务空闲和等待新任务。
如果没有未决 I/O,所有用于等待的时间归入空闲时间中。在4.3.2版或更早的操作系统中,访问远程磁盘(安装 NFS 磁盘)被当作空闲时间(有少量 sy 时间来执行 NFS 请求),因为没有对本地磁盘的未决 I/O 请求。在 AIX 4.3.3 和以后的系统中,NFS 通过缓冲区高速缓存,在这些例程中的等待被放入 wa 中统计。
wa参数
wa 列详细显示了有未决本地磁盘 I/O 时 CPU 空闲的时间百分比(在 AIX 4.3.3 和以后版本的系统中,对安装了 NFS 的磁盘也是这样)。如果当等待正在运行时至少有一个未完成的磁盘 I/O,该时间归入等待 I/O 的时间。除非该进程使用异步 I/O,否则对磁盘的 I/O 请求使调用线程被阻塞(或睡眠)直到请求被完成。一旦进程的 I/O 请求完成,该进程被放入运行队列中。如果 I/O 很快完成,该进程可以使用更多的 CPU 时间。
wa 的值如果超过 25%,就表明磁盘子系统可能没有被正确平衡,或者这也可能是磁盘工作负荷很重的结果。
Kthr列 每秒钟在采样间隔上对各种队列中的内核线程数求得的平均值。kthr 列如下:
r参数
可运行的内核线程平均数目,包括正在运行的线程和等待 CPU 的线程。如果这个数字大于 CPU 的数目,至少有一个线程要等待 CPU,等待 CPU 的线程越多,越有可能对性能产生影响。
b参数
每秒 VMM 等待队列中的内核线程平均数。包括正在等待文件系统 I/O 的线程,或由于内存装入控制而被挂起的线程。
如果进程由于内存装入控制而被挂起,在 vmstat 报告中的阻塞列(b)表明线程数目增加,而不是运行队列中线程数目增加。
p参数
对与 vmstat -I,是每秒等待原始设备 I/O 的线程数目。等待文件系统 I/O 的线程不包括在这里。
faults列 关于进程控制的信息,如陷阱和中断率。faults 列如下:
in参数
在该时间间隔中观测到的每秒设备中断数。额外信息可见用 vmstat 命令评估磁盘性能。
sy参数
在该时间间隔中观测到的每秒系统调用次数。通过明确的系统调用,用户进程可以使用资源。这些调用命令内核为调用线程执行操作,并在内核和该进程之间交换数据。因为,工作负荷和应用程序变化很大,不同的调用执行不同的功能,所以不可能定义每秒钟有多少系统调用才算太多。但是通常来讲,在一个单处理器系统上当 sy 列增大到超过每秒钟 10000 个调用, 应进行进一步的调查(在一个对称多处理系统上,这个数字为每个处理器每秒钟 10000 个调用)。其中一个原因可能是“轮询”子例程,象 select() 子例程。对这列,建议进行一个基准评估,给出正常 sy 值的一个计数。
cs参数
在该时间间隔中观测到的每秒钟上下文切换次数。物理上的 CPU 资源被分为每个 10 毫秒的逻辑时间片。假设一个线程被调度运行,它将一直运行直到它的时间片用完、直到被抢先或直到它自己主动放弃 CPU 控制权。当另一个线程被赋予 CPU 控制权时,必须保存前一个线程的上下文或工作环境,并载入当前线程的上下文。操作系统有一个很有效的上下文切换过程,所以每次切换并不耗费资源。任何上下文切换的显著增加,如当 cs 比磁盘 I/O 和网络包速率高的多,都应进行进一步调查。
要显示引导后的统计信息摘要,请输入:
vmstat
要显示 2 秒时间间隔的 5 个摘要,请输入:
vmstat 2 5第一次摘要包含引导后的时间统计信息。
要显示引导后包括逻辑磁盘 scdisk13 和 scdisk14 的统计信息摘要,请输入:
vmstat scdisk13 scdisk14
要显示派生统计信息,请输入:
vmstat -f
要显示各事件的计数,请输入:
vmstat -s
要显示 vmstat的每一输出栏旁边的时间戳记,请输入:
vmstat -t
要以另一套输出栏显示新的 I/O 定向视图,请输入:
vmstat -I
要显示所有可用的 VMM 统计信息,请输入:
vmstat -vs
vmstat 是用来实时查看内存使用情况,反映的情况比用top直观一些.
如果直接使用,只能得到当前的情况,最好用个时间间隔来采集
vmstat T 其中T用具体的时间标示,单位是 秒 例如:vmstat 5 表格每隔5秒采集一次.
这样在刷新的时候就能比较系统的看到那个列不正常的
procs:
r-->;在运行队列中等待的进程数
b-->;在等待io的进程数
w-->;可以进入运行队列但被替换的进程
memoy
swap-->;现时可用的交换内存(k表示)
free-->;空闲的内存(k表示)
pages
re--》回收的页面
mf--》非严重错误的页面
pi--》进入页面数(k表示)
po--》出页面数(k表示)
fr--》空余的页面数(k表示)
de--》提前读入的页面中的未命中数
sr--》通过时钟算法扫描的页面
disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号
fault 显示每秒的中断数
in--》设备中断
sy--》系统中断
cy--》cpu交换
cpu 表示cpu的使用状态
cs--》用户进程使用的时间
sy--》系统进程使用的时间
id--》cpu空闲的时间
其中:
如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
如果pi,po 长期不等于0,表示内存不足。
如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。
Linux下vmstat输出释疑:
Vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 100152 2436 97200 289740 0 1 34 45 99 33 0 0 99 0
procs
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比
system 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
memory
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap
si 由内存进入内存交换区数量。
so由内存交换区进入内存数量。
IO
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。
Solairs系统下vmstat输出释疑
vmstat 5 5
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s1 s1 -- -- in sy cs us sy id
0 0 0 704968 207640 0 1 2 0 0 0 0 0 0 0 0 302 6 31 0 0 100
0 0 0 705048 206728 1 2 0 0 0 0 0 0 0 0 0 302 4 34 0 0 100
0 0 0 705048 206728 0 0 0 0 0 0 0 0 0 0 0 302 3 35 0 0 100
0 0 0 705048 206728 0 0 0 0 0 0 0 0 0 0 0 301 3 34 0 0 100
0 0 0 705048 206728 0 0 0 0 0 0 0 0 0 0 0 302 6 35 0 0 100
procs
r 列表示在运行队列中等待的进程数。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
w 列表示可以进入运行队列但被交换出来的进程
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。一个 UNIX 进程可以在用户方式下执行,也可以在系统(内核)方式下执行。当在用户方式下时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量。
sy 列详述了 CPU 在系统方式下执行一个进程所花时间的百分比。这包括内核进程(kprocs)和其它需要访问内核资源的进程所消耗的 CPU 资源。如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找特定的位置,以及读或写数据,除非使用内存映射文件。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
id 列显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待的时间百分比。
faults 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。iostat命令输出更有参考意义。
sy 列表示在某一时间间隔中观测到的每秒系统调用次数。通过明确的系统调用,用户进程可以使用资源。这些调用指示内核执行调用线程的操作,并在内核和该进程之间交换数据。因为工作负载和应用程序变化很大,不同的调用执行不同的功能,所以不可能定义每秒钟有多少系统调用才算太多。这里设置参考值为10000,超过10000,用户需要注意。
cs 列表示,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
memory
swap 当前可用内存交换区容量(k表示)。
free 当前的空闲页面列表中内存数量(k表示)
page
re 列表示回收的页面数。
mf 列表示小级别错误计数。
pi 列表示进入页面数 (k表示)。
po 列表示出页面数(k表示)。
fr 列表示空余的页面数(k表示)。
de 列表示提前读入的页面中的未命中数。
sr 列表示通过时钟算法扫描的页面计数
solairs下iostat释疑
iostat -xtc 5 2
extended device statistics tty cpu
device r/s w/s kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id
sd1 0.3 0.0 3.4 0.1 0.0 0.0 13.2 0 0 0 0 0 0 0 100
sd15 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
nfs1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
extended device statistics tty cpu
device r/s w/s kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id
sd1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 77 0 0 0 100
sd15 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
nfs1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
tty和CPU使用率报告
tin 显示了系统为所有 tty 读取的字符总数。
tout 显示了系统为所有 tty 写入的字符总数。
us 显示了在用户级应用程序在缺省的优先级别执行时的 CPU 使用率百分比。
sy 显示了在用户级应用程序在降低优先级执行时的 CPU 使用率百分比。
wt 显示了在系统级(内核)执行时生成的 CPU 使用率。
id 显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。
磁盘使用率报告
device 被统计的硬盘设备名,包括nfs设备。
r/s 表示每秒钟读的次数
w/s 表示每秒钟写的次数
kr/s 表示每秒钟读的K字节数
kw/s 表示每秒钟写的K字节数
wait 表示平均多少个传输等待被处理,相当于读写等待队列长度
actv 表示平均多少个传输从读写等待队列中移出做处理
svc_t 表示每次硬盘传输平均耗费的时间,以毫秒为单位,这里我们设置的参考值为30ms,超过说明硬盘负载太多
%w 表示每次传输所消耗时间里面,等待所占的百分比
%b 表示硬盘忙的时间所占百分比,这里我们设置参考值为5%,超过5%说明硬盘负载太多,最好采取以下步骤:
1.)调整应用,令其使用磁盘i/o更加有效率,可以通过修改磁盘队列、使用应用服务器的cache
2.)将文件系统分布到2个或多个磁盘上,并使用volume manager/disksuite的条带化特点
3.) 增加系统参数值,如inode cache , ufs_ninode。
AIX下vmstat释疑:
# vmstat 5 20
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
1 1 244528 1227 0 3 3 56 151 0 404 1420 1415 4 2 88 6
2 6 244538 1241 0 39 148 2424 3511 0 904 4660 7571 49 12 2 38
5 3 244540 791 0 2 221 3937 6077 0 1183 6605 24619 44 34 1 21
1 7 245326 1009 0 11 331 1071 1934 0 884 3788 13000 23 25 0 52
分析如下:
kthr
kthr列表示每秒钟在采样间隔时间上对各种队列中的内核线程数求得的平均值
r 列表示可运行的内核线程平均数,包括正在运行的线程和正在等待 CPU的线程。如果这个数字大于 CPU 的数目,至少有一个线程要等待 CPU,等待 CPU 的线程越多,越有可能对性能产生影响。
b 列表示每秒 VMM 等待队列中的内核线程平均数。这包括正在等待文件系统 I/O 的线程,或由于内存装入控制而暂挂的线程。这里参考值为2,大于2表示被阻塞列线程数目太多。
[b] !阻塞线程数目太多
CPU
us 列显示了用户方式下所花费 CPU 时间的百分比。一个 UNIX 进程可以在用户方式下执行,也可以在系统(内核)方式下执行。当在用户方式下时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量。
sy 列详述了 CPU 在系统方式下执行一个进程所花时间的百分比。这包括内核进程(kprocs)和其它需要访问内核资源的进程所消耗的 CPU 资源。如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找特定的位置,以及读或写数据,除非使用内存映射文件。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
id 列显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待的时间百分比。
wa 列详细显示了暂挂本地磁盘 I/O 和 NFS 加载的磁盘的 CPU 空闲百分比。这里参考值为25%,大于25% 可能表示磁盘子系统可能没有被正确平衡,或者这也可能是磁盘密集工作负载的结果。
[us]+[sy] !IO不平衡
[wa] 正常
fault
in 列表示在某一时间间隔中观测到的每秒设备中断数。iostat命令输出更有参考意义。
sy 列表示在某一时间间隔中观测到的每秒系统调用次数。通过明确的系统调用,用户进程可以使用资源。这些调用指示内核执行调用线程的操作,并在内核和该进程之间交换数据。因为工作负载和应用程序变化很大,不同的调用执行不同的功能,所以不可能定义每秒钟有多少系统调用才算太多。这里设置参考值为10000,超过10000,用户需要注意。
cs 列表示,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
[sy] 正常
memory
avm 列表示在收集 vmstat 样本时存在的活动虚拟内存页面数(4k为单位)。理想情况下, avm 应该比总 RAM 数小。如果不是,可能会出现一些虚拟内存页面调度量。有多少页面调度发生取决于两个值之间的差值。记住,虚拟内存的概念是提供给我们寻址大于实内存容量的能力(一些在 RAM 内存中,而另一些在调页空间中)。但是如果虚拟内存远大于实内存,可能造成过度的页面调度,从而导致延时。如果 avm 小于 RAM,那么当 RAM 中填满文件页时就会引起调页空间的页面调度。这种情况下,调整 minperm、maxperm 和 maxclient 的值可以减少调页空间的页面调度量。
fre 列显示出空闲内存页面的平均数量(4k为单位)。VMM 在空闲列表上保存的最少页面数由 minfree 参数决定。这里的参考值为maxfree的缺省值720,小于720说明存在内存系统颠簸。
[fre] 正常
[avm] avm的值约为:958MB
page
pi 列详细描述了从调页空间调入的页数。调页空间是驻留在磁盘上的虚拟内存的一部分。当内存过量使用时,它用作溢出。调页空间由用于存储从实内存中窃取到的工作组页面的逻辑卷组成。当进程访问一个窃取页时,产生了一个缺页故障,这一页必须从调页空间读入内存。这里设置pi的参考值为5,大于5说明内存不足。
po 列显示了调出到调页空间的页面数(速率)。无论什么时候窃取工作存储器的一页,如果它仍未驻留在调页空间中或已被修改,那它会被写入调页空间。如果不被再次访问,它会留在页面调度设备中直到进程终止或放弃空间。如果包含在出故障页面中的后续地址引用导致缺页故障,那么这些页面将会由系统个别调进。当一个进程正常终止,任何分配给该进程的调页空间将被释放。
fr 列表示在一定时间间隔内根据页面替换算法每秒所释放的页数。当 VMM 页面替换例程扫描页面帧表(Page Frame Table,PFT)时,它使用一些条件选取要窃取的页面以插入到可用内存帧的空闲列表中。
sr 列表示在一定时间间隔内根据页面替换算法每秒所检查的页面数。页面替换算法在可以窃取足够的页面以满足页面替换线程的需要之前可能不得不扫描许多页面帧。
cy 列表示每秒页面替换代码扫描了 PFT 多少次。因为插入空闲列表可以不需要完全扫描 PFT,并且因为所有的 vmstat 字段报告为整数,这一字段通常为 0。
这里设置fr:sr的参考值为3,超过说明内存不足。
[pi] !存在内存不足
[fr:sr] 正常
AIX命令iostat释疑
# iostat hdisk1 hdisk2 5 5
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.0 0.3 0.2 0.4 99.4 0.1
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk2 0.1 1.0 0.2 45090 51075
hdisk1 0.0 0.0 0.0 0 0
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.0 70.6 45 54 99.4 0.0
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk2 0.0 0.0 0.0 0 0
hdisk1 0.0 0.0 0.0 0 0
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.0 70.6 0.0 0.4 99.6 0.0
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk2 0.0 0.0 0.0 0 0
hdisk1 0.0 0.0 0.0 0 0
分析结果
tty和CPU使用率报告
tin 显示了系统为所有 tty 读取的字符总数。
tout 显示了系统为所有 tty 写入的字符总数。
% user 显示了在用户级(应用程序)执行时生成的 CPU 使用率百分比。
% sys 显示了在系统级(内核)执行时生成的 CPU 使用率百分比。
% idle 显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。
% iowait 显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。
[user][+][sys] !CPU能力不足
[wait] 正常
磁盘使用率报告
% tm_act 表示物理磁盘处于活动状态的时间百分比(驱动器的带宽使用率)。
Kbps 表示以 KB 每秒为单位的传输(读或写)到驱动器的数据量。
tps 表示每秒钟输出到物理磁盘的传输次数。一次传输就是一个对物理磁盘的 I/O 请求。多个逻辑请求可被并为对磁盘的一个单一 I/O 请求。传输具有不确定的大小。
Kb_read 读取的 KB 总数。
Kb_wrtn 写入的 KB 总数。
磁盘负载均衡评估 正常
带宽使用评估 带宽值为:0Kbps
Hp-UNIX 命令vmstat释疑
# vmstat 5 5
procs memory page faults cpu
r b w avm free re at pi po fr de sr in sy cs us sy id
2 0 0 52260 24324 9 4 0 0 0 0 1 109 427 81 2 1 97
2 0 0 52260 24285 0 0 0 0 0 0 0 110 207 90 0 0 99
1 0 0 56211 24285 0 0 0 0 0 0 0 106 192 80 0 0 100
1 0 0 56211 24285 0 0 0 0 0 0 0 107 152 76 0 0 100
2 0 0 56552 24285 0 0 0 0 0 0 0 106 154 72 0 0 100
分析结果
procs
r 列表示在运行队列中等待的进程数。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
w 列表示可以进入运行队列但被交换出来的进程 。
[b] 正常
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。一个 UNIX 进程可以在用户方式下执行,也可以在系统(内核)方式下执行。当在用户方式下时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量。
sy 列详述了 CPU 在系统方式下执行一个进程所花时间的百分比。这包括内核进程(kprocs)和其它需要访问内核资源的进程所消耗的 CPU 资源。如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。例如,对一个文件的读或写操作需要内核资源来打开文件、寻找特定的位置,以及读或写数据,除非使用内存映射文件。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
id 列显示了没有未决本地磁盘 I/O 时 CPU 空闲或等待的时间百分比。
[us]+[sy] 正常
fault 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。iostat命令输出更有参考意义。
sy 列表示在某一时间间隔中观测到的每秒系统调用次数。通过明确的系统调用,用户进程可以使用资源。这些调用指示内核执行调用线程的操作,并在内核和该进程之间交换数据。因为工作负载和应用程序变化很大,不同的调用执行不同的功能,所以不可能定义每秒钟有多少系统调用才算太多。这里设置参考值为10000,超过10000,用户需要注意。
cs 列表示,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
[sy] 正常
memory
avm 当前激活的虚拟内存数量(k表示)。
free 当前的空闲页面列表中内存数量(k表示)
[free] 正常
page
re 列表示回收的页面数。
at 列表示地址翻译错误计数。
pi 列表示进入页面数 (k表示)。
po 列表示出页面数(k表示)。
fr 列表示空余的页面数(k表示)。
de 列表示提前读入的页面中的未命中数。
sr 列表示通过时钟算法扫描的页面计数
[po] 正常
[fr:sr] 正常
Hp-unix下iostat释疑
# iostat 5 5
device bps sps msps
c0t6d0 0 0.0 1.0
c0t6d0 2 1.0 1.0
c0t6d0 2 0.8 1.0
c0t6d0 4 2.0 1.0
c0t6d0 2 1.0 1.0
分析结果
缓冲区性能分析
device: iostat统计的设备名称。
bps: 每秒该设备传输的K字节数。
sps: 每秒检索该设备次数。
msps: 平均每次检索所花费的时间,单位毫秒。
[bps] 正常
sar
sar 命令行的常用格式:
sar [options] [-A] [-o file] t [n]
在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有
的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果以二进制格式
存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项,sar命令
的选项很多,下面只列出常用选项:
-A:所有报告的总和。
-u:CPU利用率
-v:进程、I节点、文件和锁表状态。
-d:硬盘使用报告。
-r:没有使用的内存页面和硬盘块。
-g:串口I/O的情况。
-b:缓冲区使用情况。
-a:文件读写情况。
-c:系统调用情况。
-R:进程的活动情况。
-y:终端设备活动情况。
-w:系统交换活动。
下面将举例说明。
例一:使用命令行 sar -u t n
例如,每60秒采样一次,连续采样5次,观察CPU 的使用情况,并将采样结果以二进制
形式存入当前目录下的文件zhou中,需键入如下命令:
# sar -u -o zhou 60 5
屏幕显示:
SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
14:43:50 %usr %sys %wio %idle(-u)
14:44:50 0 1 4 94
14:45:50 0 2 4 93
14:46:50 0 2 2 96
14:47:50 0 2 5 93
14:48:50 0 2 2 96
Average 0 2 4 94
在显示内容包括:
%usr:CPU处在用户模式下的时间百分比。
%sys:CPU处在系统模式下的时间百分比。
%wio:CPU等待输入输出完成时间的百分比。
%idle:CPU空闲时间百分比。
在所有的显示中,我们应主要注意%wio和%idle,%wio的值过高,表示硬盘存在I/O瓶颈,
%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,
此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表
明系统中最需要解决的资源是CPU。
如果要查看二进制文件zhou中的内容,则需键入如下sar命令:
# sar -u -f zhou
可见,sar命令即可以实时采样,又可以对以往的采样结果进行查询。
例二:使用命行sar -v t n
例如,每30秒采样一次,连续采样5次,观察核心表的状态,需键入如下命令:
# sar -v 30 5
屏幕显示:
SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
10:33:23 proc-sz ov inod-sz ov file-sz ov lock-sz (-v)
10:33:53 305/ 321 0 1337/2764 0 1561/1706 0 40/ 128
10:34:23 308/ 321 0 1340/2764 0 1587/1706 0 37/ 128
10:34:53 305/ 321 0 1332/2764 0 1565/1706 0 36/ 128
10:35:23 308/ 321 0 1338/2764 0 1592/1706 0 37/ 128
10:35:53 308/ 321 0 1335/2764 0 1591/1706 0 37/ 128
显示内容包括:
proc-sz:目前核心中正在使用或分配的进程表的表项数,由核心参数MAX-PROC控制。
inod-sz:目前核心中正在使用或分配的i节点表的表项数,由核心参数
MAX-INODE控制。
file-sz: 目前核心中正在使用或分配的文件表的表项数,由核心参数MAX-FILE控
制。
ov:溢出出现的次数。
Lock-sz:目前核心中正在使用或分配的记录加锁的表项数,由核心参数MAX-FLCKRE
控制。
显示格式为
实际使用表项/可以使用的表项数
显示内容表示,核心使用完全正常,三个表没有出现溢出现象,核心参数不需调整,如
果出现溢出时,要调整相应的核心参数,将对应的表项数加大。
例三:使用命行sar -d t n
例如,每30秒采样一次,连续采样5次,报告设备使用情况,需键入如下命令:
# sar -d 30 5
屏幕显示:
SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
11:06:43 device %busy avque r+w/s blks/s avwait avserv (-d)
11:07:13 wd-0 1.47 2.75 4.67 14.73 5.50 3.14
11:07:43 wd-0 0.43 18.77 3.07 8.66 25.11 1.41
11:08:13 wd-0 0.77 2.78 2.77 7.26 4.94 2.77
11:08:43 wd-0 1.10 11.18 4.10 11.26 27.32 2.68
11:09:13 wd-0 1.97 21.78 5.86 34.06 69.66 3.35
Average wd-0 1.15 12.11 4.09 15.19 31.12 2.80
显示内容包括:
device: sar命令正在监视的块设备的名字。
%busy: 设备忙时,传送请求所占时间的百分比。
avque: 队列站满时,未完成请求数量的平均值。
r+w/s: 每秒传送到设备或从设备传出的数据量。
blks/s: 每秒传送的块数,每块512字节。
avwait: 队列占满时传送请求等待队列空闲的平均时间。
avserv: 完成传送请求所需平均时间(毫秒)。
在显示的内容中,wd-0是硬盘的名字,%busy的值比较小,说明用于处理传送请求的有
效时间太少,文件系统效率不高,一般来讲,%busy值高些,avque值低些,文件系统
的效率比较高,如果%busy和avque值相对比较高,说明硬盘传输速度太慢,需调整。
例四:使用命行sar -b t n
例如,每30秒采样一次,连续采样5次,报告缓冲区的使用情况,需键入如下命令:
# sar -b 30 5
屏幕显示:
SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
14:54:59 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)
14:55:29 0 147 100 5 21 78 0 0
14:55:59 0 186 100 5 25 79 0 0
14:56:29 4 232 98 8 58 86 0 0
14:56:59 0 125 100 5 23 76 0 0
14:57:29 0 89 100 4 12 66 0 0
Average 1 156 99 5 28 80 0 0
显示内容包括:
bread/s: 每秒从硬盘读入系统缓冲区buffer的物理块数。
lread/s: 平均每秒从系统buffer读出的逻辑块数。
%rcache: 在buffer cache中进行逻辑读的百分比。
bwrit/s: 平均每秒从系统buffer向磁盘所写的物理块数。
lwrit/s: 平均每秒写到系统buffer逻辑块数。
%wcache: 在buffer cache中进行逻辑读的百分比。
pread/s: 平均每秒请求物理读的次数。
pwrit/s: 平均每秒请求物理写的次数。
在显示的内容中,最重要的是%cache和%wcache两列,它们的值体现着buffer的使用效
率,%rcache的值小于90或者%wcache的值低于65,应适当增加系统buffer的数量,buffer
数量由核心参数NBUF控制,使%rcache达到90左右,%wcache达到80左右。但buffer参数
值的多少影响I/O效率,增加buffer,应在较大内存的情况下,否则系统效率反而得不到
提高。
例五:使用命行sar -g t n
例如,每30秒采样一次,连续采样5次,报告串口I/O的操作情况,需键入如下命令:
# sar -g 30 5
屏幕显示:
SCO_SV scosysv 3.2v5.0.5 i80386 11/22/2001
17:07:03 ovsiohw/s ovsiodma/s ovclist/s (-g)
17:07:33 0.00 0.00 0.00
17:08:03 0.00 0.00 0.00
17:08:33 0.00 0.00 0.00
17:09:03 0.00 0.00 0.00
17:09:33 0.00 0.00 0.00
Average 0.00 0.00 0.00
显示内容包括:
ovsiohw/s:每秒在串口I/O硬件出现的溢出。
ovsiodma/s:每秒在串口I/O的直接输入输出通道高速缓存出现的溢出。
ovclist/s :每秒字符队列出现的溢出。
在显示的内容中,每一列的值都是零,表明在采样时间内,系统中没有发生串口I/O溢
出现象。
sar命令的用法很多,有时判断一个问题,需要几个sar命令结合起来使用,比如,怀疑
CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b、sar -u和
sar-d来看
Sar
-A 所有的报告总和
-a 文件读,写报告
-B 报告附加的buffer cache使用情况
-b buffer cache使用情况
-c 系统调用使用报告
-d 硬盘使用报告
-g 有关串口I/O情况
-h 关于buffer使用统计数字
-m IPC消息和信号灯活动
-n 命名cache
-p 调页活动
-q 运行队列和交换队列的平均长度
-R 报告进程的活动
-r 没有使用的内存页面和硬盘块
-u CPU利用率
-v 进程,i节点,文件和锁表状态
-w 系统交换活动
-y TTY设备活动
-a 报告文件读,写报告
sar –a 5 5
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
11:45:40 iget/s namei/s dirbk/s (-a)
11:45:45 6 2 2
11:45:50 91 20 28
11:45:55 159 20 18
11:46:00 157 21 19
11:46:05 177 30 35
Average 118 18 20
iget/s 每秒由i节点项定位的文件数量
namei/s 每秒文件系统路径查询的数量
dirbk/s 每秒所读目录块的数量
*这些值越大,表明核心花在存取用户文件上的时间越多,它反映着一些程序和应用文件系统产生的负荷。一般地,如果iget/s与namei/s的比值大于5,并且namei/s的值大于30,则说明文件系统是低效的。这时需要检查文件系统的*空间,看看是否*空间过少。
-b 报告缓冲区(buffer cache)的使用情况
sar -b 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
13:51:28 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)
13:51:30 382 1380 72 131 273 52 0 0
13:51:32 378 516 27 6 22 72 0 0
13:51:34 172 323 47 39 57 32 0 0
Average 310 739 58 58 117 50 0 0
bread/s 平均每秒从硬盘(或其它块设备)读入系统buffer的物理块数
lread/s 平均每秒从系统buffer读出的逻辑块数
%rcache 在buffer cache中进行逻辑读的百分比(即100% - bread/lreads)
bwrit/s 平均每秒从系统buffer向磁盘(或其它块设备)所写的物理块数
lwrit/s 平均每秒写到系统buffer的逻辑块数
%wcache 在buffer cache中进行逻辑写的百分比(即100% - bwrit/lwrit).
pread/sgu 平均每秒请求进行物理读的次数
pwrit/s 平均每秒请求进行物理写的次数
*所显示的内容反映了目前与系统buffer有关的读,写活。在所报告的数字中,最重要的是%rcache和%wcache(统称为cache命中率)两列,它们具体体现着系统buffer的效率。衡量cache效率的标准是它的命中率值的大小。
*如果%rcache的值小于90或者%wcache的值低于65,可能就需要增加系统buffer的数量。如果在系统的应用中,系统的I/O活动十分频繁,并且在内存容量配置比较大时,可以增加buffer cache,使%rcache达到95左右,%wcache达到80左右。
*系统buffer cache中,buffer的数量由核心参数NBUF控制。它是一个要调的参数。系统中buffer数量的多少是影响系统I/O效率的瓶颈。要增加系统buffer数量,则要求应该有较大的内存配置。否则一味增加buffer数量,势必减少用户进程在内存中的运行空间,这同样会导致系统效率下降。
-c 报告系统调用使用情况
sar -c 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
17:02:42 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s (-c)
17:02:44 2262 169 141 0.00 0.00 131250 22159
17:02:46 1416 61 38 0.00 0.00 437279 6464
17:02:48 1825 43 25 0.00 0.00 109397 42331
Average 1834 91 68 0.00 0.00 225975 23651
scall/s 每秒使用系统调用的总数。一般地,当4~6个用户在系统上工作时,每秒大约30个左右。
sread/s 每秒进行读操作的系统调用数量。
swrit/s 每秒进行写操作的系统调用数量。
fork/s 每秒fork系统调用次数。当4~6个用户在系统上工作时,每秒大约0.5秒左右。
exec/s 每秒exec系统调用次数。
rchar/s 每秒由读操作的系统调用传送的字符(以字节为单位)。
wchar/s 每秒由写操作的系统调用传送的字符(以字节为单位)。
*如果scall/s持续地大于300,则表明正在系统中运行的可能是效率很低的应用程序。在比较
典型的情况下,进行读操作的系统调用加上进行写操作的系统调用之和,约是scall的一半左右。
-d 报告硬盘使用情况
sar -d 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
17:27:49 device %busy avque r+w/s blks/s avwait avserv (-d)
17:27:51 ida-0 6.93 1.00 13.86 259.41 0.00 5.00
ida-1 0.99 1.00 17.33 290.10 0.00 0.57
17:27:53 ida-0 75.50 1.00 54.00 157.00 0.00 13.98
ida-1 9.50 1.00 12.00 75.00 0.00 7.92
17:27:55 ida-0 7.46 1.00 46.77 213.93 0.00 1.60
ida-1 17.41 1.00 57.71 494.53 0.00 3.02
Average ida-0 29.85 1.00 38.14 210.28 0.00 7.83
ida-1 9.29 1.00 29.02 286.90 0.00 3.20
device 这是sar命令正在监视的块设备的名字。
%busy 设备忙时,运行传送请求所占用的时间。这个值以百分比表示。
avque 在指定的时间周期内,没有完成的请求数量的平均值。仅在队列被占满时取这个值。
r+w/s 每秒传送到设备或者从设备传送出的数据量。
blks/s 每秒传送的块数。每块512个字节。
avwait 传送请求等待队列空闲的平均时间(以毫秒为单位)。仅在队列被占满时取这个值。
avserv 完成传送请求所需平均时间(以毫秒为单位)
*ida-0和ida-1是硬盘的设备名字。在显示的内容中,如果%busy的值比较小,说明用于处理
传送请求的有效时间太少,文件系统的效率不高。要使文件系统的效率得到优化,应使%busy的数值相对高一些,而avque的值应该低一些。
-g 报告有关串口I/O情况
sar -g 3 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
11:10:09 ovsiohw/s ovsiodma/s ovclist/s (-g)
11:10:12 0.00 0.00 0.00
11:10:15 0.00 0.00 0.00
11:10:18 0.00 0.00 0.00
Average 0.00 0.00 0.00
ovsiohw/s 每秒在串囗I/O硬件出现的溢出。
ovsiodma/s 每秒在串囗I/O的直接输入,输出信道高速缓存出现的溢出。
ovclist/s 每秒字符队列出现的溢出。
-m 报告进程间的通信活动(IPC消息和信号灯活动)情况
sar -m 4 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
13:24:28 msg/s sema/s (-m)
13:24:32 2.24 9.95
13:24:36 2.24 21.70
13:24:40 2.00 36.66
Average 2.16 22.76
msg/s 每秒消息操作的次数(包括发送消息的接收信息)。
sema/s 每秒信号灯操作次数。
*信号灯和消息作为进程间通信的工具,如果在系统中运行的应用过程中没有使用它们,那么由sar命令报告的msg 和sema的值都将等于0.00。如果使用了这些工具,并且其中或者msg/s大于100,或者sema/s大于100,则表明这样的应用程序效率比较低。原因是在这样的应用程序中,大量的时间花费在进程之间的沟通上,而对保证进程本身有效的运行时间必然产生不良的影响。
-n 报告命名缓冲区活动情况
sar -n 4 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
13:37:31 c_hits cmisses (hit %) (-n)
13:37:35 1246 71 (94%)
13:37:39 1853 81 (95%)
13:37:43 969 56 (94%)
Average 1356 69 (95%)
c_hits cache命中的数量。
cmisses cache未命中的数量。
(hit %) 命中数量/(命中数理+未命中数量)。
*不难理解,(hit %)值越大越好,如果它低于90%,则应该调整相应的核心参数。
-p 报告分页活动
sar -p 5 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
13:45:26 vflt/s pflt/s pgfil/s rclm/s (-p)
13:45:31 36.25 50.20 0.00 0.00
13:45:36 32.14 58.48 0.00 0.00
13:45:41 79.80 58.40 0.00 0.00
Average 49.37 55.69 0.00 0.00
vflt/s 每秒进行页面故障地址转换的数量(由于有效的页面当前不在内存中)。
pflt/s 每秒来*于保护错误出现的页面故障数量(由于对页面的非法存,取引起的页面故障)。
pgfil/s 每秒通过”页—入”满足vflt/s的数量。
rclm/s 每秒由系统恢复的有效页面的数量。有效页面被增加到*页面队列上。
*如果vflt/s的值高于100,可能预示着对于页面系统来说,应用程序的效率不高,也可能分页参数需要调整,或者内存配置不太合适。
-q 报告进程队列(运行队列和交换队列的平均长度)情况
sar -q 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
14:25:50 runq-sz %runocc swpq-sz %swpocc (-q)
14:25:52 4.0 50
14:25:54 9.0 100
14:25:56 9.0 100
Average 7.3 100
runq-sz 准备运行的进程运行队列。
%runocc 运行队列被占用的时间(百分比)
swpq-sz 要被换出的进程交换队列。
%swpocc 交换队列被占用的时间(百分比)。
*如果%runocc大于90,并且runq-sz的值大于2,则表明CPU的负载较重。其直接后果,可能使系统的响应速度降低。如果%swpocc大于20,表明交换活动频繁,将严重导致系统效率下降。解决的办法是加大内存或减少缓存区数量,从而减少交换及页—入,页—出活动。
-r 报告内存及交换区使用情况(没有使用的内存页面和硬盘块)
sar -r 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
10:14:19 freemem freeswp availrmem availsmem (-r)
10:14:22 279729 6673824 93160 1106876
10:14:24 279663 6673824 93160 1106876
10:14:26 279661 6673824 93160 1106873
Average 279684 6673824 93160 1106875
freemem 用户进程可以使用的内存页面数,4KB为一个页面。
freeswp 用于进程交换可以使用的硬盘盘块,512B为一个盘块。
-u CPU利用率
sar -u 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
10:27:23 %usr %sys %wio %idle (-u)
10:27:25 2 3 8 88
10:27:27 3 3 5 89
10:27:29 0 0 0 100
Average 2 2 4 92
%usr cpu处在用户模式下时间(百分比)
%sys cpu处在系统模式下时间(百分比)
%wio cpu等待输入,输出完成(时间百分比)
%idle cpu空闲时间(百分比)
*在显示的内容中,%usr和 %sys这两个值一般情况下对系统无特别影响,%wio的值不能太高,如果%wio的值过高,则CPU花在等待输入,输出上的时间太多,这意味着硬盘存在I/O瓶颈。如果%idle的值比较高,但系统响应并不快,那么这有可能是CPU花时间等待分配内存引起的。%idle的值可以较深入帮助人们了解系统的性能,在这种情况上,%idle的值处于40~100之间,一旦它持续低于30,则表明进程竟争的主要资源不是内存而是CPU。
*在有大量用户运行的系统中,为了减少CPU的压力,应该使用智能多串卡,而不是非智能多串卡。智能多串卡可以承担CPU的某些负担。
*此外,如果系统中有大型的作业运行,应该把它们合理调度,错开高峰,当系统相对空闲时再运行。
-v 报告系统表的内容(进程,i节点,文件和锁表状态)
sar -v 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
10:56:46 proc-sz ov inod-sz ov file-sz ov lock-sz (-v)
10:56:48 449/ 500 0 994/4147 0 1313/2048 0 5/ 128
10:56:50 450/ 500 0 994/4147 0 1314/2048 0 5/ 128
10:56:52 450/ 500 0 994/4147 0 1314/2048 0 5/ 128
proc-sz 目前在核心中正在使用或分配的进程表的表项数
inod-sz 目前在核心中正在使用或分配的i节点表的表项数
file-sz 目前在核心中正在使用或分配的文件表的表项数
ov 溢出出现的次数
lock-sz 目前在核心中正在使用或分配的记录加锁的表项数
*除ov外,均涉及到unix的核心参数,它们分别受核心参数NPROC,NIMODE,NFILE和FLOCKREC的控制。
*显示格式为:
实际使用表项/整个表可以使用的表项数
比如,proc-sz一列所显示的四个数字中,分母的100是系统中整个进程表的长度(可建立100个表项),分子上的24,26和25分别是采样的那一段时间所使用的进程表项。inod-sz,file-sz和lock-sz三列数字的意义也相同。
三列ov的值分别对应进程表,i节点表和文件表,表明目前这三个表都没有出现溢出现象,当出现溢出时,需要调整相应的核心参数,将对应表加大。
-w 系统交换活动
sar -w 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
11:22:05 swpin/s bswin/s swpot/s bswots pswch/s (-w)
11:22:07 0.00 0.0 0.00 0.0 330
11:22:09 0.00 0.0 0.00 0.0 892
11:22:11 0.00 0.0 0.00 0.0 1053
Average 0.00 0.0 0.00 0.0 757
swpin/s 每秒从硬盘交换区传送进入内存的次数。
bswin/s 每秒为换入而传送的块数。
swpot/s 每秒从内存传送到硬盘交换区的次数。
bswots 每秒为换出而传送的块数。
pswch/s 每秒进程交换的数量。
*swpin/s,bswin/s,swpot/s和bswots描述的是与硬盘交换区相关的交换活动。交换关系到系统的效率。交换区在硬盘上对硬盘的读,写操作比内存读,写慢得多,因此,为了提高系统效率就应该设法减少交换。通常的作法就是加大内存,使交换区中进行的交换活动为零,或接近为零。如果swpot/s的值大于1,预示可能需要增加内存或减少缓冲区(减少缓冲区能够释放一部分*内存空间)。
-y 报告终端的I/O活动(TTY设备活动)情况
sar -y 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
11:38:03 rawch/s canch/s outch/s rcvin/s xmtin/s mdmin/s (-y)
11:38:05 5 0 951 0 1 0
11:38:07 10 0 996 0 0 0
11:38:09 4 0 2264 0 0 0
Average 6 0 1404 0 1 0
rawch/s 每秒输入的字符数(原始队列)
canch/s 每秒由正则队列(canonical queue)处理的输入字符数。进行正则处理过程中,可以识别出一些有特殊意义的字符。比如,(中断字符),(退出符),(退格键)等。因此,canch/s中的计数不包括这些有特殊意义的字符。
outch/s 每秒输出的字符数。
rcvin/s 每秒接收的硬件中断次数。
xmtin/s 每秒发出的硬件中断次数。
mdmin/s 每秒modem中断次数。
*应该特别说明,sar命令可以对任意终端活动进行统计,所谓任意终端,是指任意tty设备。它们可以是串行终端,主控台,伪终端等等。
*在这几个量中,modem中断次数mdmin/s应该接近0。其它没有特殊要求,但如果每发送一个字符,中断的数量就动态地增加,这表明终端线出了差错,可能是接触不好。
附录4 DBA日常维护的SQL
1 查询有enqueue等待的事件
SELECT b.SID, b.serial#, b.username, machine, a.event, a.wait_time,
CHR (BITAND (a.p1, -16777216) / 16777215)
|| CHR (BITAND (a.p1, 16711680) / 65535) "Enqueue Type"
FROM v$session_wait a, v$session b WHERE a.event NOT LIKE 'SQL*N%'
AND a.event NOT LIKE 'rdbms%'
AND a.SID = b.SID
AND b.SID > 8
AND a.event = 'enqueue'
ORDER BY username;
/
2 如何确定哪个表空间读写频繁?
select name,phyrds,phywrts,readtim,writetim
from v$filestat a,v$dbfile b
where a.file# = b.file#
order by readtim desc
/
3 Library Cache Pin/Lock Pile Up
SELECT s.sid , kglpnmod "Mode" , kglpnreq "req", SPID "OS_Process" From
v$session_wait w, x$kglpn p, v$session s ,v$process o
WHERE p.kglpnuse=s.saddr
AND kglpnhdl=w.p1raw
and w.event like '%library cache pin%'
and s.paddr=o.addr
/
4 全表扫描的表
col name for a30
select name,value from v$sysstat
where name in ('table scans(short tables)','table scans(long tables)');
5 查询SQL语句执行时,硬语法分析的次数
select name,value
from v$sysstat
where name like 'parse count%';
6 该项显示buffer cache大小是否合适
公式:1-((physical reads-physical reads direct-physical reads direct (lob)) / session logical reads)
执行:
select 1-((a.value-b.value-c.value)/d.value)
from
v$sysstat a,v$sysstat b,v$sysstat
c,v$sysstat d
where
a.name='physical reads' and
b.name='physical reads direct' and
c.name='physical reads direct (lob)' and
d.name='session logical Reads';
/
7 该项显示buffer命中率
公式:1-(physical
reads/ (db block gets+consistent gets))
执行:
Select 1 - (Sum(Decode(Name, 'physical reads', Value, 0)) /
(Sum(Decode(Name, 'db block gets', Value, 0)) +
Sum(Decode(Name, 'consistent gets', Value, 0))))
"Buffer Hit Ratio"
From V$sysstat;
8 Soft parse ratio:
这项将显示系统是否有太多硬解析。该值将会与原始统计数据对比以确保精确。例如,软解析率仅为0.2则表示硬解析率太高。不过,如果总解析量(parse
count total)偏低,这项值可以被忽略。
公式:1
- ( parse count (hard) / parse count (total) )
执行:
select 1-(a.value/b.value)
from v$sysstat a,v$sysstat
b
Where a.name='parse
count (hard)' and
b.name='parse count (total)';
9 In-memory sort ratio:
该项显示内存中完成的排序所占比例。最理想状态下,在OLTP系统中,大部分排序不仅小并且能够完全在内存里完成排序。
公式:sorts (memory) / ( sorts (memory) + sorts (disk) )
执行:
select a.value/(b.value+c.value) from v$sysstat a,v$sysstat
b,v$sysstat c
where
a.name='sorts (memory)' and
b.name='sorts
(memory)' and
c.name='sorts (disk)';
10 Parse to execute ratio:
在生产环境,最理想状态是一条sql语句一次解析多数运行。
公式:1 - (parse count/execute count)
执行:
select 1-(a.value/b.value)
from
v$sysstat a,v$sysstat b
where a.name='parse
count (total)' and
b.name='execute count';
11 Parse CPU to total CPU ratio:
该项显示总的CPU花费在执行及解析上的比率。如果这项比率较低,说明系统执行了太多的解析。
公式:1 - (parse time cpu / CPU used by this session)
执行:
select 1-(a.value/b.value) from v$sysstat a,v$sysstat
b
where
a.name='parse time cpu' and
b.name='CPU used by this session';
12 Parse time CPU to parse time elapsed:
通常,该项显示锁竞争比率。这项比率计算是否时间花费在解析分配给CPU进行周期运算(即生产工作)。解析时间花费不在CPU周期运算通常表示由于锁竞争导致了时间花费
公式:parse time cpu / parse time elapsed
执行:
select a.value/b.value
from
v$sysstat a,v$sysstat b
where
a.name='parse time cpu' and b.name='parse time elapsed';
13 从V$SYSSTAT获取负载间档(Load Profile)数据
负载间档是监控系统吞吐量和负载变化的重要部分,该部分提供如下每秒和每个事务的统计信息:logons cumulative, parse count (total), parse
count (hard), executes, physical reads, physical writes, block changes, and
redo size.被格式化的数据可检查’rates’是否过高,或用于对比其它基线数据设置为识别system profile在期间如何变化。例如,计算每个事务中block
changes可用如下公式:
db block changes / ( user commits + user
rollbacks )
执行:
select
a.value/(b.value+c.value)
from v$sysstat a,v$sysstat
b,v$sysstat c
where
a.name='db block changes' and
b.name='user commits' and c.name='user rollbacks';
Blocks changed for
each read:
这项显示出block changes在block
reads中的比例。它将指出是否系统主要用于只读访问或是主要进行诸多数据操作(如:inserts/updates/deletes)
公式:db block changes / session logical reads
执行:select a.value/b.value from
v$sysstat a,v$sysstat b where a.name=‘db block changes’ and
b.name=‘session logical reads’ ;
14 Rows for each sort:
公式:sorts (rows) / ( sorts (memory) +
sorts (disk) )
执行:
Select a.Value / (b.Value + c.Value)
From
V$sysstat a, V$sysstat b,
V$sysstat c
Where
a.Name = 'sorts(Rows)
'
And
b.Name = 'sorts(Memory)
'
And c.Name = 'sorts(Disk) ';
15 表的约束条件
Select Constraint_Name,
Constraint_Type,
Search_Condition,
r_Constraint_Name
From
User_Constraints
Where
Table_Name = Upper(‘ &Table_Name’);
Select c.Constraint_Name, c.Constraint_Type,
Cc.Column_Name
From
User_Constraints c, User_Cons_Columns Cc
Where
c.Owner = Upper(‘ &Table_Owner’)
And
c.Table_Name = Upper(‘ &Table_Name’)
And
c.Owner = Cc.Owner
And
c.Constraint_Name = Cc.Constraint_Name
Order By
Cc.Position;
16 表空间的名称及大小
select t.tablespace_name, round(sum(bytes/(1024*1024)),0)
ts_size
from
dba_tablespaces t, dba_data_files d
where
t.tablespace_name = d.tablespace_name
group by
t.tablespace_name;
17 看回滚段名称及大小
select segment_name, tablespace_name,
r.status,
(initial_extent/1024)
InitialExtent,(next_extent/1024)
NextExtent,
max_extents, v.curext CurExtent
From
dba_rollback_segs r, v$rollstat v
Where
r.segment_id = v.usn(+)
order by
segment_name ;
18 表空间的使用情况
select sum(bytes)/(1024*1024) as
free_space,tablespace_name
from dba_free_space
group by
tablespace_name;
SELECT A.TABLESPACE_NAME,A.BYTES
TOTAL,B.BYTES USED,
C.BYTES FREE,
(B.BYTES*100)/A.BYTES
"% USED",(C.BYTES*100)/A.BYTES
"% FREE"
FROM
SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE
C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME
AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
19 移动一个表的多个分区时的脚本
BEGIN
FOR x IN (SELECT partition_name
FROM user_tab_partitions
WHERE table_name =
‘BIG_TABLE2′)
LOOP
EXECUTE IMMEDIATE ‘alter table
big_table2 move partition ‘
||
x.partition_name;
END LOOP;
END;
/
20 看LOCK
SELECT /*+ ORDERED USE_HASH(H,R) */
H.SID
HOLD_SID,
R.SID
WAIT_SID,
decode(H.type,'MR', 'Media Recovery',
'RT', 'Redo
Thread',
'UN', 'User
Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL
User Lock',
'DX', 'Distributed
Xaction',
'CF', 'Control
File',
'IS', 'Instance
State',
'FS', 'File
Set',
'IR', 'Instance
Recovery',
'ST', 'Disk
Space Transaction',
'TS', 'Temp
Segment',
'IV', 'Library
Cache Invalidation',
'LS', 'Log
Start or Switch',
'RW', 'Row
Wait',
'SQ', 'Sequence
Number',
'TE', 'Extend
Table',
'TT', 'Temp
Table',H.type) Type,
decode(H.lmode,0, 'None', 1, 'Null',2, 'Row-S (SS)', 3, 'Row-X
(SX)',
4, 'Share', 5, 'S/Row-X
(SSX)',
6, 'Exclusive', to_char(H.lmode))
hold,
decode(r.request, 0, 'None',
1, 'Null', 2, 'Row-S
(SS)',
3, 'Row-X
(SX)', 4, 'Share',
5, 'S/Row-X
(SSX)',6, 'Exclusive',to_char(R.request))
request,R.ID1,R.ID2,R.CTIME
FROM
V$LOCK H,V$LOCK R
WHERE
H.BLOCK = 1 AND R.BLOCK=0
and
H.TYPE <> 'MR' AND R.TYPE <> 'MR'
AND
H.ID1 = R.ID1 AND H.ID2 =
R.ID2
21 查看ORACLE运行的OS平台
Set
serveroutput on
begin
dbms_output.put_line(dbms_utility.port_string);
end;
/
Linuxi386/Linux-2.0.34-8.1.0
PL/SQL 过程已成功完成。
22 看空间详细使用情况
CREATE OR REPLACE
PROCEDURE show_space (
p_segname IN VARCHAR2,
p_owner IN VARCHAR2 DEFAULT USER,
p_type IN VARCHAR2
DEFAULT 'TABLE',
p_partition IN VARCHAR2 DEFAULT NULL)
AS
l_total_blocks NUMBER;
l_total_bytes NUMBER;
l_unused_blocks NUMBER;
l_unused_bytes NUMBER;
l_lastusedextfileid NUMBER;
l_lastusedextblockid NUMBER;
l_last_used_block NUMBER;
PROCEDURE p (p_label IN VARCHAR2, p_num IN NUMBER)
IS
BEGIN
DBMS_OUTPUT.put_line (RPAD (p_label, 40, '.') || p_num);
END;
BEGIN
DBMS_SPACE.unused_space
(segment_owner
=> p_owner,
segment_name
=> p_segname,
segment_type
=> p_type,
partition_name
=> p_partition,
total_blocks
=> l_total_blocks,
total_bytes
=> l_total_bytes,
unused_blocks
=> l_unused_blocks,
unused_bytes
=> l_unused_bytes,
last_used_extent_file_id
=> l_lastusedextfileid,
last_used_extent_block_id
=> l_lastusedextblocki
last_used_block
=>
l_last_used_block
);
p
('Total Blocks', l_total_blocks);
p
('Total Bytes', l_total_bytes);
p
('Unused Blocks', l_unused_blocks);
p
('Unused Bytes', l_unused_bytes);
p
('Last Used Ext FileId', l_lastusedextfileid);
p
('Last Used Ext BlockId', l_lastusedextblockid);
p
('Last Used Block', l_last_used_block);
END;
/
23 缓冲区的相关SQL
SELECT tch, file#, dbablk,
CASE
WHEN obj
= 4294967295
THEN 'rbs/compat segment'
ELSE (SELECT MAX ( '('
||
object_type
|| ') '
||
owner
|| '.'
||
object_name
)
||
DECODE (COUNT (*), 1, '', ' maybe!')
FROM dba_objects
WHERE data_object_id =
x.obj)
END
what
FROM (SELECT tch,
file#, dbablk, obj
FROM
x$bh WHERE
state <> 0
ORDER BY tch
DESC) x WHERE ROWNUM <= 5;
24 获取生成的根据文件名
select c.value ||'/' ||
d.instance_name || '_ora_' ||a.spid || '.trc' trace from v$process a,v$session
b,v$parameter c,v$instance
d
where
a.addr=b.paddr
and
b.audsid=userenv('sessionid')
and
c.name='user_dump_dest'
/
在v$session_longops视图中,sofar字段表示已经扫描的块数,totalwork表示总得需要扫描的块数,所以我们即可以对正在运行的长查询进行监控,比如在索引创建时,查看索引创建的进度,也可以查看系统中以往的长查询。。。
col opname format a32
col target_desc format a32
col perwork format a12
set
lines 131
select sid,OPNAME,TARGET_DESC,sofar,TOTALWORK,trunc(sofar/totalwork*100,2)||'%' as perwork from v$session_longops where
sofar!=totalwork;
set
lines 121
set
pages 999
col opname format a29
col target format a29
col target_desc format a12
col perwork format a12
col remain format 99
col start_time format a21
col sofar format 99999999
col totalwork format 99999999
col sql_text format a101
col bufgets format 99999999
select opname,target,to_char(start_time,'yy-mm-dd:hh24:mi:ss')
start_time,elapsed_seconds elapsed,executions
execs,buffer_gets/decode(executions,0,1,executions)
bufgets,module,sql_text
from
v$session_longops sl,v$sqlarea sa
where
sl.sql_hash_value = sa.hash_value and
upper(substr(module,1,4)) <> 'RMAN' and substr(opname,1,4) <> 'RMAN'
and module <> 'SQL*Plus' and sl.start_time>trunc(sysdate)
order by start_time;
25 监控实例的等待
Select Event,
Sum(Decode(Wait_Time, 0, 0, 1)) "Prev",
Sum(Decode(Wait_Time, 0, 1, 0)) "Curr",
Count(*) "Tot"
From
V$session_Wait
Group By
Event
Order By 4;
26 回滚段的争用情况
select name,
waits, gets, waits/gets "Ratio" from v$rollstat a,
v$rollname b where
a.usn = b.usn;
27 监控表空间的
I/O 比例
select df.tablespace_name name,df.file_name "file",f.phyrds
pyr,
f.phyblkrd pbr,f.phywrts pyw,
f.phyblkwrt pbw from
v$filestat f, dba_data_files df where f.file# =
df.file_id order by
df.tablespace_name;
28 监控文件系统的
I/O 比例
Select Substr(a.File#, 1, 2)
"#",
Substr(a.Name, 1, 30)
"Name",
a.Status,
a.Bytes,
b.Phyrds,
b.Phywrts
From
V$datafile a, V$filestat b
Where
a.File# = b.File#;
29 在某个用户下找所有的索引
Select User_Indexes.Table_Name,
User_Indexes.Index_Name,
Uniqueness,
Column_Name
From
User_Ind_Columns, User_Indexes
Where
User_Ind_Columns.Index_Name = User_Indexes.Index_Name
And
User_Ind_Columns.Table_Name = User_Indexes.Table_Name
Order By
User_Indexes.Table_Type,
User_Indexes.Table_Name,
User_Indexes.Index_Name,
Column_Position;
30 监控
SGA 的命中率
Select a.Value + b.Value "logical_reads",
c.Value "phys_reads",
Round(100 * ((a.Value + b.Value) -
c.Value) / (a.Value + b.Value))
"BUFFER HIT RATIO"
From
V$sysstat a, V$sysstat b,
V$sysstat c
Where
a.Statistic# = 38
And
b.Statistic# = 39
And c.Statistic# = 40;
31 监控
SGA 中字典缓冲区的命中率
Select Parameter,
Gets,
Getmisses,
Getmisses / (Gets + Getmisses) * 100 "miss
ratio",
(1 - (Sum(Getmisses) / (Sum(Gets) + Sum(Getmisses)))) * 100
"Hit ratio"
From
V$rowcache
Where
Gets + Getmisses <> 0
Group By Parameter, Gets,
Getmisses;
32 监控
SGA *享缓存区的命中率,应该小于1%
Select Sum(Pins)
"Total Pins",
Sum(Reloads) "Total Reloads",
Sum(Reloads) / Sum(Pins) * 100 Libcache
From
V$librarycache;
Select Sum(Pinhits
- Reloads) / Sum(Pins) "hit radio",
Sum(Reloads) / Sum(Pins) "reload percent"
From
V$librarycache;
33
显示所有数据库对象的类别和大小
Select Count(Name)
Num_Instances,
Type,
Sum(Source_Size)
Source_Size,
Sum(Parsed_Size)
Parsed_Size,
Sum(Code_Size) Code_Size,
Sum(Error_Size) Error_Size,
Sum(Source_Size) + Sum(Parsed_Size) + Sum(Code_Size) +
Sum(Error_Size) Size_Required
From
Dba_Object_Size
Group By Type
Order By 2;
34 监控
SGA 中重做日志缓存区的命中率,应该小于1%
Select Name,
Gets,
Misses,
Immediate_Gets,
Immediate_Misses,
Decode(Gets, 0, 0,
Misses / Gets * 100) Ratio1,
Decode(Immediate_Gets
+ Immediate_Misses,
0,
0,
Immediate_Misses / (Immediate_Gets +
Immediate_Misses) * 100)
Ratio2
From
V$latch
Where Name In ('redo
allocation', 'redo
copy');
35 监控内存和硬盘的排序比率
最好使它小于 .10,增加 sort_area_size
Select Name, Value
From
V$sysstat
Where Name In ('sorts (memory)', 'sorts (disk)');
36 监控当前数据库谁在运行什么SQL语句
Select Osuser, Username, Sql_Text
From
V$session a, V$sqltext b
Where
a.Sql_Address = b.Address
Order By
Address, Piece;
37 监控字典缓冲区
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;
38 找ORACLE字符集
select * from sys.props$ where name='NLS_CHARACTERSET';
select * from
nls_dataase_parameters where parameter='NLS_CHARACTERSET';
select userenv('language')
from dual;
Cat .profile
生产数据库字符集须依据应用系统特性来定义,推荐的数据库字符集为ZHS16GBK。国家语言字符集为AL16UTF16。
39
监控 MTS
select busy/(busy+idle) "shared servers busy" from
v$dispatcher;
此值大于0.5时,参数需加大
select sum(wait)/sum(totalq)
"dispatcher waits" from v$queue where type='dispatcher';
select count(*) from
v$dispatcher;
select servers_highwater from v$mts;
servers_highwater接近mts_max_servers时,参数需加大
40
碎片程度
select tablespace_name,count(tablespace_name) from
dba_free_space group by tablespace_name
having count(tablespace_name)>10;
alter tablespace name coalesce;
alter table name deallocate unused;
create or replace view ts_blocks_v as select tablespace_name,block_id,bytes,blocks,'free
space' segment_name from
dba_free_space
union all select tablespace_name,block_id,bytes,blocks,segment_name
from dba_extents;
select * from ts_blocks_v;
select tablespace_name,sum(bytes),max(bytes),count(block_id) from
dba_free_space group by
tablespace_name;
查看碎片程度高的表
Select Segment_Name Table_Name, Count(*) Extents
From
Dba_Segments
Where
Owner Not In ('SYS', 'SYSTEM')
Group By
Segment_Name
Having Count(*) = (Select Max(Count(*))
From Dba_Segments
Group By
Segment_Name);
41
表、索引的存储情况检查
Select Segment_Name, Sum(Bytes), Count(*) Ext_Quan
From
Dba_Extents
Where
Tablespace_Name = '&tablespace_name'
And
Segment_Type = 'TABLE'
Group By
Tablespace_Name, Segment_Name;
Select Segment_Name, Count(*)
From
Dba_Extents
Where
Segment_Type = 'INDEX'
And
Owner = '&owner'
Group By
Segment_Name;
42
找使用CPU多的用户
session 12是cpu used by
this session
Select a.Sid,
Spid,
Status,
Substr(a.Program, 1, 40)
Prog,
a.Terminal,
Osuser,
Value / 60 / 100 Value
From
V$session a, V$process b,
V$sesstat c
Where
c.Statistic# = 12
And
c.Sid = a.Sid
And
a.Paddr = b.Addr
Order By Value Desc;
43
寻找CPU使用过量的session ,找出高CPU利用率的SQL:
SELECT /*+ ORDERED */
sql_text
FROM
v$sqltext a
WHERE (a.hash_value,
a.address) IN
(SELECT decode(sql_hash_value, 0, prev_hash_value,
sql_hash_value), decode(sql_hash_value, 0, prev_sql_addr,
sql_address)
FROM
v$session b
WHERE
b.paddr = (SELECT addr
FROM
v$process c
WHERE
c.spid = '&pid'))
ORDER BY
piece ASC;
附录5 DBA监控数据库的SHELL脚本
1.前言
这篇文章介绍了DBA每天在监控Oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作。本文首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix
Cron来定时执行DBA脚本。同时文章还介绍了8个重要的脚本来监控Oracle数据库:
检查实例的可用性
检查监听器的可用性
检查alert日志文件中的错误信息
在存放log文件的地方满以前清空旧的log文件
分析table和index以获得更好的性能
检查表空间的使用情况
找出无效的对象
监控用户和事务
2.DBA需要的Unix基本知识
基本的UNIX命令
以下是一些常用的Unix命令:
ps--显示进程
grep--搜索文件中的某种文本模式
mailx--读取或者发送mail
cat--连接文件或者显示它们
cut--选择显示的列
awk--模式匹配语言
df--显示剩余的磁盘空间
以下是DBA如何使用这些命令的一些例子:
显示服务器上的可用实例:
$ ps -ef | grep smon
oracle 21832 1 0 Feb 24 ? 19:05 ora_smon_oradb1
oracle 898 1 0 Feb 15 ? 0:00 ora_smon_oradb2
dliu 25199 19038 0 10:48:57 pts/6 0:00 grep smon
oracle 27798 1 0 05:43:54 ? 0:00 ora_smon_oradb3
oracle 28781 1 0 Mar 03 ? 0:01 ora_smon_oradb4、
显示服务器上的可用监听器:
$ ps -ef | grep listener | grep -v grep
(译者注:grep命令应该加上-i参数,即grep -i listener,该参数的作用是忽略大小写,因为有些时候listener是大写的,这时就会看不到结果)
oracle 23879 1 0 Feb 24 ? 33:36 /8.1.7/bin/tnslsnr
listener_db1 -inherit
oracle 27939 1 0 05:44:02 ? 0:00 /8.1.7/bin/tnslsnr
listener_db2 -inherit
oracle 23536 1 0 Feb 12 ? 4:19 /8.1.7/bin/tnslsnr
listener_db3 -inherit
oracle 28891 1 0 Mar 03 ? 0:01 /8.1.7/bin/tnslsnr
listener_db4 -inherit
查看Oracle存档目录的文件系统使用情况:
$ df -k | grep oraarch
/dev/vx/dsk/proddg/oraarch 71123968 4754872
65850768 7% /u09/oraarch
统计alter.log文件中的行数:
$ cat alert.log | wc -l
2984
列出alert.log文件中的全部Oracle错误信息:
$ grep ORA- alert.log
ORA-00600: internal error code, arguments:
[kcrrrfswda.1], [], [], [], [], []
ORA-00600: internal error code, arguments: [1881],
[25860496], [25857716], []
3.
CRONTAB基本
一个crontab文件中包含有六个字段:
分钟 0-59
小时 0-23
月中的第几天 1-31
月份 1 -
12
星期几 0 -
6, with 0 = Sunday
Unix命令或者Shell脚本
要编辑一个crontab文件,输入:
Crontab
-e
要查看一个crontab文件,输入:
Crontab -l
0 4 * * 5 /dba/admin/analyze_table.ksh
30 3 * * 3,6 /dba/admin/hotbackup.ksh /dev/null
2>&1
在上面的例子中,第一行显示了一个分析表的脚本在每个星期5的4:00am运行。第二行显示了一个执行热备份的脚本在每个周三和周六的3:00a.m.运行。
监控数据库的常用Shell脚本
以下提供的8个shell脚本覆盖了DBA每日监控工作的90%,你可能还需要修改UNIX的环境变量。
4.
检查Oracle实例的可用性
oratab文件中列出了服务器上的所有数据库
$ cat /var/opt/oracle/oratab
###################################################################
## /var/opt/oracle/oratab ##
###################################################################
oradb1:/u01/app/oracle/product/8.1.7:Y
oradb2:/u01/app/oracle/product/8.1.7:Y
oradb3:/u01/app/oracle/product/8.1.7:N
oradb4:/u01/app/oracle/product/8.1.7:Y
以下的脚本检查oratab文件中列出的所有数据库,并且找出该数据库的状态(启动还是关闭)
###################################################################
## ckinstance.ksh ##
###################################################################
ORATAB=/var/opt/oracle/oratab
echo "`date` "
echo "Oracle Database(s) Status `hostname`
:\n"
db=`egrep -i ":Y|:N" $ORATAB | cut
-d":" -f1 | grep -v "\#" | grep -v "\*"`
pslist="`ps -ef | grep pmon`"
for i in $db ; do
echo "$pslist" | grep
"ora_pmon_$i" > /dev/null 2>$1
if (( $? )); then
echo "Oracle Instance - $i: Down"
else
echo "Oracle Instance - $i: Up"
fi
done
使用以下的命令来确认该脚本是可以执行的:
$ chmod 744 ckinstance.ksh
$ ls -l ckinstance.ksh
-rwxr--r-- 1 oracle dba 657 Mar 5 22:59
ckinstance.ksh*
以下是实例可用性的报表:
$ ckinstance.ksh
Mon Mar 4 10:44:12 PST 2002
Oracle Database(s) Status for DBHOST server:
Oracle Instance - oradb1: Up
Oracle Instance - oradb2: Up
Oracle Instance - oradb3: Down
Oracle Instance - oradb4: Up
5.
检查Oracle监听器的可用性
以下有一个类似的脚本检查Oracle监听器。如果监听器停了,该脚本将会重新启动监听器:
#######################################################################
## cklsnr.sh ##
#######################################################################
#!/bin/ksh
DBALIST="primary.dba@company.com,another.dba@company.com";export
DBALIST
cd /var/opt/oracle
rm -f lsnr.exist
ps -ef | grep mylsnr | grep -v grep > lsnr.exist
if [ -s lsnr.exist ]
then
echo
else
echo "Alert" | mailx -s "Listener
'mylsnr' on `hostname` is down" $DBALIST
TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN
ORACLE_SID=db1; export ORACLE_SID
ORAENV_ASK=NO; export ORAENV_ASK
PATH=$PATH:/bin:/usr/local/bin; export PATH
. oraenv
LD_LIBRARY_PATH=${ORACLE_HOME}/lib;export
LD_LIBRARY_PATH
lsnrctl start mylsnr
fi
6.
检查Alert日志(ORA-XXXXX)
每个脚本所使用的一些环境变量可以放到一个profile中:
#######################################################################
## oracle.profile ##
#######################################################################
EDITOR=vi;export EDITOR
ORACLE_BASE=/u01/app/oracle; export
ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/8.1.7;
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="primary.dba@company.com,another.dba@company.com";export
DBALIST
以下的脚本首先调用oracle.profile来设置全部的环境变量。如果发现任何的Oracle错误,该脚本还会给DBA发送一个警告的email。
####################################################################
## ckalertlog.sh ##
####################################################################
#!/bin/ksh
.. /etc/oracle.profile
for SID in `cat $ORACLE_HOME/sidlist`
do
cd $ORACLE_BASE/admin/$SID/bdump
if [ -f alert_${SID}.log ]
then
mv alert_${SID}.log alert_work.log
touch alert_${SID}.log
cat alert_work.log >> alert_${SID}.hist
grep ORA- alert_work.log > alert.err
fi
if [ `cat alert.err|wc -l` -gt 0 ]
then
mailx -s "${SID} ORACLE ALERT ERRORS"
$DBALIST < alert.err
fi
rm -f alert.err
rm -f alert_work.log
done
7.
清除旧的归档文件
以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件:
$ df -k | grep arch
Filesystem kbytes used avail capacity Mounted on
/dev/vx/dsk/proddg/archive 71123968 30210248
40594232 43% /u08/archive
#######################################################################
## clean_arch.ksh ##
#######################################################################
#!/bin/ksh
df -k | grep arch > dfk.result
archive_filesystem=`awk -F" " '{ print $6
}' dfk.result`
archive_capacity=`awk -F" " '{ print $5
}' dfk.result`
if [[ $archive_capacity > 90% ]]
then
echo "Filesystem ${archive_filesystem} is
${archive_capacity} filled"
# try one of the following option depend on your
need
find $archive_filesystem -type f -mtime +2 -exec rm
-r {} \;
tar
rman
fi
8.
分析表和索引(以得到更好的性能)
以下我将展示如果传送参数到一个脚本中:
####################################################################
## 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 < oracle/$1@$2
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
!
sqlplus -s < oracle/$1@$2
@./analyze_table.sql
exit
!
以下是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;
ANALYZE TABLE JSTENZEL.HISTORY_SYSTEM_0614 ESTIMATE
STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE JSTENZEL.CALC_SUMMARY3 ESTIMATE
STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE IMON.QUEST_IM_LOCK_TREE ESTIMATE
STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE APPSSYS.HIST_USAGE_SUMMARY ESTIMATE
STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE PATROL.P$LOCKCONFLICTTX ESTIMATE
STATISTICS SAMPLE 10 PERCENT;
9.
检查表空间的使用
以下的脚本检测表空间的使用。如果表空间只剩下10%,它将会发送一个警告email。
#####################################################################
## ck_tbsp.sh ##
#####################################################################
#!/bin/ksh
sqlplus -s < oracle/$1@$2
set feed off
set linesize 100
set pagesize 200
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)) <
10;
spool off
exit
!
if [ `cat tablespace.alert|wc -l` -gt 0 ]
then
cat tablespace.alert -l tablespace.alert >
tablespace.tmp
mailx -s "TABLESPACE ALERT for ${2}"
$DBALIST < tablespace.tmp
fi
警告email输出的例子如下:
TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB)
PER_FREE
------------------- --------- -----------
------------------- ------------------
SYSTEM 2,047 203 2,250 9 %
STBS01 302 25 327 8 %
STBS02 241 11 252 4 %
STBS03 233 19 252 8 %
10.
查找出无效的数据库对象
以下查找出无效的数据库对象:
#####################################################################
## invalid_object_alert.sh ##
#####################################################################
#!/bin/ksh . /etc/oracle.profile
sqlplus -s < oracle/$1@$2
set feed off
set heading off column object_name format a30
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 ! if [ `cat invalid_object.alert|wc -l` -gt 0
] then
mailx -s "INVALID OBJECTS for ${2}"
$DBALIST < invalid_object.alert
fi$ cat invalid_object.alert
OWNER OBJECT_NAME OBJECT_TYPE STATUS
----------------------------------------------------------------------
HTOMEH DBMS_SHARED_POOL PACKAGE BODY INVALID
HTOMEH X_$KCBFWAIT VIEW INVALID
IMON IW_MON PACKAGE INVALID
IMON IW_MON PACKAGE BODY INVALID
IMON IW_ARCHIVED_LOG VIEW INVALID
IMON IW_FILESTAT VIEW INVALID
IMON IW_SQL_FULL_TEXT VIEW INVALID
IMON IW_SYSTEM_EVENT1 VIEW INVALID
IMON IW_SYSTEM_EVENT_CAT VIEW INVALIDLBAILEY
CHECK_TABLESPACE_USAGE PROCEDURE INVALID
PATROL P$AUTO_EXTEND_TBSP VIEW INVALID
SYS DBMS_CRYPTO_TOOLKIT PACKAGE INVALID
SYS DBMS_CRYPTO_TOOLKIT PACKAGE BODY INVALID
SYS UPGRADE_SYSTEM_TYPES_TO_816 PROCEDURE INVALID
SYS AQ$_DEQUEUE_HISTORY_T TYPE INVALID
SYS HS_CLASS_CAPS VIEW INVALID SYS HS_CLASS_DD VIEW
INVALID
11.
监视用户和事务(死锁等)
以下的脚本在死锁发生的时候发送一个警告e-mail:
###################################################################
## deadlock_alert.sh ##
###################################################################
#!/bin/ksh
.. /etc/oracle.profile
sqlplus -s < oracle/$1@$2
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
!
if [ `cat deadlock.alert|wc -l` -gt 0 ]
then
mailx -s "DEADLOCK ALERT for ${2}"
$DBALIST < deadlock.alert
fi
12.
结论
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
通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。