轉載:使用Python一鍵產生Oracle效能excel曲線圖

來源:互聯網
上載者:User

標籤:color   extend   directory   問題   oracle資料庫   insert   tutorial   oca   官方網站   

文章轉自:http://www.shsnc.cn/show-109-970-1.html

進一步具體可參考:http://xlsxwriter.readthedocs.io/tutorial01.html

 

1. 為什麼要產生曲線圖

做oracle資料庫營運,有時會經常要看一周內資料庫啟動並執行情況,而通過效能曲線圖最能展現資料庫系統的效能變化情況了。如果有安裝oracle的EM,看這個也不是問題。但有些資料庫是沒安裝的,而且EM的是較難以實現定製化的報表需求的,難以把圖表發給使用者。

 

先來看一下要產生的資料:

 

 

還有些附加的要求,如產生報表的工具需要在UNIX/LINUX下執行,能一鍵直接產生exel報表,可以方便地插入到word中。

 

本文正是如何使用python實現這一過程的,主要面向oracle dba且對程式設計語言有一定瞭解的讀者。

 

2. 為什麼要使用 python

 

如果說到為什麼要使用python,只要稍微瞭解一下自動化營運,就會明白python是這一領域編程的王者。業界最有名的自動化營運工具SaltStack及ansible都是基於python實現的。

 

3. 如何做到

 

接下講在已經安裝好oracle資料庫11g DB的Linux環境下,如何一步一步實現最終目標。

 

3.1. 安裝 python

 

在大部份linux及unix下本身會內建python環境,但版本可能過舊,可能會導致後面使用到的一些包不相容,因此建議進行新安裝。安裝時可以考慮使用root帳號進行安裝,如果沒有root許可權,使用主機帳號oracle也可以進行安裝。

 

Python的版本選擇了最新的2.7.10版本,未選3.5主要原因是考慮到3.x下的軟體包還不如2.x下豐富。

 

以oracle帳號安裝python樣本:

 

推薦使用原始碼方式進行安裝,主要的是從 http://www.python.org/ftp/python/下載 Python 的原始碼。選擇最新的版本,下載.tgz 檔案,執行通常的 configure, make, make install 步驟。

 

參考如下:

 

本文設定的python主安裝目錄為/home/oracle/opt/python2.7.10/

 

切換至oracle使用者並建立安裝目錄

 

su - oracle
[[email protected] ~]$ mkdir -p /home/oracle/opt/python2.7.10/

 

設定python環境變數

 

[[email protected] ~]$ vi ~/.bash_profile
在PATH一行加入python路徑
PATH=/home/oracle/opt/python2.7.10/bin:/usr/sbin:/sbin:/usr/bin:$PATH:$HOME/bin:
 
export PATH

 

下載安裝包

 

[[email protected] ~]$ wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz --no-check-certificate
 
