因為要做監控Oracle DB狀況的一個小型專案,想用樹莓派來當做Server,以節省建置成本。
一開始在我的電腦上測試,是以python+cx_oracle+Oracle Client來設計,使用上並沒有問題。
把程式轉到Raspberry pi時發現Oracle Clinet並沒有ARM CPU版本,也就是說無法由python直接讀取Oracle DB
最後是用paramiko,以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
oraonCom = "./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()
第二個是DB Server的Script程式,主要是利用sqlplus來執行SQL並傳回資料。
因為sqlplus會有一些檔頭等我們不需要的資訊,所以必需用一些參數來避掉。
#!/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