單一實例非ASM中 CSS initialization等待事件解決
環境描述:Oracle 11.2.0.4 單一實例
作業系統:Microsoft(R) Windows(R) Server 2003 Enterprise x64 Edition
以下是資料庫AWR中的TOP等待事件:
Total Wait Time (sec) |
Wait Avg(ms) |
% DB time |
Wait Class |
DB CPU |
|
1546.9 |
|
42.7 |
|
log file sync |
810,467 |
1440.1 |
2 |
39.7 |
Commit |
db file sequential read |
72,267 |
452.5 |
6 |
12.5 |
User I/O |
direct path write temp |
31,717 |
220.4 |
7 |
6.1 |
User I/O |
CSS initialization |
18 |
18 |
997 |
.5 |
Other |
Disk file operations I/O |
2,068 |
14.3 |
7 |
.4 |
User I/O |
SQL*Net message to client |
2,125,801 |
7.6 |
0 |
.2 |
Network |
direct path read |
716 |
5.9 |
8 |
.2 |
User I/O |
control file sequential read |
4,450 |
5.9 |
1 |
.2 |
System I/O |
read by other session |
236 |
5.3 |
23 |
.1 |
User I/O |
CSS initialization 代表有進程在向CSS進行註冊。但資料庫是單一實例,且資料庫也沒有使用ASM,那麼為什麼會出現CSS initialization?
再進一步觀察發現該等待事件雖然等待的次數不多,但是每次等待的事件卻很長,對系統效能肯定會有影響,所以必須進行處理。
接下來分析為什麼會出現該等待事件。首先檢查了資料庫的alert日誌,發現日誌裡面沒有出現相關的錯誤;再到資料庫裡檢查最近一段時間內出現的該等待事件:
SQL> select sql_id, count(*), sum(time_waited)
from dba_hist_active_sess_history
where sample_time>to_date('201507080000','yyyymmddhh24mi')
and sample_time<to_date('201507081420','yyyymmddhh24mi')
and event='CSS initialization'
group by sql_id;
SQL_ID COUNT(*) SUM(TIME_WAITED)
------------- ---------- ----------------
a6w8xy8jw0dpa 5 2026455
4ztfd8f5kk8jf 10 5463613
9jp5bc1p6dnfs 7 4367045
能觀察到sql_id號,這樣問題處理就容易多了,再繼續把對應的sql找到:
SQL> select * from dba_hist_sqltext
where sql_id='a6w8xy8jw0dpa';
DBID SQL_ID SQL_TEXT COMMAND_TYPE
---------- ------------- -------------------------------------------------------------------------------- ------------
901678011 a6w8xy8jw0dpa select round(sum(FREE_MB)/1024,2) as d_asm_free from v$asm_diskgroup 3
SQL> select * from dba_hist_sqltext
where sql_id='4ztfd8f5kk8jf';
DBID SQL_ID SQL_TEXT COMMAND_TYPE
---------- ------------- -------------------------------------------------------------------------------- ------------
901678011 4ztfd8f5kk8jf select round( 100-100*sum(FREE_MB)/sum(TOTAL_MB),2) as d_asm_usePer from v$asm 3
SQL> select * from dba_hist_sqltext
where sql_id='9jp5bc1p6dnfs';
DBID SQL_ID SQL_TEXT COMMAND_TYPE
---------- ------------- -------------------------------------------------------------------------------- ------------
901678011 9jp5bc1p6dnfs select round((sum(TOTAL_MB)-sum(FREE_MB))/1024,2) as d_asm_use from v$asm_disk 3
發現相關的sql都是對v$asm_diskgroup視圖進行查詢,因為查詢針對系統檢視表的,懷疑可能是系統內建的job執行的,接下來進行確認
SQL> select u.user_id,u.username
from dba_users u,
v$sql s
where s.parsing_user_id=u.user_id
and s.sql_id='a6w8xy8jw0dpa';
USER_ID USERNAME
---------- ------------------------------
90 CQITJK
0 SYS
SQL> select u.user_id,u.username
from dba_users u,
v$sql s
where s.parsing_user_id=u.user_id
and s.sql_id='4ztfd8f5kk8jf';
USER_ID USERNAME
---------- ------------------------------
90 CQITJK
SQL> select u.user_id,u.username
from dba_users u,
v$sql s
where s.parsing_user_id=u.user_id
and s.sql_id='9jp5bc1p6dnfs';
USER_ID USERNAME
---------- ------------------------------
90 CQITJK
第一條語句的執行者包含SYS,這是由於我在排查問題是使用SYS使用者執行過該語句,排除這個幹擾後發現,問題sql是應用使用者執行的。
到此,問題基本清晰,由於應用對v$asm_diskgroup進行查詢,產生了CSS initialization等待事件。資料庫為單一實例,且沒有使用ASM,所以 使用者的這個查詢是無意義的,只需要開發人員去掉這條sql即可。
再補充一點,單一實例、非ASM資料庫,應用為什麼會對v$asm_diskgroup進行查詢?其實可以猜測,這就是統一開發的系統,為保證通用性,其中涉及了對一些RAC及ASM視圖的查詢,這裡正好由於這個查詢導致了問題。所以,開發人員還是應該對資料庫的特性進行充分瞭解。
如何將ASM中的資料檔案複製到作業系統中
Oracle 11g RAC ASM磁碟全部丟失後的恢複
Oracle 11g從入門到精通 PDF+光碟片原始碼
RHEL6 ASM方式安裝Oracle 11g R2
Oracle 10g 手工建立ASM資料庫
Oracle 10g R2建立ASM執行個體Step By Step