--2015-10-25 12:41:56--  https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
Resolving www.python.org... 103.245.222.223
Connecting to www.python.org|103.245.222.223|:443... connected.
WARNING: cannot verify www.python.org‘s certificate, issued by `/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 Extended Validation Server CA‘:
  Unable to locally verify the issuer‘s authority.
HTTP request sent, awaiting response... 200 OK
Length: 16768806 (16M) [application/octet-stream]
...

 

解壓安裝包並進入目錄

 

[[email protected] Python-2.7.10]$ tar xfz Python-2.7.10.tgz
[[email protected] Python-2.7.10]$ cd Python-2.7.10

 

執行configure命令

 

[[email protected] Python-2.7.10]$./configure --prefix=/home/oracle/opt/python2.7.10/
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for --enable-universalsdk... no
checking for --with-universal-archs... 32-bit
....
config.status: pyconfig.h is unchanged
creating Modules/Setup
creating Modules/Setup.local
creating Makefile

 

執行make命令

 

[[email protected] Python-2.7.10]$ make
...

 

執行make install命令

 

 [[email protected] Python-2.7.10]$ make install
...

 

驗證python

 

[[email protected] Python-2.7.10]$ python
Python 2.7.10 (default, Oct 25 2015, 13:07:20)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

 

到此python的2.7.10 for linux已安裝完成

 

3.2.     安裝 cx_Oracle 模組

 

安裝cx_Oracle的主要目的是使python能串連oracle資料庫,用於擷取資料庫中的會話記錄

 

前提條件為

 

oracle資料庫軟體或用戶端已經安裝好,版本10g以上,關鍵環境變數ORACLE_HOME, LD_LIBRARY_PATH已正確配置

 

本文的關鍵設定如下:

vi ~/.bash_profile
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

 

重新整理環境變數

 

source ~/.bash_profile

 

python 版本建議是2.6以上

 

cx_Oracle的為https://pypi.python.org/pypi/cx_Oracle/#downloads,到本文截止時最的安裝包為cx_Oracle-5.2.tar.gz

 

安裝及測試過程如下:

下載

wget https://pypi.python.org/packages/source/c/cx_Oracle/cx_Oracle-5.2.tar.gz#md5=6a49e1aa0e5b48589f8edfe5884ff5a5 --no-check-certificate

 

解壓

 

gunzip cx_Oracle-5.2.tar.gz
tar xvf cx_Oracle-5.2.tar

 

執行安裝

 

cd cx_Oracle-5.2
python setup.py install

 

測試cx_Oracle模組是否正常

 

>>> import cx_Oracle
>>> 

 

如出現以下ImportError提示,表示資料庫軟體未正常安裝或關鍵環境變更設定不正確

 

>>> import cx_Oracle
Traceback (most recent call last):
  File "", line 1, in 
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory

 

測試使用python串連oracle資料庫

 

vi test_cx_oracle.py

 

# -*- coding:UTF-8 -*-
import cx_Oracle                                #引用模組cx_Oracle
conn=cx_Oracle.connect( ‘scott/[email protected]:1521/orcl‘)   #串連資料庫,格式為:使用者名稱/密碼@IP:連接埠/服務名
c=conn.cursor()                                  #擷取cursor
x=c.execute( ‘select * from scott.emp‘)                    #使用cursor進行各種操作
print x.fetchone()                                #列印一行
row = x.fetchall()
for in row:                                    #迴圈列印所有行
     print r
c.close()                                         #關閉cursor
conn.close()                                      #關閉串連

 

執行測試指令碼

 

python test_cx_oracle.py

 

出現類似如下結果,表明python已正常串連資料庫,並成功擷取資料,列印出來

 

[[email protected] ~]$ python test_cx_oracle.py
(7369, ‘SMITH‘, ‘CLERK‘, 7902, datetime.datetime(1980, 12, 17, 0, 0), 800.0, None, 20)
(7499, ‘ALLEN‘, ‘SALESMAN‘, 7698, datetime.datetime(1981, 2, 20, 0, 0), 1600.0, 300.0, 30)
(7521, ‘WARD‘, ‘SALESMAN‘, 7698, datetime.datetime(1981, 2, 22, 0, 0), 1250.0, 500.0, 30)
(7566, ‘JONES‘, ‘MANAGER‘, 7839, datetime.datetime(1981, 4, 2, 0, 0), 2975.0, None, 20)
(7654, ‘MARTIN‘, ‘SALESMAN‘, 7698, datetime.datetime(1981, 9, 28, 0, 0), 1250.0, 1400.0, 30)
(7698, ‘BLAKE‘, ‘MANAGER‘, 7839, datetime.datetime(1981, 5, 1, 0, 0), 2850.0, None, 30)
(7782, ‘CLARK‘, ‘MANAGER‘, 7839, datetime.datetime(1981, 6, 9, 0, 0), 2450.0, None, 10)
(7788, ‘SCOTT‘, ‘ANALYST‘, 7566, datetime.datetime(1987, 4, 19, 0, 0), 3000.0, None, 20)
(7839, ‘KING‘, ‘PRESIDENT‘, None, datetime.datetime(1981, 11, 17, 0, 0), 5000.0, None, 10)
(7844, ‘TURNER‘, ‘SALESMAN‘, 7698, datetime.datetime(1981, 9, 8, 0, 0), 1500.0, 0.0, 30)
(7876, ‘ADAMS‘, ‘CLERK‘, 7788, datetime.datetime(1987, 5, 23, 0, 0), 1100.0, None, 20)
(7900, ‘JAMES‘, ‘CLERK‘, 7698, datetime.datetime(1981, 12, 3, 0, 0), 950.0, None, 30)
(7902, ‘FORD‘, ‘ANALYST‘, 7566, datetime.datetime(1981, 12, 3, 0, 0), 3000.0, None, 20)
(7934, ‘MILLER‘, ‘CLERK‘, 7782, datetime.datetime(1982, 1, 23, 0, 0), 1300.0, None, 10)

 

到此,串連oracle的cx_Oracle模組安裝測試完成

 

3.3.     安裝 xlsxwriter 模組

 

為什麼要安裝xlsxwirter模組呢,主要是用來以python方式讀寫xlsx檔案,也就是excel檔案,並操作excel組建圖表

 

以下為安裝及測試過程

 

:https://pypi.python.org/pypi/XlsxWriter#downloads

 

下載

 

wget https://pypi.python.org/packages/source/X/XlsxWriter/XlsxWriter-0.7.7.tar.gz#md5=c68dca16927e2a919837c68ff63b1e5b  --no-check-certificate

 

解壓

 

gunzip XlsxWriter-0.7.7.tar.gz
tar xvf XlsxWriter-0.7.7.tar

 

執行安裝

 

cd XlsxWriter-0.7.7
python setup.py install

 

測試xlsxwriter模組是否正常

 

>>> import xlsxwriter
>>> 

 

測試寫xlsx檔案

 

vi test_xlsx.py

 

# -*- coding:UTF-8 -*-

import xlsxwriter

workbook = xlsxwriter.Workbook( ‘hello.xlsx‘)
worksheet = workbook.add_worksheet()

worksheet.write( ‘A1‘‘Hello world‘)

workbook.close()

 

下載產生的檔案hello.xlsx,用excel開啟可以看到,產生結果如下:

 

 

從可以看到,已在A1儲存格正確寫入Hello world。

 

到此,xlsxwriter模組安裝完成。

 

3.4.     編寫一鍵產生指令碼

 

資料從何而來?

 

要產生曲線圖,總有得有資料。

 

通過以下語句便可以查詢oracle資料庫AWR報告中會話變化情況資料(事先給相應帳號授權,如:grant select any dictionary to scott):

 

SELECT
 to_char(trunc(b.end_interval_time+10/60/24,‘hh24‘),‘yyyymmdd_hh24‘) snap_time,     
       sum(decode(a.instance_number, 1, a.value)) "INST_1",
       sum(decode(a.instance_number, 2, a.value)) "INST_2",
       c.value max_session,
       d.name ,a.snap_id
  FROM DBA_HIST_SYSSTAT a, dba_hist_snapshot b, (select value from v$parameter where name=‘sessions‘) c,v$database d
 WHERE a.SNAP_ID = b.snap_id
   AND a.instance_number = b.instance_number
   AND STAT_NAME = ‘logons current‘
 GROUP BY d.name,a.snap_id, c.value,  to_char(trunc(b.end_interval_time+10/60/24,‘hh24‘),‘yyyymmdd_hh24‘)
 order by snap_id;

 

 

中的INST_2沒有資料,是因為本次串連的資料庫為單一實例資料庫,所以資料為空白。

 

開啟xlsxwriter官方網站,http://xlsxwriter.readthedocs.org/,看看是如何產生excel曲線圖的。

 

在首頁找到Chart Examples,再進入Example: Line Chart頁面。

 

http://xlsxwriter.readthedocs.org/example_chart_line.html

 

以下的官方給出的例子:

 

 

#######################################################################
#
# An example of creating Excel Line charts with Python and XlsxWriter.
#
# Copyright 2013-2015, John McNamara, [email protected]
#
import xlsxwriter

workbook = xlsxwriter.Workbook( ‘chart_line.xlsx‘)
worksheet = workbook.add_worksheet()
bold = workbook.add_format({ ‘bold‘: 1})

# Add the worksheet data that the charts will refer to.
headings = [ ‘Number‘‘Batch 1‘‘Batch 2‘]
data = [
    [2, 3, 4, 5, 6, 7],
    [10, 40, 50, 20, 10, 50],
    [30, 60, 70, 50, 40, 30],
]

worksheet.write_row( ‘A1‘, headings, bold)
worksheet.write_column( ‘A2‘, data[0])
worksheet.write_column( ‘B2‘, data[1])
worksheet.write_column( ‘C2‘, data[2])

# Create a new chart object. In this case an embedded chart.
chart1 = workbook.add_chart({ ‘type‘‘line‘})

# Configure the first series.
chart1.add_series({
     ‘name‘:        ‘=Sheet1!$B$1‘,
     ‘categories‘‘=Sheet1!$A$2:$A$7‘,
     ‘values‘:      ‘=Sheet1!$B$2:$B$7‘,
})

# Configure second series. Note use of alternative syntax to define ranges.
chart1.add_series({
     ‘name‘:       [ ‘Sheet1‘, 0, 2],
     ‘categories‘: [ ‘Sheet1‘, 1, 0, 6, 0],
     ‘values‘:     [ ‘Sheet1‘, 1, 2, 6, 2],
})

# Add a chart title and some axis labels.
chart1.set_title ({ ‘name‘‘Results of sample analysis‘})
chart1.set_x_axis({ ‘name‘‘Test number‘})
chart1.set_y_axis({ ‘name‘‘Sample length (mm)‘})

# Set an Excel chart style. Colors with white outline and shadow.
chart1.set_style(10)

# Insert the chart into the worksheet (with an offset).
worksheet.insert_chart( ‘D2‘, chart1, { ‘x_offset‘: 25,  ‘y_offset‘: 10})


workbook.close()

 

結合cx_Oracle的模組部分代碼,再稍作修改,便可得出以下代碼:

 

# -*- coding:UTF-8 -*-
#######################################################################
#
# An example of creating Excel Line charts with Python and XlsxWriter.
#
# Copyright 2013-2015, John McNamara, [email protected]
#
import xlsxwriter, cx_Oracle, sys
 
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
 
conn = cx_Oracle.connect(‘scott/[email protected]:1521/orcl)  # 串連資料庫
 
c = conn.cursor()  # 擷取cursor
 
x = c.execute(‘‘‘
SELECT
     to_char(trunc(b.end_interval_time+10/60/24,‘hh24‘),‘yyyymmdd_hh24‘) snap_time,
           sum(decode(a.instance_number, 1, a.value)) "INSTANCE_1",
           sum(decode(a.instance_number, 2, a.value)) "INSTANCE_2",
           c.value max_session,
           d.name ,a.snap_id
      FROM DBA_HIST_SYSSTAT a, dba_hist_snapshot b, (select value from v$parameter where name=‘sessions‘) c,v$database d
     WHERE a.SNAP_ID = b.snap_id
       AND a.instance_number = b.instance_number
       AND STAT_NAME = ‘logons current‘
     GROUP BY d.name,a.snap_id, c.value,  to_char(trunc(b.end_interval_time+10/60/24,‘hh24‘),‘yyyymmdd_hh24‘)
     order by snap_id
‘‘‘)
dbname = x.fetchone()[4]
row = x.fetchall()
 
workbook = xlsxwriter.Workbook(‘chart_line.xlsx‘)
worksheet = workbook.add_worksheet()
bold = workbook.add_format({‘bold‘: 1})
 
# Add the worksheet data that the charts will refer to.
headings = [‘DATE_TIME‘, ‘INST_1‘, ‘INST_2‘, ‘MAXSESS‘, ‘DBNAME‘, ‘SNAP_ID‘, ]
 
worksheet.write_row(‘A1‘, headings, bold)
 
# worksheet.write_column(‘A2‘, row[0])
i = 0
for r in row:
    worksheet.write_row(‘A‘ + str(i + 2), row[i])
    i = i + 1
 
# Create a new chart object. In this case an embedded chart.
chart1 = workbook.add_chart({‘type‘: ‘line‘})
 
chart1.add_series({
    ‘name‘: [‘Sheet1‘, 0, 1],
    ‘categories‘: [‘Sheet1‘, 1, 0, i, 0],
    ‘values‘: [‘Sheet1‘, 1, 1, i, 1],
})
 
# Configure second series. Note use of alternative syntax to define ranges.
chart1.add_series({
    ‘name‘: [‘Sheet1‘, 0, 2],
    ‘categories‘: [‘Sheet1‘, 1, 0, i, 0],
    ‘values‘: [‘Sheet1‘, 1, 2, i, 2],
})
 
# Add a chart title and some axis labels.
chart1.set_title({‘name‘: dbname + ‘資料庫會話數‘})
 
# Set an Excel chart style. Colors with white outline and shadow.
chart1.set_style(10)
 
# Insert the chart into the worksheet (with an offset).
worksheet.insert_chart(‘D2‘, chart1, {‘x_offset‘: 25, ‘y_offset‘: 10})
 
c.close()
workbook.close()

 

儲存為chart_line.py

 

執行python chart_line.py

 

開啟產生的excel檔案chart_line.xlsx,便可看到產生的如表

 

 

以只有一條線,是因為串連的單一實例資料庫,如果串連到rac資料庫,便可產生兩個節點的圖表。

 

4. 總結

 

本文以python的方式從無到有實現的python串連oracle資料庫,一鍵式產生excel圖表,僅供各位營運的同學參考,有很多不完善的地方,還請多多包涵,如有需要可自行擴充。

 

當然,以java或其他方式也可以實現,但Python的簡單易用,以很少的代碼量,讓我們很容易就實現了自己想要的功能。畢竟,人生有很多選擇,選擇一種自己喜歡的過吧。

 

至於個人是如何想這樣做的呢,主要是參考了劉天斯的《Python自動化營運:技術與最佳實務》,一步步百度、GOOGLE而來的。

轉載:使用Python一鍵產生Oracle效能excel曲線圖

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.