監控Oracle資料庫我們需要安裝第三方提供的Zabbix插件,我們先測試比較有名的Orabbix,http://www.smartmarmot.com/product/orabbix/ 從部署架構圖上可以看出,orabbix是通過JDBC去連接被監控資料庫的,其實不是必須在資料庫主機上安裝Agen ...
Orabbix介紹
監控Oracle資料庫我們需要安裝第三方提供的Zabbix插件,我們先測試比較有名的Orabbix,http://www.smartmarmot.com/product/orabbix/
從部署架構圖上可以看出,orabbix是通過JDBC去連接被監控資料庫的,其實不是必須在資料庫主機上安裝Agent,而運行orabbix的主機,可以是Zabbix Server,也可以是資料庫主機和zabbix server之外的任意一臺主機,為了測試方便,我們將orabbix安裝在Zabbix Server上。
下載軟體及安裝服務
Ø 下載 Orabbix ,上傳到你的 Zabbix Server
Ø unzip 軟體到這個目錄: /opt/orabbix
Ø 安裝服務:
Ø 複製啟動腳本
#cp /opt/orabbix/init.d/orabbix /etc/init.d/orabbix
Ø 運行許可權:
#chmod +x /etc/init.d/orabbix
#chmod +x /opt/orabbix/run.sh
Ø #chkconfig --add orabbix
建立監控用戶及授權
CREATE USER ZABBIX
IDENTIFIED BY welcome1
DEFAULT TABLESPACE SYSTEM
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
REM 2 Roles for ZABBIX
GRANT CONNECT TO ZABBIX;
GRANT RESOURCE TO ZABBIX;
ALTER USER ZABBIX DEFAULT ROLE ALL;
REM 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;
如果是11g資料庫,執行下列語句:
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;
修改orabbix配置文件
#cd /opt/orabbix/conf
#cp config.props.sample config.props
根據實際的部署情況修改文件,比如:
#comma separed list of Zabbix servers
ZabbixServerList=ZabbixServer1
ZabbixServer1.Address=192.168.0.41 ##Zabbix伺服器地址
ZabbixServer1.Port=10051 ##Zabbix伺服器埠
#pidFile
OrabbixDaemon.PidFile=./logs/orabbix.pid
#frequency of item's refresh
OrabbixDaemon.Sleep=300
#MaxThreadNumber should be >= than the number of your databases
OrabbixDaemon.MaxThreadNumber=100
#put here your databases in a comma separated list
DatabaseList=DB1,DB2,DB3 ##資料庫列表,名稱隨便起
#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:@192.168.0.31:1521:test1 ##資料庫連接串
DB1.User=zabbix ##監控資料庫用戶名
DB1.Password=welcome1 ##監控資料庫口令
保存配置文件,然後重啟orabbix。
導入模板
在orabbix的軟體包裡面有4各模板文件,導入下麵途中這個模板文件就可以了,包含了其他所有模板文件的內容。
適用Orabbix
在zabbix界面上配置資料庫監控時,要註意,orabbix是把每個資料庫都配置成一個“主機”的,這塊看著有點彆扭,而且,註意在配置主機時,名稱一定要和config.props文件中配置的資料庫名稱一樣,比如我這裡就是DB1:
前面說了,這個“主機”的地址可以隨便寫,因為被監控的主機端不需要一定有agent,但是為了方便管理,我覺得還是寫上Oracle主機的地址比較好。
定義了主機後,就可以適用模板中預定義的監控項、觸發器和圖表了。
比如圖表:
比如最簡單的檢查資料庫適用可用的觸發器:
當然,對應觸發器的動作還是需要自己配置。
自定義SQL檢查
Orabbix提供了表空間的監控,監控項對應的SQL:
tbl_space.Query=SELECT * FROM ( \
select '- Tablespace ->',t.tablespace_name ktablespace, \
'- Type->',substr(t.contents, 1, 1) tipo, \
'- Used(MB)->',trunc((d.tbs_size-nvl(s.free_space, 0))/1024/1024) ktbs_em_uso, \
'- ActualSize(MB)->',trunc(d.tbs_size/1024/1024) ktbs_size, \
'- MaxSize(MB)->',trunc(d.tbs_maxsize/1024/1024) ktbs_maxsize, \
'- FreeSpace(MB)->',trunc(nvl(s.free_space, 0)/1024/1024) kfree_space, \
'- Space->',trunc((d.tbs_maxsize - d.tbs_size + nvl(s.free_space, 0))/1024/1024) kspace, \
'- Perc->',decode(d.tbs_maxsize, 0, 0, trunc((d.tbs_size-nvl(s.free_space, 0))*100/d.tbs_maxsize)) kperc \
from \
( select SUM(bytes) tbs_size, \
SUM(decode(sign(maxbytes - bytes), -1, bytes, maxbytes)) tbs_maxsize, tablespace_name tablespace \
from ( select nvl(bytes, 0) bytes, nvl(maxbytes, 0) maxbytes, tablespace_name \
from dba_data_files \
union all \
select nvl(bytes, 0) bytes, nvl(maxbytes, 0) maxbytes, tablespace_name \
from dba_temp_files \
) \
group by tablespace_name \
) d, \
( select SUM(bytes) free_space, \
tablespace_name tablespace \
from dba_free_space \
group by tablespace_name \
) s, \
dba_tablespaces t \
where t.tablespace_name = d.tablespace(+) and \
t.tablespace_name = s.tablespace(+) \
order by 8) \
where kperc > 93 \
and tipo <>'T' \
and tipo <>'U'
tbl_space.NoDataFound=none
這個SQL會返回93%滿的表空間信息,而對應這個監控項,orabbix也定義了觸發器,因為監控項的返回值是文本,而沒有滿足條件的記錄時返回字元串“none“,所以監控項對應的觸發器會檢查返回值開頭是不是none,如果不是,就報警,這樣,用戶除了收到預警信息,還能從返回值的具體值中看到具體時哪個表空間快滿了。
當然,大部分時間監控項會返回none,所以我們無法畫出正常未滿的表空間的空間占用時間曲線。只有超過93%慢時,我們才知道具體的占用情況。
如果想收集並保留更多信息,就需要使用自定義查詢,方法就是在query.props文件中加入你想檢查的SQL,比如我們想瞭解表空間信息,就加以下SQL:
customtbl.Query=select 'TBL:'||a.tablespace_name||',' TBL, \
'Total Size:'||trunc(sum(a.tots) / 1024 / 1024, 2)||',' Tot_Size_mb, \
'Free MB:'||round(sum(a.sumb) / 1024 / 1024, 2)||',' Tot_Free_mb, \
'PCT Free:'||round(sum(a.sumb) * 100 / sum(a.tots), 2)||',' Pct_Free, \
'Max Free MB:'||round(sum(a.largest) / 1024 / 1024, 2)||',' Max_Free_mb, \
'Chunks Free:'||sum(a.chunks)||',' Chunks_Free \
from (select tablespace_name, \
0 tots, \
sum(bytes) sumb, \
max(bytes) largest, \
count(*) chunks \
from dba_free_space a \
group by tablespace_name \
union \
select tablespace_name, sum(bytes) tots, 0, 0, 0 \
from dba_data_files \
group by tablespace_name) a \
group by a.tablespace_name
customtbl.NoDataFound=none
然後在orabbix對應的模板中添加這個監控項customtbl就可以了,下麵時從最新數據菜單查看的SQL的返回結果:
當然,我們要做進一步的分析和展示,就需要使用別的工具或者開發工具來做了,這個就不是這篇文章討論的範圍了。
Orabbix不足
初步測試,感覺orabbix有2點明顯缺陷:
1. 被監控資料庫信息要逐個寫進配置文件,如果資料庫個數比較多,管理會比較麻煩
2. 被監控資料庫的賬號信息是寫在配置文件中,而且口令是明文存儲,有很大的安全隱患
3. 對RAC的支持還是很初級