使用Procwatcher監控Oracle資料庫鎖定Contention(上)
資料庫鎖定Contention是我們在實際中經常遇到的問題。嚴重的Contention可能會引起整體資料庫效能衰減,乃至連線失敗。實際生產如果出現Contention,通常是比較緊急的情況,快速定位錯誤問題,解決問題是運維人員的挑戰。
Contention出現的原因很多,但總的來說有兩個大的型別,一個是資料庫本身後臺程式之間協調故障,另一個是應用程式或者使用者操作導致的等待鎖定。前者通常是由於Oracle Bug引起的,後者是由於不成熟的設計開發引起的。
Contention鎖定通常是程式之間的關係,所以解決問題的通法常常是利用oradebug和作業系統本身攜帶的Trace監控工具。對初學者而言,在緊急情況下使用這些工具常常是比較困難的。所以,Oracle推出了Procwatcher工具指令碼,來進行統一的鎖定分析工作。
Procwatcher可以從MOS官方網站進行下載,對應的文件ID為:459694.1。本篇主要介紹Procwatcher工具安裝和使用。
1、環境介紹
我們使用的作業系統環境是Red Hat Linux 6.5。
[root@SimpleLinux /]# uname -r
2.6.32-431.el6.i686
2、Procwatcher安裝配置
從MOS上下載的指令碼是一個zip包,筆者版本為:prw_12.1.13.11.1.zip。在Linux中,建立專門目錄進行上傳。
[root@SimpleLinux ~]# cd /
[root@SimpleLinux /]# mkdir prw
[root@SimpleLinux /]# chown oracle:oinstall prw
[root@SimpleLinux /]# ls -l | grep prw
drwxr-xr-x. 2 oracle oinstall 4096 Apr 30 09:12 prw
使用sftp客戶端上傳zip包。
[root@SimpleLinux prw]# ls -l
total 36
-rw-r--r--. 1 root root 36203 Apr 30 09:16 prw_12.1.13.11.1.zip
[root@SimpleLinux prw]# unzip prw_12.1.13.11.1.zip
Archive: prw_12.1.13.11.1.zip
inflating: prw.sh
[root@SimpleLinux prw]# ls -l
total 220
-rw-r--r--. 1 root root 36203 Apr 30 09:16 prw_12.1.13.11.1.zip
-rwxr-xr-x. 1 root root 187245 Nov 26 23:12 prw.sh
[root@SimpleLinux prw]# chown oracle:oinstall *
[root@SimpleLinux prw]# ls -l
total 220
-rw-r--r--. 1 oracle oinstall 36203 Apr 30 09:16 prw_12.1.13.11.1.zip
-rwxr-xr-x. 1 oracle oinstall 187245 Nov 26 23:12 prw.sh
prw.sh就是工具的唯一實體,可以執行指令碼來進行操作。
使用Procwatcher是需要作業系統環境檢查,首先要求執行使用者PATH中包括/usr/bin和/bin目錄。
[oracle@SimpleLinux ~]$ env | grep PATH
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin:/u01/app/oracle/bin
MODULEPATH=/usr/share/Modules/modulefiles:/etc/modulefiles
環境變數中包括標準的$ORACLE_系列。
[oracle@SimpleLinux ~]$ env | grep ORA
ORACLE_SID=ora11g
ORACLE_BASE=/u01/app
ORACLE_HOME=/u01/app/oracle
執行使用者要求是Oracle owner使用者。如果是cluster(RAC)或者多個oracle user的情況,可以使用root來執行。
作業系統中必須包括系統除錯工具。列表如下:
Linux - /usr/bin/gdb
HP-UX and HP Itanium - /opt/langtools/bin/gdb64 or /usr/ccs/bin/gdb64
Sun - /usr/bin/pstack
IBM AIX - /bin/procstack or /bin/dbx
HP Tru64 - /bin/ladebug
[oracle@SimpleLinux ~]$ rpm -qa | grep gdb
gdb-7.2-60.el6_4.1.i686
gdbm-1.8.0-36.el6.i686
eggdbus-0.6-3.el6.i686
gdbm-devel-1.8.0-36.el6.i686
執行指令碼prw.sh,可以自動的進行程式級別的資料收集。可以呼叫引數help來進行幫助資訊。
[oracle@SimpleLinux prw]$ ./prw.sh help
Usage: prw.sh
Verbs are:
start [all] - Start Procwatcher on local node, if 'all' is specified, start on all nodes
stop [all] - Stop Procwatcher on local node, if 'all' is specified, stop on all nodes
stat - Check the current status of Procwatcher
pack - Package up Procwatcher files (on all nodes) to upload to support
param - Check current Procwatcher parameters
log [number] - See the last [number] lines of the procwatcher log file
log [runtime] - See contiuous procwatcher log file info - use Cntrl-C to break
help - What you are looking at...
引數呼叫是比較簡單的,透過幫助資訊可以瞭解使用的方法。相對於oradebug和作業系統層面的呼叫,易用性要好得多。使用stat引數,可以來檢視指令碼當前執行情況。
[oracle@SimpleLinux prw]$ ./prw.sh stat
Wed Apr 30 09:25:46 CST 2014: PROCWATCHER VERSION: 12.1.13.11.1
Wed Apr 30 09:25:46 CST 2014: ### Parameters ###
Wed Apr 30 09:25:46 CST 2014: EXAMINE_CLUSTER=false
Wed Apr 30 09:25:46 CST 2014: EXAMINE_BG=true
Wed Apr 30 09:25:46 CST 2014: PRWPERM=777
Wed Apr 30 09:25:46 CST 2014: RETENTION=7
Wed Apr 30 09:25:46 CST 2014: WARNINGEMAIL=
Wed Apr 30 09:25:46 CST 2014: INTERVAL=60
Wed Apr 30 09:25:46 CST 2014: THROTTLE=5
Wed Apr 30 09:25:46 CST 2014: IDLECPU=3
Wed Apr 30 09:25:46 CST 2014: SIDLIST=
Wed Apr 30 09:25:46 CST 2014: ### Advanced Parameters (non-default) ###
Wed Apr 30 09:25:46 CST 2014: ### End Parameters ###
Wed Apr 30 09:25:46 CST 2014: Procwatcher is not running on local node SimpleLinux
Wed Apr 30 09:25:46 CST 2014: Procwatcher files are be written to: /prw
3、阻塞環境構建
我們在11gR2中,構建出一個阻塞的環境場景。從而使用Procwatcher的可用性。
SQL> select * from v$version;
BANNER
-----------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 – Production
構建實驗資料表T。
SQL> create table t as select * from dba_objects where rownum<10;
Table created
當前命令列會話編號35,刪除資料,但是不進行提交動作。
SQL> select sid from v$mystat where rownum<2;
SID
----------
35
SQL> delete t;
9 rows deleted
在另一個會話中,也刪除相同資料。在Oracle環境下,第二個會話被阻塞。
SQL> select sid from v$mystat where rownum<2;
SID
----------
42
SQL> delete t;
(等待阻塞……)
此時,後臺Server Process有三個。說明:筆者使用PL/SQL的Command Window進行測試,兩個Command視窗,後臺對應Server Process有三個。
[oracle@SimpleLinux PRW_SYS_SimpleLinux]$ ps -ef | grep LOCAL
oracle 1983 1 0 09:28 ? 00:00:00 oracleora11g (LOCAL=NO)
oracle 1988 1 0 09:29 ? 00:00:00 oracleora11g (LOCAL=NO)
oracle 2012 1 0 09:31 ? 00:00:00 oracleora11g (LOCAL=NO)
oracle 26625 1807 0 09:37 pts/0 00:00:00 grep LOCAL
下面我們實驗用Procwatcher去診斷出程式的阻塞關係。
4、執行診斷過程
執行start引數,進行診斷。
[oracle@SimpleLinux prw]$ ./prw.sh start
Wed Apr 30 09:32:21 CST 2014: Starting Procwatcher
Wed Apr 30 09:32:21 CST 2014: Thank you for using Procwatcher. :-)
Wed Apr 30 09:32:21 CST 2014: Please add a comment to Oracle Support Note 459694.1
Wed Apr 30 09:32:21 CST 2014: if you have any comments, suggestions, or issues with this tool.
Procwatcher files will be written to: /prw
Wed Apr 30 09:32:21 CST 2014: Started Procwatcher
對應目錄/prw中,就有診斷的結果顯示。
[oracle@SimpleLinux prw]$ ls -l
total 232
-rw-r--r--. 1 oracle oinstall 36203 Apr 30 09:16 prw_12.1.13.11.1.zip
drwxrwxrwx. 2 oracle oinstall 4096 Apr 30 09:32 PRW_DB_ora11g –資料庫診斷
-rwxr-xr-x. 1 oracle oinstall 187245 Nov 26 23:12 prw.sh
-rwxrwxrwx. 1 oracle oinstall 2917 Apr 30 09:32 prw_SimpleLinux.log –Procwatcher執行日誌
drwxrwxrwx. 2 oracle oinstall 4096 Apr 30 09:32 PRW_SYS_SimpleLinux –中間過程作業系統層面結果
PRW_DB_ora11g中,顯示了對ora11g的資料庫例項診斷結果。
[oracle@SimpleLinux prw]$ cd PRW_DB_ora11g/
[oracle@SimpleLinux PRW_DB_ora11g]$ ls -l
total 72
-rwxrwxrwx. 1 oracle oinstall 2095 Apr 30 09:33 prw_ora_arc0_ora11g_1626_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2095 Apr 30 09:33 prw_ora_arc1_ora11g_1629_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2095 Apr 30 09:33 prw_ora_arc2_ora11g_1631_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2095 Apr 30 09:33 prw_ora_arc3_ora11g_1633_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2050 Apr 30 09:33 prw_ora_ckpt_ora11g_1604_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2050 Apr 30 09:32 prw_ora_dbw0_ora11g_1600_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 3136 Apr 30 09:33 prw_ora_fg_ora11g_1988_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 6993 Apr 30 09:33 prw_ora_fg_ora11g_2012_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2050 Apr 30 09:32 prw_ora_lgwr_ora11g_1602_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2091 Apr 30 09:32 prw_ora_pmon_ora11g_1582_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2050 Apr 30 09:33 prw_ora_rvwr_ora11g_1623_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 2065 Apr 30 09:33 prw_ora_smon_ora11g_1606_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 158 Apr 30 09:32 pw_latchholder_ora11g_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 583 Apr 30 09:32 pw_lock_ora11g_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 587 Apr 30 09:32 pw_sessionwait_ora11g_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 667 Apr 30 09:32 pw_sqltimings_ora11g_04-30-14.out
-rwxrwxrwx. 1 oracle oinstall 1616 Apr 30 09:32 pw_waitchains_ora11g_04-30-14.out
目錄中所有的檔案都是對特定例項後臺程式的分析和dump結果。Procwather是一個綜合性程式,如果存在ASM例項,或者診斷RAC環境,對每一個例項都會有專門的資料夾。
結果程式中包括三個型別結果:首先是核心後臺程式解析,比如dbwr、pmon等關鍵進行的dump結果和跟蹤結果。第二部分是特定後臺Server Process分析。如果Procwather的確發現相互鎖定的程式,會特意將這些程式資訊匯出。最後就是分析情況,會從latch、sessionwait、lock和SQL Timing等多個角度進行分析。從快速問題分析的角度看,最後一部分是比較重要的。
目錄PRW_SYS_SIMPLELINUX中包括的就是分析過程中使用的指令碼和中間結果檔案。
[oracle@SimpleLinux prw]$ cd PRW_SYS_SimpleLinux/
[oracle@SimpleLinux PRW_SYS_SimpleLinux]$ ls -l
total 244
-rwxrwxrwx. 1 oracle oinstall 1 Apr 30 09:32 badsidlist
-rwxrwxrwx. 1 oracle oinstall 5 Apr 30 09:32 examinebg
-rwxrwxrwx. 1 oracle oinstall 3 Apr 30 09:33 idlecpu
-rwxrwxrwx. 1 oracle oinstall 6 Apr 30 09:32 israc_ora11g
-rwxrwxrwx. 1 oracle oinstall 10 Apr 30 09:33 lastvmstat
(篇幅原因,有省略……)
-rwxrwxrwx. 1 oracle oinstall 2 Apr 30 09:33 viewtype_ora11g
-rwxrwxrwx. 1 oracle oinstall 245 Apr 30 09:33 vmstat
下面我們對結果檔案進行分析和解析。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-1152611/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 監控Oracle資料庫方法Oracle資料庫
- zabbix監控oracle資料庫Oracle資料庫
- Oracle資料庫監控Index的使用情況Oracle資料庫Index
- Oracle-監控使用者鎖Oracle
- Oracle資料庫的監控內容Oracle資料庫
- Oracle 資料庫監控SQL語句Oracle資料庫SQL
- Oracle資料庫監控工具:SpotlightOracle資料庫
- 資料庫監控資料庫
- Zabbix+Python監控Oracle資料庫PythonOracle資料庫
- Nagois監控oracle資料庫注意的地方GoOracle資料庫
- nagios-新增oracle資料庫監控iOSOracle資料庫
- oracle資料庫效能監控的SQL(轉)Oracle資料庫SQL
- 使用免費的Oracle雲服務-使用並監控ATP資料庫Oracle資料庫
- 資料庫效能監控資料庫
- 監控資料庫活動資料庫
- zabbix使用percona監控mysql資料庫MySql資料庫
- MongoDB如何使用top命令監控資料庫MongoDB資料庫
- Oracle 19C+13.4EMCC資料庫監控Oracle資料庫
- 【SQL】Oracle資料庫監控sql執行情況SQLOracle資料庫
- 【SQL】Oracle資料庫SQL監控報告示例SQLOracle資料庫
- Zabbix5.0 配置 ODBC 監控 Oracle 資料庫Oracle資料庫
- oracle資料庫執行狀態監控SHELLOracle資料庫
- ORACLE資料庫管理員定期監控任務Oracle資料庫
- 監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- MySQL監控-Datadog資料庫監控調研MySql資料庫
- 資料庫繁忙程度監控資料庫
- 資料庫監控軟體資料庫
- SQL Server資料庫監控SQLServer資料庫
- 資料庫監控指令碼資料庫指令碼
- 監控資料庫指令碼資料庫指令碼
- 使用zabbix自帶模板監控MySQL資料庫MySql資料庫
- 如何監控ORACLE資料庫表的增長量Oracle資料庫
- 多臺ORACLE資料庫表空間監控方案Oracle資料庫
- Oracle資料庫記憶體監控及意義Oracle資料庫記憶體
- [轉]監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- 監控Oracle資料庫效能的指令碼段整理Oracle資料庫指令碼
- 監控Oracle資料庫的常用shell指令碼(轉)Oracle資料庫指令碼
- Nagios主動監控oracle資料庫check_oracle_healthiOSOracle資料庫