#目的
Oracle Databaseのディクショナリ情報を、
pythonのライブラリ(cx_Oracle)を使用して
汎用データ取得スクリプトです。
#なぜ?
sqlplusのspoolで取得するのが一般的だと思いのですが
やはり遅いですよね?
毎回、取得データに合わせてスクリプトを書くのは面倒ですよね?
取得したは良いがフォーマットがガタガタで再取得なんて事も多いですよね?
#作成したスクリプト
staticinfo.py
#!/usr/bin/python
import cx_Oracle
import os
import sys
import csv
USER='******' #環境に合わせて変更してください(system)
PASS='********' #環境に合わせて変更してください(manager)
HOST='***.***.***.***' #環境に合わせて変更してください(192.168.0.1)
PORT='****' #環境に合わせて変更してください(1521)
SERVICE_NAME='****' #環境に合わせて変更してください(ORCL)
FETCH_ROWS=100 #環境に合わせて変更してください
argv = sys.argv
argc = len(argv)
if argc != 2:
print('Usage: %s filename or tablename' % argv[0])
quit()
print("execution..." + argv[1])
p1 = argv[1]
name, ext = os.path.splitext(p1)
if ext == ".sql":
#SQL文取得
f = open(p1)
sql = f.read()
f.close()
out_file_name = name + '.csv'
else:
#SQL文作成
sql = 'select * from %s' % p1
out_file_name = p1.replace('$','_') + '.csv'
with cx_Oracle.connect(USER,PASS,HOST+':'+PORT+'/'+SERVICE_NAME) as conn:
#SQL文実行
cur_detail = conn.cursor()
cur_detail.execute(sql)
#カラム名を取得
csv_header = [str[0] for str in cur_detail.description]
#データ部を取得
f = open(out_file_name, 'w')
writer = csv.writer(f, lineterminator='\n', quoting=csv.QUOTE_ALL)
writer.writerow(csv_header)
while 1:
csv_detail = cur_detail.fetchmany(FETCH_ROWS)
if len(csv_detail) == 0:
break
writer.writerows(csv_detail)
cur_detail.close()
#実行方法
$ python staticinfo.py dba_users
・環境変数(ORACLE_HOME/LD_LIBRARY_PATH)等を指定する必要があります。
・カレントディレクトリに(dba_users.csv)という目的のファイルが作成されます。
・事前にスクリプトを用意しておけば、スクリプトの結果をcsvにするとこも可能です。
#面倒なので
下記のようなshellを作成して、一気に出力をします。
staticinfo.sh
#!/bin/sh
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2/client_1
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
python staticinfo.py dba_users
python staticinfo.py dba_profiles
python staticinfo.py dba_data_files
python staticinfo.py dba_temp_files
python staticinfo.py dba_tablespaces
python staticinfo.py dba_segments
python staticinfo.py dba_roles
python staticinfo.py dba_role_privs
python staticinfo.py dba_sys_privs
python staticinfo.py dba_tab_privs
python staticinfo.py gv\$database
python staticinfo.py gv\$instance
python staticinfo.py gv\$log
python staticinfo.py gv\$logfile
python staticinfo.py gv\$controlfile
python staticinfo.py gv\$parameter2
python staticinfo.py 01_tablespace_capacity.sql
python staticinfo.py 02_datafile_capacity.sql
python staticinfo.py 03_tempfile_capacity.sql
#最後に
汎用的にしたかったので、こだわった点は、SQLファイルの実行とカラム名の自動取得です。
もちろんユーザデータの取得する事も可能ですので
カスタマイズ次第で、可能性を秘めているスクリプトになったと思っています。
#追記
「cx_Oracle」から「python-oracledb」に、なったので修正が必要