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
通過以上的腳本,可大大減輕你的工作。你可以使用這些是來做更重要的工作,例如性能調整。
