參考至http://www.smartmarmot.com/wiki/index.php?title=Orabbix#Requirements
產品說明
Orabbix是一個插件,它是與Zabbix 配合,對Oracle數據庫提供多層監視、性能和可用性報告和度量,以及服務器性能指標。它提供了從大量Oracle實例獲取數據的有效機制,并向Zabbix服務器提供監視和性能指標的信息。然后,您可以利用Zabbix的報告功能來收集所有數據,并為涉眾提供圖表和服務級別協議度量等分析。當前的發行版包含一組預定義的模板,這些模板結合了初始部署的警報和繪圖功能。當然,你也可以根據自身需求和數據/監視需求來設計自己的監控。
它可以監控什么?
下面是一些orabbix監控的例子:
數據庫的版本;
歸檔日志的趨勢數據;
處于等待狀態的事務(i.e ?Files I/O, single block read, multi-block read, direct path read, SQLNet Messages, Control file I/O, Log Write);
命中率((i.e ?Hit Ratio on Triggers, Tables/Procedures, SQL Area, Body);
邏輯I/O(Server performance on Logical I/O of: Current Read, Consistent Read, Block Change);
物理I/O(Redo Writes, Datafile Writes, Datafile Reads);
PGA;
SGA(In particular; Fixed Buffer, Java Pool, Large Pool, Log Buffer, Shared Poolm Buffer Cache);
共享池(Active Sessions, Inactive Sessions, System Sessions);
數據庫大小/數據庫文件大小(DBSize size of database really used space and of Filesize);
安裝要求
zabbix server版本1.8以上;
Java Runtime Environment 6;
目前已知的成功測試了Oracle主機平臺
RHEL5.X (CentOS 5.4 & 5.5)
Windows 2003 (with Java SE 1.6)
HP-UX 11.31
AIX 5.3
目前已知的測試Oracle版本
10g
10.2
注意:不需要為orabbix安裝任何類型的客戶端
假設
安裝說明是基于對大多數 unix 部署(即RHEL / CentOS)的指令而創建的,如果你的環境比較特殊,需要做一些修改。
這個說明是基于倆臺主機來的,一臺zabbix服務器端,一臺Oracle數據庫。如果你打算監控zabbix服務器上的Oracle時,步驟是一樣的,只需要對一些較小的連接信息進行修改。
這些步驟也包括你需要配置orabbix來監控一個新安裝的或者安裝配置好的Oracle數據庫。安裝步驟將為Zabbix用戶提供所有表的訪問權限,這將包括在執行時出現的任何用戶表。如果你不希望Zabbix訪問數據庫中的特定表或資源,則需要根據要求設置拒絕Zabbix用戶訪問權限。詳細信息請咨詢您的DBA,因為這超出了這些說明的范圍。
安裝步驟(orabbix是安裝在服務器端的)
在zabbix server 下載orabbix,地址:https://sourceforge.net/projects/orabbix/files/orabbix-1.2.3.zip/download? ? 需要翻墻
解壓到/opt/orabbix文件夾下; ? ? ?PS:可以是別的路徑
復制/opt/orabbix/init.d/orabbix 到/etc/init.d/orabbix?
給orabbix這個文件可執行權限;
/etc/init.d/orabbix
/opt/orabbix/run.sh
創建Oracle用戶
為orabbix訪問Oracle數據庫創建一個用戶(ZABBIX),可以使用一下命令:
CREATE USER ZABBIX
IDENTIFIED BY? <REPLACE WITH PASSWORD>
DEFAULT TABLESPACE SYSTEM
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
– 2 Roles for ZABBIX
GRANT CONNECT TO ZABBIX;
GRANT RESOURCE TO ZABBIX;
ALTER USER ZABBIX DEFAULT ROLE ALL;
– 5 System Privileges for ZABBIX
GRANT SELECT ANY TABLE TO ZABBIX;
GRANT CREATE SESSION TO ZABBIX;
GRANT SELECT ANY DICTIONARY TO ZABBIX;
GRANT UNLIMITED TABLESPACE TO ZABBIX;
GRANT SELECT ANY DICTIONARY TO ZABBIX;
注意:
如果你想創建的這個用戶權限最小,可以參看以下方案:
CREATE USER ZABBIX
IDENTIFIED BY
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
GRANT ALTER SESSION TO ZABBIX;
GRANT CREATE SESSION TO ZABBIX;
GRANT CONNECT TO ZABBIX;
ALTER USER ZABBIX DEFAULT ROLE ALL;
GRANT SELECT ON V_$INSTANCE TO ZABBIX;
GRANT SELECT ON DBA_USERS TO ZABBIX;
GRANT SELECT ON V_$LOG_HISTORY TO ZABBIX;
GRANT SELECT ON V_$PARAMETER TO ZABBIX;
GRANT SELECT ON SYS.DBA_AUDIT_SESSION TO ZABBIX;
GRANT SELECT ON V_$LOCK TO ZABBIX;
GRANT SELECT ON DBA_REGISTRY TO ZABBIX;
GRANT SELECT ON V_$LIBRARYCACHE TO ZABBIX;
GRANT SELECT ON V_$SYSSTAT TO ZABBIX;
GRANT SELECT ON V_$PARAMETER TO ZABBIX;
GRANT SELECT ON V_$LATCH TO ZABBIX;
GRANT SELECT ON V_$PGASTAT TO ZABBIX;
GRANT SELECT ON V_$SGASTAT TO ZABBIX;
GRANT SELECT ON V_$LIBRARYCACHE TO ZABBIX;
GRANT SELECT ON V_$PROCESS TO ZABBIX;
GRANT SELECT ON DBA_DATA_FILES TO ZABBIX;
GRANT SELECT ON DBA_TEMP_FILES TO ZABBIX;
GRANT SELECT ON DBA_FREE_SPACE TO ZABBIX;
GRANT SELECT ON V_$SYSTEM_EVENT TO ZABBIX;
注意:
如果你使用的是Oracle 11g,你需要做以下操作放開ACL訪問控制,否則在監控過程中有部分內容無法顯示:
exec dbms_network_acl_admin.create_acl(acl => 'resolve.xml',description => 'resolve acl', principal =>'ZABBIX', is_grant => true, privilege => 'resolve');
exec dbms_network_acl_admin.assign_acl(acl => 'resolve.xml', host =>'*');
commit;
你可以運行以下命令來驗證正確性:
select utl_inaddr.get_host_name('127.0.0.1') from dual;
(Redhat)將orabbix設置為開機自啟動:
chkconfig --add orabbix
chkconfig --list ? ? ? ? ? ? ? ? ? ?#檢查
在Zabbix中為您計劃監視的DB實例創建一個主機條目,并導入在:/ opt/orabbix/ template中發現的模板
這一步可以參考zabbix官網:http://www.zabbix.com/documentation.php
orabbix配置文件
在/opt/orabbix/conf/ 目錄下有個叫config.props.sample的文件,將這個文件復制并改名為config.props
]# mv config.props.sample config.props
配置文件如下:
#comma separed list of Zabbix servers
ZabbixServerList=ZabbixServer1,ZabbixServer2 ? ?#zabbixserver1、zabbixserver2定義zabbix服務器的名字,與下面的zabbixserver1和2對應
ZabbixServer1.Address=192.168.10.11 ? ? ? ? ?#上面定義的zabbixserver1的IP地址
ZabbixServer1.Port=10051 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#zabbixserver1的端口
# ZabbixServer2.Address=IP_ADDRESS_OF_ZABBIX_SERVER ? ?#zabbixserver2默認是注銷的,如果你有多個zabbixserver,選填這個
# ZabbixServer2.Port=PORT_OF_ZABBIX_SERVER
#pidFile
OrabbixDaemon.PidFile=./logs/orabbix.pid ? ? ? ? ? ?#Pid文件的位置
#frequency of item's refresh
OrabbixDaemon.Sleep=300 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 監控項的刷新間隔(不需修改)
#MaxThreadNumber should be >= than the number of your databases
OrabbixDaemon.MaxThreadNumber=100 ? ? ? ? ?#orabbix守護進程的最大線程數
#put here your databases in a comma separated list
DatabaseList=DB1,DB2,DB3 ? ? ? ? ? ? ? ? ? ? ? ? ?# ?數據庫列表(zabbix中的主機名必須用這個兒定義的名字)
#Configuration of Connection pool
#if not specified Orabbis is going to use default values (hardcoded)
#Maximum number of active connection inside pool
DatabaseList.MaxActive=10 ? ? ? ? ? ? ? ? ?# 連接池最大活動連接數(無需修改)
#The maximum number of milliseconds that the pool will wait?
#(when there are no available connections) for a connection to be returned?
#before throwing an exception, or <= 0 to wait indefinitely.?
DatabaseList.MaxWait=100 ? ? ? ? ? ? ? ? #返回連接異常的等待時間,毫秒。可以定義為一個負值以表示不做限制
DatabaseList.MaxIdle=1 ? ? ? ? ? ? ? ? ? ? ?#最大空閑連接數,可以定義為一個負值以表示不做限制
#define here your connection string for each database
DB1.Url=jdbc:oracle:thin:@server.domain.example.com:<LISTENER_PORT>:DB1 ??
DB1.User=zabbix
DB1.Password=9133
DB1是DatabaseList=DB1,DB2,DB3 上面這一項列出的名字
server.domain.example.com是你Oracle服務器的主機名或者IP地址(建議為IP地址)
<LISTENER_PORT>是你數據庫的端口
DB1:是Oracle數據庫的SID
下面的你在Oracle里創建的允許orabbix采集數據的賬號和密碼,DB1與上面保持一致
#Those values are optionals if not specified Orabbix is going to use the general values
DB1.MaxActive=10 ? ? ? ? ? ?#針對單獨的數據庫設置參數,上面的全局的,這個是單獨的
DB1.MaxWait=100
DB1.MaxIdle=1
DB1.QueryListFile=./conf/query.props
DB2.Url=jdbc:oracle:thin:@server2.domain.example.com::DB2
DB2.User=zabbix
DB2.Password=zabbix_password
DB2.QueryListFile=./conf/query.props
DB3.Url=jdbc:oracle:thin:@server3.domain.example.com::DB3
DB3.User=zabbix
DB3.Password=zabbix_password
DB3.QueryListFile=./conf/query.props
配置文件補充
QueryListFile=/opt/orabbix/conf/query.props ? ? ?#查詢文件的位置
<DBNAME>.QueryListFile=./confQueryTest.props ? ? ? #定義單個數據庫的查詢文件位置,可以使用相對路徑
對于不同的數據庫使用不同的查詢文件,或者每個數據庫都有一個查詢文件池,這在不同的Oracle版本(如果有不同版本)或生產環境、測試環境、開發環境等不同環境下使用時有奇效。
<DB_NAME>.ExtraQueryListFile ==./confQueryTest_2.props ? ??
#官網是這樣定義的:adds another custom query to the default query file.If there are duplicates the ExtraQueryListFile will override them
query.props查詢文件
可以在這個文件中設置自定義查詢項。比如你要監控公司一些業務邏輯之類的定制監控項
創建的每個查詢必須有一個item名,必須是獨一無二的。zabbix server會識別這個item,就像其他item一樣,不能沖突。
QueryList=queryName1,queryName2,queryName3 ? ? ? #定義item名,以逗號分隔
customQueryItemName.Query=yourQueryHere ? ? ? ? #自定義查詢語句結尾不要加封號
customQueryItemName.NoDataFound=none ? ? ? ? ? ? #定義無查詢結果時的返回值(默認是none)
customQueryItemName.Period=<Express a period in minute> ? #自定義語句的執行周期,例如:數據庫的版本
條件查詢
customQueryItemName.ACTIVE=[true|false]
你可以定義一個查詢返回值,來判斷指定的查詢語句是否要執行,如下:
archive.Query=select round( A.LOGS*B.AVG/1024/1024/10 ) \
from ( SELECT? COUNT (*)? LOGS FROM V$LOG_HISTORY WHERE \
FIRST_TIME >= (sysdate -10/60/24)) A, \
( SELECT Avg(BYTES) AVG,? Count(1), Max(BYTES) Max_Bytes,Min(BYTES) Min_Bytes? FROM? v$log) B
archive.RaceConditionQuery=select value \
from \
v$parameter where name='log_archive_start'
archive.RaceConditionValue=FALSE
在上面的例子中,如果archive.RaceConditionQuery這個查詢返回的值是archive.RaceConditionValue定義的值,則執行archive.Query查詢語句,archive.RaceConditionValue這個值是TRUE時才查詢,也就是只有當Oracle數據庫處于歸檔模式時才執行歸檔日志查詢。
<QueryName>.Trim=[true|false]
<QueryName>.AddSpaces=[true|false]
<QueryName>.ExcludeColumnsList=[1,2,3,..n]
<QueryName>.Period
<QUERY_NAME>.WhenNotAlive = <VALUE>
DefaultUser = <USERNAME>
DefaultPassword =<PASSWORD>
<QueryName>.ExtraQueryListFile =<VALUE>
<QUERY_NAME>.WhenNotAlive =<VALUE>
/opt/orabbix/conf/log4j.properties在這個文件中可以設置orabbix的日志格式,日志格式和apache的一樣
i.e
如果您有兩個主機RAC1和RAC2和一個實例RACINST,你可以在orabbix配置文件中這么寫:
RACINST.Url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=RAC1.EXAMPLE.COM) \
(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=RAC2.EXAMPLE.COM)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=RACINST)))