ORACLE數據庫管理員的職責


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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM