1. 程式人生 > >oracle 日常巡檢

oracle 日常巡檢

巡檢內容 1. 檢查資料庫基本狀況 在本節中主要對資料庫的基本狀況進行檢查,其中包含:檢查Oracle例項狀態,檢查Oracle服 務程序,檢查Oracle監聽程序,共個部分。 1.1. 檢查Oracle例項狀態 SQL> select instance_name,host_name,startup_time,status,database_status from v$instance; INSTANCE_NAME HOST_NAME STARTUP_TIME STATUS DATABASE_STATUS ---------------- ------------------- -------------------- ---------- CKDB AS14 2009-5-7 9:3 OPEN ACTIVE 其中“STATUS”表示Oracle當前的例項狀態,必須為“OPEN”;“DATABASE_STATUS”表示Oracle 當前資料庫的狀態,必須為“ACTIVE”。 SQL> select name,log_mode,open_mode from v$database; NAME LOG_MODE OPEN_MODE --------- ------------ ----------------- CKDB ARCHIVELOG READ WRITE 其中“LOG_MODE”表示Oracle當前的歸檔方式。“ARCHIVELOG”表示資料庫執行在歸檔模式下, “NOARCHIVELOG”表示資料庫執行在非歸檔模式下。在我們的系統中資料庫必須執行在歸檔方式下。 1.2. 檢查Oracle服務程序
$ps -ef|grep ora_|grep -v grep&&ps -ef|grep ora_|grep -v grep|wc -l oracle 2960 1 0 May07 ? 00:01:02 ora_pmon_CKDB oracle 2962 1 0 May07 ? 00:00:22 ora_psp0_CKDB oracle 2964 1 0 May07 ? 00:00:00 ora_mman_CKDB oracle 2966 1 0 May07 ? 00:03:20 ora_dbw0_CKDB oracle 2968 1 0 May07 ? 00:04:29 ora_lgwr_CKDB oracle 2970 1 0 May07 ? 00:10:31 ora_ckpt_CKDB oracle 2972 1 0 May07 ? 00:03:45 ora_smon_CKDB oracle 2974 1 0 May07 ? 00:00:00 ora_reco_CKDB oracle 2976 1 0 May07 ? 00:01:24 ora_cjq0_CKDB oracle 2978 1 0 May07 ? 00:06:17 ora_mmon_CKDB oracle 2980 1 0 May07 ? 00:07:26 ora_mmnl_CKDB oracle 2982 1 0 May07 ? 00:00:00 ora_d000_CKDB oracle 2984 1 0 May07 ? 00:00:00 ora_s000_CKDB oracle 2994 1 0 May07 ? 00:00:28 ora_arc0_CKDB oracle 2996 1 0 May07 ? 00:00:29 ora_arc1_CKDB oracle 3000 1 0 May07 ? 00:00:00 ora_qmnc_CKDB oracle 3625 1 0 May07 ? 00:01:40 ora_q000_CKDB oracle 31594 1 0 Jul20 ? 00:00:00 ora_q003_CKDB oracle 23802 1 0 05:09 ? 00:00:33 ora_j000_CKDB 19 在檢查Oracle的程序命令輸出後,輸出顯示至少應包括以下一些程序: . Oracle寫資料檔案的程序,輸出顯示為:“ora_dbw0_CKDB” . Oracle寫日誌檔案的程序,輸出顯示為:“ora_lgwr_ CKDB” . Oracle監聽例項狀態的程序,輸出顯示為:“ora_smon_ CKDB” . Oracle監聽客戶端連線程序狀態的程序,輸出顯示為:“ora_pmon_ CKDB” . Oracle進行歸檔的程序,輸出顯示為:“ora_arc0_ CKDB” . Oracle進行檢查點的程序,輸出顯示為:“ora_ckpt_ CKDB” . Oracle進行恢復的程序,輸出顯示為:“ora_reco_ CKDB” 1.3. 檢查Oracle監聽狀態
/home/oracle>lsnrctl status LSNRCTL for Linux: Version 10.2.0.2.0 - Production on 23-JUL-2009 14:11:53 Copyright (c) 1991, 2005, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 10.2.0.2.0 - Production Start Date 07-MAY-2009 09:35:52 Uptime 77 days 4 hr. 36 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /data/oracle/product/10.2.0/network/admin/listener.ora Listener Log File /data/oracle/product/10.2.0/network/log/listener.log Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=AS14)(PORT=1521))) Services Summary... Service "CKDB" has 1 instance(s). Instance "CKDB", status READY, has 1 handler(s) for this service... Service "CKDBXDB" has 1 instance(s). Instance "CKDB", status READY, has 1 handler(s) for this service... Service "CKDB_XPT" has 1 instance(s). Instance "CKDB", status READY, has 1 handler(s) for this service... The command completed successfully “Services Summary”項表示Oracle的監聽程序正在監聽哪些資料庫例項,輸出顯示中至少應該 “CKDB”這一項。 檢查監聽程序是否存在: [
[email protected]
~]$ ps -ef|grep lsn|grep -v grep oracle 2954 1 0 May07 ? 00:01:17 /data/oracle/product/10.2.0/bin/tnslsnr LISTENER -inherit 2. 檢查系統和oracle日誌檔案 在本節主要檢查相關的日誌檔案,包含:檢查作業系統的日誌檔案,檢查Oracle日誌檔案,檢 查Oracle核心轉儲目錄,檢查Root使用者和Oracle使用者的email,總共四個部分。 2.1. 檢查作業系統日誌檔案 # cat /var/log/messages |grep failed 檢視是否與Oracle使用者相關的出錯資訊。 2.2. 檢查oracle日誌檔案 [[email protected] ~]$ cat /data/oracle/admin/CKDB/bdump/alert_CKDB.log |grep ora- [[email protected] ~]$ cat /data/oracle/admin/CKDB/bdump/alert_CKDB.log |grep err [[email protected] ~]$ cat /data/oracle/admin/CKDB/bdump/alert_CKDB.log |grep fail Oracle在執行過程中,會在警告日誌檔案(alert_SID.log)中記錄資料庫的一些執行情況:資料庫的 啟動、關閉,啟動時的非預設引數;資料庫的重做日誌切換情況,記錄每次切換的時間,及如果因 為檢查點(checkpoint)操作沒執行完成造成不能切換,會記錄不能切換的原因;對資料庫進行的某 些操作,如建立或刪除表空間、增加資料檔案;資料庫發生的錯誤,如表空間不夠、出現壞塊、數 據庫內部錯誤(ORA-600)等。定期檢查日誌檔案,根據日誌中發現的問題及時進行處理: 問題 處理 啟動引數不對 檢查初始化引數檔案 因為檢查點操作或歸檔操作沒完成造成重做 日誌不能切換 如果經常發生這樣的情況,可以考慮增加重做日誌檔案 組;想辦法提高檢查點或歸檔操作的效率; 人未經授權刪除了表空間 檢查資料庫的安全問題,是否密碼太簡單;如必要,撤 消某些使用者的系統許可權 出現壞塊 檢查是否是硬體問題(如磁碟本生壞塊),如果不是,檢 查是那個資料庫物件出現了壞塊,對這個物件進行重建 表空間不夠 增加資料檔案到相應的表空間 出現ORA-600 根據日誌檔案的內容檢視相應的TRC檔案,如果是 Oracle的bug,要及時打上相應的補丁 Listener日誌:$ORACLE_HOME/network/log 2.3. 檢查Oracle核心轉儲目錄 $ls $ORACLE_BASE/admin/CKDB/cdump/*.trc|wc -l $ls $ORACLE_BASE/admin/CKDB/udump/*.trc|wc -l 如果上面命令的結果每天都在增長,則說明Oracle程序經常發生核心轉儲。這說明某些使用者程序或 者資料庫後臺程序由於無法處理的原因而異常退出。頻繁的核心轉儲特別是資料庫後臺程序的核心 轉儲會導致資料庫異常終止。 2.4. 檢查Root使用者和Oracle使用者的email #tail -n 200 /var/mail/root #tail -n 200 /var/mail/oracle 檢視無與Oracle使用者相關的出錯資訊。 ORACLE OCM 大師 QQ 群:2878026 190467784 歡迎資深 DBA 人脈合作 3. 檢查Oracle物件狀態 在本節主要檢查相關Oracle物件的狀態,包含:檢查Oracle控制檔案狀態,檢查Oracle線上日 志狀態,檢查Oracle表空間的狀態,檢查Oracle所資料檔案狀態,檢查Oracle所表、索引、儲存過 程、觸發器、包等物件的狀態,檢查Oracle所回滾段的狀態,總共六個部分。 3.1. 檢查Oracle控制檔案狀態 SQL> select status,name from v$controlfile; STATUS NAME ------- -------------------------------------------------------------------------------- /data/oradata/CKDB/control01.ctl /data/oradata/CKDB/control02.ctl /data/oradata/CKDB/control03.ctl 輸出結果應該3條以上(包含3條的記錄,“STATUS”應該為空。狀態為空表示控制檔案狀態正常。 3.2. 檢查Oracle線上日誌狀態 SQL> select group#,status,type,member from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- ------- ----------- 3 ONLINE /data/oradata/CKDB/redo03.log 2 ONLINE /data/oradata/CKDB/redo02.log 1 ONLINE /data/oradata/CKDB/redo01.log 4 ONLINE /data/oradata/CKDB/redo04.log 5 ONLINE /data/oradata/CKDB/redo05.log 6 ONLINE /data/oradata/CKDB/redo06.log 6 rows selected 輸出結果應該3條以上(包含3條記錄,“STATUS”應該為非“INVALID”,非“DELETED”。 注:“STATUS” 顯示為空表示正常。 3.3. 檢查Oracle表空間的狀態 SQL> select tablespace_name,status from dba_tablespaces; TABLESPACE_NAME STATUS ------------------------------ --------- SYSTEM ONLINE UNDOTBS1 ONLINE SYSAUX ONLINE TEMP ONLINE USERS ONLINE SJ1 ONLINE ADM_INDEX ONLINE HOME_DATA ONLINE HOME_INDEX ONLINE PHOTO_DATA ONLINE PHOTO_INDEX ONLINE 。。。。。。。 輸出結果中STATUS應該都為ONLINE。 3.4. 檢查Oracle所資料檔案狀態 SQL> select name,status from v$datafile; NAME STATUS -------------------------------------------------- ------- /data/oradata/CKDB/system01.dbf SYSTEM /data/oradata/CKDB/undotbs01.dbf ONLINE /data/oradata/CKDB/sysaux01.dbf ONLINE /data/oradata/CKDB/users01.dbf ONLINE /data/oradata/CKDB/sj.dbf ONLINE /data/oradata/CKDB/HOME_DATA1.dbf ONLINE /data/oradata/CKDB/HOME_INDEX1.dbf ONLINE /data/oradata/CKDB/PHOTO_DATA1.dbf ONLINE /data/oradata/CKDB/PHOTO_INDEX1.dbf ONLINE /data/oradata/CKDB/BLOG_DATA1.dbf ONLINE /data/oradata/CKDB/BLOG_INDEX1.dbf ONLINE /data/oradata/CKDB/AUDIO_DATA1.dbf ONLINE /data/oradata/CKDB/AUDIO_INDEX1.dbf ONLINE /data/oradata/CKDB/VIDEO_DATA1.dbf ONLINE /data/oradata/CKDB/VIDEO_INDEX1.dbf ONLINE /data/oradata/CKDB/SYS_DATA1.dbf ONLINE /data/oradata/CKDB/SYS_INDEX1.dbf ONLINE /data/oradata/CKDB/ADM_DATA1.dbf ONLINE /data/oradata/CKDB/ADM_INDEX1.dbf ONLINE /data/oradata/CKDB/perfstat.dbf ONLINE 輸出結果中“STATUS”應該都為“ONLINE”。或者: SQL> select file_name,status from dba_data_files; FILE_NAME STATUS --------------------------------------------- --------- /data/oradata/CKDB/users01.dbf AVAILABLE ORACLE OCM 大師 QQ 群:2878026 190467784 歡迎資深 DBA 人脈合作 /data/oradata/CKDB/sysaux01.dbf AVAILABLE /data/oradata/CKDB/undotbs01.dbf AVAILABLE /data/oradata/CKDB/system01.dbf AVAILABLE /data/oradata/CKDB/sj.dbf AVAILABLE /data/oradata/CKDB/perfstat.dbf AVAILABLE /data/oradata/CKDB/HOME_DATA1.dbf AVAILABLE /data/oradata/CKDB/HOME_INDEX1.dbf AVAILABLE /data/oradata/CKDB/PHOTO_DATA1.dbf AVAILABLE 輸出結果中“STATUS”應該都為“AVAILABLE”。 3.5. 檢查無效物件 sql>select owner,object_name,object_type from dba_objects where status!='VALID' and owner!='SYS' and owner!='SYSTEM'; no rows selected 如果記錄返回,則說明存在無效物件。若這些物件與應用相關,那麼需要重新編譯生成這個物件, 或者: SELECT owner, object_name, object_type FROM dba_objects WHERE status= 'INVALID'; 3.6. 檢查所回滾段狀態 SQL> select segment_name,status from dba_rollback_segs; SEGMENT_NAME STATUS ------------------------------ ---------------- SYSTEM ONLINE _SYSSMU1$ ONLINE _SYSSMU2$ ONLINE _SYSSMU3$ ONLINE _SYSSMU4$ ONLINE _SYSSMU5$ ONLINE _SYSSMU6$ ONLINE _SYSSMU7$ ONLINE _SYSSMU8$ ONLINE _SYSSMU9$ ONLINE _SYSSMU10$ ONLINE 11 rows selected 輸出結果中所回滾段的“STATUS”應該為“ONLINE”。 4. 檢查Oracle相關資源的使用情況 在本節主要檢查Oracle相關資源的使用情況,包含:檢查Oracle初始化檔案中相關的引數值, 檢查資料庫連線情況,檢查系統磁碟空間,檢查Oracle各個表空間使用情況,檢查一些擴充套件異常的 物件,檢查system表空間內的內容,檢查物件的下一擴充套件與表空間的最大擴充套件值,總共七個部分。 4.1. 檢查Oracle初始化檔案中相關引數值 SQL> select resource_name,max_utilization,initial_allocation, limit_value from v$resource_limit; RESOURCE_NAME MAX_UTILIZATION INITIAL_ALLOCAT LIMIT_VALUE -------------------- --------------- --------------- --------------- processes 162 500 500 sessions 168 555 555 enqueue_locks 136 6930 6930 enqueue_resources 111 2660 UNLIMITED ges_procs 0 0 0 ges_ress 0 0 UNLIMITED ges_locks 0 0 UNLIMITED ges_cache_ress 0 0 UNLIMITED ges_reg_msgs 0 0 UNLIMITED ges_big_msgs 0 0 UNLIMITED ges_rsv_msgs 0 0 0 gcs_resources 0 0 0 gcs_shadows 0 0 0 dml_locks 76 2440 UNLIMITED temporary_table_locks 26 UNLIMITED UNLIMITED transactions 13 610 UNLIMITED branches 0 610 UNLIMITED cmtcallbk 3 610 UNLIMITED sort_segment_locks 5 UNLIMITED UNLIMITED max_rollback_segments 11 610 65535 RESOURCE_NAME MAX_UTILIZATION INITIAL_ALLOCAT LIMIT_VALUE -------------------- --------------- --------------- --------------- max_shared_servers 1 UNLIMITED UNLIMITED parallel_max_servers 16 80 3600 22 rows selected 若LIMIT_VALU-MAX_UTILIZATION<=5,則表明與RESOURCE_NAME相關的Oracle初始化引數需要調整。 可以通過修改Oracle初始化引數檔案$ORACLE_BASE/admin/CKDB/pfile/initORCL.ora來修改。 4.2. 檢查資料庫連線情況 檢視當前會話連線數,是否屬於正常範圍。 SQL> select count(*) from v$session; COUNT(*) ---------- 29 select sid,serial#,username,program,machine,status from v$session; SID SERIAL# USERNAME PROGRAM MACHINE STATUS ---- ---------- ------------ ---------------------------- ------------ -------- 1 3 [email protected] (PMON) xz15saledb ACTIVE 2 3 [email protected] (DBW0) xz15saledb ACTIVE 3 3 [email protected] (DBW1) xz15saledb ACTIVE 4 3 [email protected] (LGWR) xz15saledb ACTIVE 5 3 [email protected] (CKPT) xz15saledb ACTIVE 6 3 [email protected] (SMON) xz15saledb ACTIVE 7 3 [email protected] (RECO) xz15saledb ACTIVE 8 1 [email protected] (CJQ0) xz15saledb ACTIVE 9 3 [email protected] (ARC0) xz15saledb ACTIVE 10 3 [email protected] (ARC1) xz15saledb ACTIVE 11 11319 ZK [email protected] (TNS V1-V3) xz15tuxedo2 INACTIVE 13 48876 ZG [email protected] (TNS V1-V3) xz15saleap INACTIVE 17 20405 ZK [email protected] (TNS V1-V3) xz15tuxedo1 INACTIVE 20 12895 ZK [email protected] (TNS V1-V3) xz15billdb INACTIVE 其中:SID 會話(session)的ID號; SERIAL# 會話的序列號,和SID一起用來唯一標識一個會話; USERNAME 建立該會話的使用者名稱; PROGRAM 這個會話是用什麼工具連線到資料庫的; STATUS 當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒執行 任何操作; 如果建立了過多的連線,會消耗資料庫的資源,同時,對一些“掛死”的連線可能需要手工進行清 理。如果DBA要手工斷開某個會話,則執行:(一般不建議使用這種方式去殺掉資料庫的連線,這樣 有時候session不會斷開。容易引起死連線。建議通過sid查到作業系統的spid,使用ps -ef|grep spidno的方式確認spid不是ORACLE的後臺程序。使用作業系統的kill -9命令殺掉連線 alter system kill session 'SID,SERIAL#'; 注意:上例中SID為1到10(USERNAME列為空)的會話,是Oracle的後臺程序,不要對這些會話進行任 何操作。 4.3. 檢查系統磁碟空間 如果檔案系統的剩餘空間過小或增長較快,需對其進行確認並刪除不用的檔案以釋放空間。 [[email protected] ~]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda5 9.7G 3.9G 5.4G 42% / /dev/sda1 479M 16M 438M 4% /boot /dev/sda2 49G 19G 28G 41% /data none 1014M 0 1014M 0% /dev/shm 4.4. 檢查表空間使用情況 SQL> select f.tablespace_name,a.total,f.free,round((f.free/a.total)*100) "% Free" from (select tablespace_name, sum(bytes/(1024*1024)) total from dba_data_files group by tablespace_name) a, (select tablespace_name, round(sum(bytes/(1024*1024))) free from dba_free_space group by tablespace_name) f WHERE a.tablespace_name = f.tablespace_name(+) order by "% Free"; TABLESPACE_NAME TOTAL FREE % Free ------------------------------ ---------- ---------- ---------- OPERATION_DATA 1800 547 30 WAPWEB_DATA 100 36 36 OPERATION_INDEX 500 186 37 SYSTEM 1024 515 50 SYSAUX 1024 534 52 SALE8_TEMP 100 62 62 SJ1 500 348 70 PERFSTAT 500 356 71 ………. HOME_DATA 100 77 77 SYS_INDEX 100 100 100 VIDEO_INDEX 100 100 100 VIDEO_DATA 100 100 100 BLOG_DATA 100 100 100 39 rows selected 如果空閒率%Free小於10%以上(包含10%,則注意要增加資料檔案來擴充套件表空間而不要是用資料檔案 的自動擴充套件功能。請不要對錶空間增加過多的資料檔案,增加資料檔案的原則是每個資料檔案大小 為2G或者4G,自動擴充套件的最大限制在8G。 4.5. 檢查一些擴充套件異常的物件 sql>select Segment_Name, Segment_Type, TableSpace_Name, (Extents/Max_extents)*100 Percent From sys.DBA_Segments Where Max_Extents != 0 and (Extents/Max_extents)*100>=95 order By Percent; ORACLE OCM 大師 QQ 群:2878026 190467784 歡迎資深 DBA 人脈合作 no rows selected 如果記錄返回,則這些物件的擴充套件已經快達到它定義時的最大擴充套件值。對於這些物件要修改它的存 儲結構引數。 4.6. 檢查system表空間內的內容 select distinct(owner) from dba_tables where tablespace_name='SYSTEM' and owner!='SYS' and owner!='SYSTEM' union select distinct(owner) from dba_indexes where tablespace_name='SYSTEM' and owner!='SYS' and owner!='SYSTEM'; no rows selected 如果記錄返回,則表明system表空間記憶體在一些非system和sys使用者的物件。應該進一步檢查這些對 象是否與我們應用相關。如果相關請把這些物件移到非System表空間,同時應該檢查這些物件屬主 的預設表空間值。 4.7. 檢查物件的下一擴充套件與表空間的最大擴充套件值 sql>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 union select a.index_name, a.next_extent, a.tablespace_name from all_indexes 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; no rows selected 如果記錄返回,則表明這些物件的下一個擴充套件大於該物件所屬表空間的最大擴充套件值,需調整相應表 空間的儲存引數。 ORACLE OCM 大師 QQ 群:2878026 190467784 歡迎資深 DBA 人脈合作 5. 檢查Oracle資料庫備份結果 在本節主要檢查Oracle資料庫備份結果,包含:檢查資料庫備份日誌資訊,檢查backup卷中文 件產生的時間,檢查oracle使用者的email,總共個部分。 5.1. 檢查資料庫備份日誌資訊 假設:備份的臨時目錄為/backup/hotbakup,我們需要檢查2009年7月22日的備份結果,則用下面的 命令來檢查: #cat /backup/hotbackup/hotbackup-09-7-22.log|grep -i error 備份指令碼的日誌檔案為hotbackup-月份-日期-年份.log,在備份的臨時目錄下面。如果檔案中存在 “ERROR:”,則表明備份沒成功,存在問題需要檢查。 5.2. 檢查backup卷中檔案產生的時間 #ls -lt /backup/hotbackup backup卷是備份的臨時目錄,檢視輸出結果中檔案的日期,都應當是在當天凌晨由熱備份指令碼產生 的。如果時間不對則表明熱備份指令碼沒執行成功。 5.3. 檢查oracle使用者的email #tail -n 300 /var/mail/oracle 熱備份指令碼是通過Oracle使用者的cron去執行的。cron執行完後作業系統就會發一條Email通知Oracle 使用者任務已經完成。檢視Oracle email中今天凌晨部分無ORA-,Error,Failed等出錯資訊,如果則 表明備份不正常。 6. 檢查Oracle資料庫效能 在本節主要檢查Oracle資料庫效能情況,包含:檢查資料庫的等待事件,檢查死鎖及處理,檢 查cpu、I/O、記憶體效能,檢視是否僵死程序,檢查行連結/遷移,定期做統計分析,檢查緩衝區命中 率,檢查共享池命中率,檢查排序區,檢查日誌緩衝區,總共十個部分。 6.1. 檢查資料庫的等待事件 set pages 80 set lines 120 col event for a40 ORACLE OCM 大師 QQ 群:2878026 190467784 歡迎資深 DBA 人脈合作 select sid,event,p1,p2,p3,WAIT_TIME,SECONDS_IN_WAIT from v$session_wait where event not like 'SQL%' and event not like 'rdbms%'; 如果資料庫長時間持續出現大量像latch free,enqueue,buffer busy waits,db file sequential read,db file scattered read等等待事件時,需要對其進行分析,可能存在問題的語句。 6.2. Disk Read最高的SQL語句的獲取 SQL>SELECT SQL_TEXT FROM (SELECT * FROM V$SQLAREA ORDER BY DISK_READS) WHERE ROWNUM<=5 desc; 6.3. 查詢前十條效能差的sql SELECT * FROM (SELECT PARSING_USER_ID EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS, SQL_TEXT FROM V$SQLAREA ORDER BY DISK_READS DESC) WHERE ROWNUM<10 ; 6.4. 等待時間最多的5個系統等待事件的獲取 SELECT * FROM (SELECT * FROM V$SYSTEM_EVENT WHERE EVENT NOT LIKE 'SQL%' ORDER BY TOTAL_WAITS DESC) WHERE ROWNUM<=5; 6.5. 檢查執行很久的SQL COLUMN USERNAME FORMAT A12 COLUMN OPNAME FORMAT A16 COLUMN PROGRESS FORMAT A8 SELECT USERNAME,SID,OPNAME,ROUND(SOFAR*100 / TOTALWORK,0) || '%' AS PROGRESS,TIME_REMAINING,SQL_TEXT FROM V$SESSION_LONGOPS , V$SQL WHERE TIME_REMAINING <> 0 AND SQL_ADDRESS=ADDRESS AND SQL_HASH_VALUE = HASH_VALUE; 6.6. 檢查消耗CPU最高的程序 SET LINE 240 SET VERIFY OFF COLUMN SID FORMAT 999 COLUMN PID FORMAT 999 COLUMN S_# FORMAT 999 COLUMN USERNAME FORMAT A9 HEADING "ORA USER" COLUMN PROGRAM FORMAT A29 COLUMN SQL FORMAT A60 COLUMN OSNAME FORMAT A9 HEADING "OS USER" SELECT P.PID PID,S.SID SID,P.SPID SPID,S.USERNAME USERNAME,S.OSUSER OSNAME,P.SERIAL# S_#,P.TERMINAL,P.PROGRAM PROGRAM,P.BACKGROUND,S.STATUS,RTRIM(SUBSTR(A.SQL_TEXT, 1, 80)) SQLFROM V$PROCESS P, V$SESSION S,V$SQLAREA A WHERE P.ADDR = S.PADDR AND S.SQL_ADDRESS = A.ADDRESS (+) AND P.SPID LIKE '%&1%'; 6.7. 檢查碎片程度高的表 SQL> 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); 6.8. 檢查表空間的 I/O 比例 SQL>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; 6.9. 檢查檔案系統的 I/O 比例 SQL>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#; 6.10. 檢查死鎖及處理 查詢目前鎖物件資訊: col sid for 999999 col username for a10 col schemaname for a10 col osuser for a16 col machine for a16 col terminal for a20 col owner for a10 col object_name for a30 col object_type for a10 select sid,serial#,username,SCHEMANAME,osuser,MACHINE, terminal,PROGRAM,owner,object_name,object_type,o.object_id from dba_objects o,v$locked_object l,v$session s where o.object_id=l.object_id and s.sid=l.sess