一、簡介
Orabbix 是設計用來為 zabbix 監控 Oracle 數據庫的插件,它提供多層次的監控,包括可用性和服務器性能指標。
它提供了從眾多 Oracle 實例采集數據的有效機制,進而提供此信息的監控和性能指標。然后,您可以利用的 zabbix 的報告功能為收集的所有數據,並提供分析。目前的發行版中包含了一組預先定義的模板,包括從初始部署警報和圖形功能。然而,這些可以進行微調,以滿足您的需求和數據/監控要求。
Orabbix 監控什么?
1. 數據庫版本
2. 歸檔日志與生產趨勢分析
3. 觸發器,表/過程等命中率
4. 邏輯 I/O 性能
5. 物理 I/O 性能
6. PGA
7. SGA
8. 共享池
9. Sessions
10. 數據庫大小
二、安裝配置
# mkdir /opt/orabbix
# cd /opt/orabbix
# unzip orabbix-1.2.3.zip
# mvconf/config.props.sample conf/config.props
# cp init.d/orabbix /etc/init.d/
# chmod 755 /etc/init.d/orabbix
# chkconfig orabbix on
三、修改 orabbix 配置
# vim conf/config.props
#comma separed list of Zabbix servers
ZabbixServerList=ZabbixServer
ZabbixServer.Address=192.168.0.180 #zabbix服務器地址
ZabbixServer.Port=10051 #端口號
#pidFile
OrabbixDaemon.PidFile=./logs/orabbix.pid
#frequency of item's refresh
OrabbixDaemon.Sleep=300
#MaxThreadNumber should be >= thanthe number of your databases
OrabbixDaemon.MaxThreadNumber=100 #最大連接線程數,建議數據庫數兩倍
#put here your databases in a commaseparated list
DatabaseList=192.168.0.70 # 名稱與該機在 zabbix 中監控的主機名稱保持一致,用逗號隔開
#Configuration of Connection pool
#if not specified Orabbis is going touse default values (hardcoded)
#Maximum number of active connectioninside pool
DatabaseList.MaxActive=10
#The maximum number of milliseconds thatthe pool will wait
#(when there are no availableconnections) 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 foreach database
192.168.0.70.Url=jdbc:oracle:thin:@192.168.0.70:32778:southdb # 需要 jdk 環境,因為這里是通過 JDBC 連接的,southdb 為數據庫實例名稱
192.168.0.70.User=ZABBIX # 用來監控 oracle 數據庫的用戶名和密碼,需要在 oracle 中創建並賦予一定的權限
192.168.0.70.Password=ZABBIX
#Those values are optionals if notspecified Orabbix is going to use the general values
192.168.0.70.MaxActive=10
192.168.0.70.MaxWait=100
192.168.0.70.MaxIdle=1
192.168.0.70.QueryListFile=./conf/query.props #SQL執行腳本
#DB2.Url=jdbc:oracle:thin:@server2.domain.example.com:<LISTENER_PORT>:DB2
#DB2.User=zabbix
#DB2.Password=zabbix_password
#DB2.QueryListFile=./conf/query.props
#DB3.Url=jdbc:oracle:thin:@server3.domain.example.com:<LISTENER_PORT>:DB3
#DB3.User=zabbix
#DB3.Password=zabbix_password
#DB3.QueryListFile=./conf/query.props
修改抓取頻率
vim query.props
DefaultQueryPeriod=2 #執行頻率默認兩分鍾 修改完需重啟orabbix服務
關於 jdbc:
Oracle = jdbc:oracle:thin:@<host>:<LISTENER_PORT>:<instance>
PostgreSQL = jdbc:postgresql://<host>:<port>/<database>
MS Sql Server = jdbc:jtds:sqlserver://<host>:<port>/<instancename>
MySQL Server = jdbc:mysql://[host:port],[host:port].../[database]
DB2 = jdbc:db2://<servername>:<port>/<installation>
四、創建 oracle 監控賬戶
1、登錄 oracle 命令行
su - oracle # 切換到 oracle 用戶
sqlplus /nolog # 不連接任何數據庫
conn /as sysdba # 用sysdba 登陸
或
conn 用戶名/密碼
select instance_name from v$instance; # 查看實例
2、創建用戶
CREATE USER zabbix
IDENTIFIED BY 123456
DEFAULT TABLESPACE SYSTEM
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
3、賦予角色權限
GRANT CONNECT TO zabbix;
GRANT RESOURCE TO zabbix;
ALTER USER MONITOR DEFAULT ROLEALL;
4、賦予系統權限
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;
如果是11g數據庫,執行下列語句:
exec dbms_network_acl_admin.create_acl(acl => 'resolve.xml',description => 'resolve acl', principal =>'MONITOR', is_grant => true, privilege => 'resolve');
exec dbms_network_acl_admin.assign_acl(acl => 'resolve.xml', host =>'*');
commit;
五、啟動服務
/etc/init.d/orabbix start
或
/opt/orabbix/run.sh
在啟動服務過程中通過 tail -f /opt/orabbix/logs/orabbix.log日志查看報錯信息。
六、zabbix server 端配置
將該模板 Orabbix_export_full.xml 下載到本機,導入 zabbix server template
# sz orabbix/template/Orabbix_export_full.xml
將模板綁定到要監控的主機上:
但是感覺很多的指標還是要看oracle性能報告
附:官方文檔
http://www.smartmarmot.com/wiki/index.php/Orabbix
設置監控表空間
[iyunv@test opt]# cat /home/oracle/oracle_cron.sh
#!/bin/bash
source /home/oracle/.bash_profile
sqlplus -s zabbix/123456 > /tmp/tablespace.log<<EOF
set linesize 140 pagesize 10000
col "Status" for a10
col "Name" for a25
col "Type" for a10
col "Extent" for a15
col "Size (M)" for a20
col "Used (M)" for a20
col "Used %" for a20
SELECT d.status "Status", d.tablespace_name "Name", d.contents "Type", d.extent_management "Extent",
TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,990') "Size (M)",
TO_CHAR(NVL(a.bytes - NVL(f.bytes, 0), 0)/1024/1024,'999,999,999') "Used (M)",
TO_CHAR(NVL((a.bytes - NVL(f.bytes, 0)) / a.bytes * 100, 0), '990.00') "Used %"
FROM sys.dba_tablespaces d,
(select tablespace_name, sum(bytes) bytes from dba_data_files
group by tablespace_name) a, (select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) f WHERE
d.tablespace_name = a.tablespace_name(+) AND d.tablespace_name = f.tablespace_name(+) AND NOT
(d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY')
UNION ALL
SELECT d.status "Status", d.tablespace_name "Name", d.contents "Type", d.extent_management "Extent",
TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,999') "Size (M)",
TO_CHAR(NVL(t.bytes,0)/1024/1024,'999,999,999') "Used (M)",
TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "Used %" FROM sys.dba_tablespaces d,
(select tablespace_name, sum(bytes) bytes from dba_temp_files group by tablespace_name) a, (select
tablespace_name, sum(bytes_cached) bytes from v\$temp_extent_pool group by tablespace_name) t WHERE
d.tablespace_name = a.tablespace_name(+) AND d.tablespace_name = t.tablespace_name(+) AND
d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY'
ORDER BY 7;
EOF
通過執行這個腳本可以獲取到oracle數據庫中的tablespace列表,並輸出到/tmp/tablespace.log日志中去,這個執行腳本需要修改屬主屬組為oracle.oracle,並且需要給於執行權限,在crontab中設置每一分鍾執行一次,下面是執行得到的結果:
[iyunv@test opt]# cat /tmp/tablespace.log
Status Name TypeExtentSize (M) Used (M) Used %
---------- ------------------------- ---------- --------------- -------------------- -------------------- --------------------
ONLINE UNDOTBS1 UNDOLOCAL280 12 4.38
ONLINE QWERTY PERMANENTLOCAL 101 10.00
ONLINE USERS PERMANENTLOCAL 51 20.00
ONLINE SYSTEM PERMANENTLOCAL700 377 53.88
ONLINE TEMP TEMPORARYLOCAL 20 11 55.00
ONLINE SYSAUX PERMANENTLOCAL550 400 72.78
6 rows selected.
上面就是取出來的數據,既然數據取出來了,那么剩下的要做的就是把數據弄到zabbix中去咯。
下面將使用下面兩個腳本來對取出的這些數據進行格式化轉換和取值:
[iyunv@test opt]# cat /usr/local/zabbix/scripts/oracle_discovery.sh
#!/bin/bash
TABLESPACE=`cat /tmp/tablespace.log |awk '{print$2}'|awk 'NR>3{print}'`
COUNT=`echo "$TABLESPACE" |wc -l`
INDEX=0
echo '{"data":['
echo "$TABLESPACE" | while read LINE; do
echo -n '{"{#TABLENAME}":"'$LINE'"}'
INDEX=`expr $INDEX + 1`
if [ $INDEX -lt $COUNT ]; then
echo ','
fi
done
echo ']}'
這個腳本的功能是從tablespace.log文件中取出Name那一列,並進行JSON格式化輸出(因為zabbix的自動發現功能獲取的數據類型是JSON格式的),下面是執行效果:
[iyunv@test opt]# cat /usr/local/zabbix/scripts/oracle_check.sh
#!/bin/bash
EQ_DATA="$2"
ZBX_REQ_DATA_TAB="$1"
SOURCE_DATA=/tmp/tablespace.log
case $2 in
maxmb) grep -E "$ZBX_REQ_DATA_TAB" $SOURCE_DATA |awk '{print $5*1024*1024}';;
used) grep -E "$ZBX_REQ_DATA_TAB" $SOURCE_DATA |awk '{print $6*1024*1024}';;
autopercent) grep -E "$ZBX_REQ_DATA_TAB" $SOURCE_DATA |awk '{print $7}';;
*) echo $ERROR_WRONG_PARAM; exit 1;;
esac
exit 0
其中maxmb和used取出的值是M,所以這里給轉換成了byte,方便zabbix取值,下面是舉例取出來的值:
[iyunv@test opt]# sh /usr/local/zabbix/scripts/oracle_check.sh SYSAUX maxmb
576716800
[iyunv@test opt]#
這里配置完成之后就需要在zabbixagentd的配置文件中添加監控key了:
[iyunv@test opt]# tail -3 /usr/local/zabbix/etc/zabbix_agentd.conf
UserParameter=ora.tab.discovery,/usr/local/zabbix/scripts/oracle_discovery.sh
UserParameter=tablespace
• ,/usr/local/zabbix/scripts/oracle_check.sh $1 $2
添加key之后需要重啟zabbix agentd服務。
然后我們就需要在zabbixserver中添加監控模板了,首先創建一個發現規則:
其中的鍵值ora.tab.discovery就是我們在agentd的配置文件中定義的,由這個發現規則獲取到的是一個JSON格式的返回值。要注意其中的數據更新間隔,這個值指的是你的發現規則執行的時間間隔,我這里暫時設置為60s
然后我們開始創建項目原型了,下面是創建的詳細內容:
按照上面的項目原型依次創建{#TABLENAME}used和{#TABLENAME}autopercent,對應的鍵值是tablespace[{#TABLENAME},used]和tablespace[{#TABLENAME},autopercent],創建完發現規則后,開始創建圖形原型了,下面是圖形原型的詳細內容:
保存完成后,該發現規則就做好了,之后等待大約一分鍾之后就可以看到采集到的數據了,這和上面設定的60s的數據更新間隔是一致的。下面是獲取到的監控tablespace的結果: