標籤:python oracle awr
目前在規劃、開發效能自動化執行架構,其中有個環節很有意思,就是如何通過架構自動獲得情境執行期間的oracle awr報告。雖然Oracle用戶端提供的awrrpt.sql指令碼可以提供互動方式產生awr報告,但並不能直接使用在自動化架構中,至少需要做一些改造,將互動的模式變成可以靜默執行。
一 問題分析
經過對問題的分析,有兩種基本的解決思路:
A. 在oracle伺服器上部署shell指令碼,使用shell命令啟動oracle的sqlplus執行autoawr.sql,其中autoawr.sql主要用於擷取必須入參值,然後調用oracle包的DBMS_WORKLOAD_REPOSITORY.awr_report_html實現awr報告的自動產生;
B. 直接在效能架構裡通過本地的sqlplus調用oracle包的DBMS_WORKLOAD_REPOSITORY.awr_report_html實現awr報告的產生;
二 方案比較
兩種思路的比較:
對於A,需要提前將改造的shell指令碼和sql指令碼部署到oracle伺服器,該步驟是脫離架構的,且產生的報告是在oracle伺服器上,需要架構提供方法將遠程oracle上的awr擷取到本地,用於後續分析和報告輸出;
對於B,在架構實現了該功能,使用架構前無需額外部署,使架構更獨立,使用更方便,且可以直接將報告產生在本地指定的位置;
本質上,兩種思路是相同的,只是對於效能架構而言,該功能應該在哪端實現,是效能架構還是oracle伺服器。
三 實現思路
通過對實現端的比較,決定將該功能在效能架構實現,簡要描述一下實現思路。
實現分為三步:
第一:擷取awr_report_html函數的4參數,即dbid,inst_num,l_bid,l_eid;
第二:拼接調用awr_report_html且使用spool將結果寫入html的sql語句;
第三:調用sqlplus執行sql檔案,產生awr;
四 awr_report_html函數
Awr_report_html函數如下:
函數使用方法一般為:
SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(dbid, inst_num,l_bid,l_eid,0));
需要注意的是:
1. 雖然通過調用AWR_REPORT_HTML可以select到html格式的text,在python實現時我並沒有將返回結果放到迭代器裡,通過readlines的方法寫入html檔案,因output裡包含了一些額外資訊,產生的html並不能順利開啟,原因與sqlplus的參數配置有關,因為採用spool直接寫入檔案的方法;
2. 使用spool時,在sql指令碼裡設定以下sqlplus配置,避免輸出中包含無關資訊或格式問題,設定如下:
set heading off
set trimout on
set trimspool on
set linesize 2500
五 python 源碼
根據上述思路,實現源碼如下:
其他資源:
python入門課程:http://i.youku.com/weiworld521
python實現自動產生oracle awr報告