iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

IT工作中曾遇到的問題系列 第 22

Raspberry pi 取得Oracle DB的資料

  • 分享至 

  • xImage
  •  

之前要做監控Oracle DB狀況的一個小型專案,因為使用的資源不多,所以想用樹莓派來當做Server,以節省建置成本。

雖然最後改以PRTG Network Monitor這套軟體來使用,但是紀錄一下,也許未來還可以應用到其他的方面。

一開始在我的PC上測試,是以python+cx_oracle+Oracle Instant Client來寫程式,使用上並沒有問題。

cx_Oracle 是一個Python 擴充模組,可讓python使用資料庫 API 來查詢和更新 Oracle 資料庫,不過現在已改為python-oracledb
可參考官方文件:https://python-oracledb.readthedocs.io/en/latest/user_guide/introduction.html

Oracle Instant Client是用來建立和執行連線至遠端或本機Oracle Database 的應用程式

把程式轉到Raspberry pi時發現Oracle Clinet並沒有ARM CPU版本,也就是說Raspberry pi無法連接Oracle DB

後來只好轉一個方向,換用python的paramiko套件,透過SSH 連線方式來執行遠端機器的程式

所以方法改以SSH連線至DB Server,由DB Server執行Script來取得資料並回傳給Raspberry pi上的python

首先在Raspberry pi OS 安裝python模組paramiko

# pip3 install paramiko

接著程式分為兩個部份,第一個是Raspberry pi OS的python程式

import paramiko

port =22
username = test
password = 123456
IP = 192.168.1.10
oraonlineCom = "./test.sh" #DB Server上欲執行的Script檔,此檔放在家目錄底下

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(IP,port,username, password)
stdin, stdout, stderr = ssh.exec_command(oraonlineCom)
oradata = stdout.readlines()

print( str(oradata[0].strip('\n')) )

stdout.close()
stdin.close()
stderr.close()
ssh.close()  

程式說明

  1. username與password,因為要使用SSH連線,所以這裡指的是Oracle DB Server上的帳號跟密碼,不是Oracle DB的。
  2. 通常不建議使用set_missing_host_key_policy(),若我們已有 host key,則使用 load_host_keys() 來連接伺服器才是比較安全的做法
  3. 連上Oracle DB Server後,就可以用exec_command來執行遠端的命令
  4. oradata = stdout.readlines()與print( str(oradata[0].strip('\n')):就是Server在執行完指令,以一行一行的方式讀取傳回的結果,並將結果(陣列)的第一筆資料取出

第二個是DB Server的Script程式(test.sh),主要是利用sqlplus來執行SQL並傳回資料

#!/bin/bash
sqlplus -s USERNAME/PASSWORD << EOF
SET SERVEROUTPUT ON
SET FEEDBACK OFF
DECLARE
   reVal varchar(30);
BEGIN
   SELECT count(DISTINCT icx.session_id) into reVal 
     FROM apps.icx_sessions icx 
     WHERE disabled_flag != 'Y'
     AND icx.pseudo_flag = 'N'
     AND  ( last_connect +( 30 / 60 / 24)) > SYSDATE
     AND icx.counter < limit_connects;

   DBMS_OUTPUT.PUT_LINE(reVal);
END;
/
EXIT
EOF

####程式說明

  1. 這裡的USERNAME/PASSWORD就是Oracle DB的帳號跟密碼
  2. SET SERVEROUTPUT ON 是指讓sqlplus可以顯示輸出,可以使用dbms_output
  3. SET FEEDBACK OFF 不顯示行數

這樣的方法雖然有點偏道,但是可以從Raspberry pi取到Oracle DB的資料,也是一種解決的方式。


上一篇
幾個小功能,但是有需要時還蠻好用的
下一篇
Oracle EBS 11i找出ICM(Internal Manager掛掉)的log與問題
系列文
IT工作中曾遇到的問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
MatthewWangUS
iT邦新手 3 級 ‧ 2023-10-12 10:54:32

PRTG需windows才能裝,且sensor在免費版有限制。假設主機不多。PRTG 的確是個好選擇

我要留言

立即登入留言