oracle 日常巡檢
阿新 • • 發佈:2019-01-07
巡檢內容
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