python cx_Oracle模組的安裝
最近需要寫一個資料遷移腳本,將單一Oracle中的資料遷移到MySQL Sharding集群,在linux下安裝cx_Oracle感覺還是有一點麻煩的,整理一下,做個總結。
對於Oracle客戶端,不只需要安裝對應的python模組(這裡我用了Oracle官方的python模組-cx_Oracle),還需要安裝Oracle Client,一般選擇Instant Client就夠了,還需要設定tnsnames.ora(當然也可以簡單的透過host:port/schema存取)。
安裝:
1. 先確定版本。因為我們的Oracle資料是在是有點老,所以我選了一個比較老的版本-Oracle Instant Client 10.2.0.4。
2. 下載instantclient-basic。下載網址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。 。這裡要嚴重BS Oracle,居然要先註冊才能下載,這也算了,關鍵是註冊的時候,密碼居然要求有數字有字母,字母還要有大小寫,還必須至少8位。逼我搞了一個比我銀行密碼還要安全的密碼(好吧,現在我已經忘記我填了什麼了...),下basic就可以了。
$wget http://download.oracle.com/otn/linux/instantclient/10204/basic-10.2.0.4.0-linux-x86_64.zip
3.安裝配置
$unzip instantclient-basic-linux.x64-10.2.0.4.0.zip $cd instantclient_10_2 $cp * /usr/lib #直接放到动态库搜索路径中,不需要额外的环境配置 或 $unzip instantclient-basic-linux.x64-10.2.0.4.0.zip $cp -rf instantclient_10_2 /opt/ $vi /etc/profile export ORACLE_HOME=/opt/instantclient_10_2 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME $source /etc/profile
4.配置tnsnames.ora(可不用配置tns)
噁心,我一開始以為還要安裝什麼東東。
5.下載安裝cx_Oracle python模組
$wget http://downloads.sourceforge.net/project/cx-oracle/5.1.2/cx_Oracle-5.1.2-10g-py26-1.x86_64.rpm $rpm -ivh cx_Oracle-5.1.2-10g-py26-1.x86_64.rpm $ls /usr/lib/python2.6/site-packages/cx_Oracle.so #有这个文件表示安装成功,根据python的位置,也可能在其他地方,自己找一下吧
6.驗證及問題解決
$python >>import cx_Oracle
r. open shared object file: No such file or directory
表示沒有找到instant client的動態函式庫,check一下環境變數是否配置,是否生效,版本是否正確。
若報錯:ImportError: ./cx_Oracle.so: undefined symbol: PyUnicodeUCS4_Decode
Google的信息:There is nothing wrong with Debian. Python supports two incompatible modes of operation for Unicode, UCS2 (the default), and UCS4. Debian uses the default, Redhat uses UCS4. You need to recompile the extension for UCS-2 mode (i.e. using a Debian installation); this would fix the undefined symbol: PyUnicodeUCS4_Decode
所以重新編譯
使用:
1.基本連接–使用Oracle tns alias$./configure --prefix=/usr/local/python2.6.5 --enable-shared -enable-unicode=ucs4 $make;make install
2.用戶輸入密碼連接
如python script.py tp/tp@ocn_test
connection =cx_Oracle.connect("tp/tp@ocn_test") #查看tns alias命令 cmd>tnsping ocn_test TNS Ping Utility forLinux: Version 9.2.0.8.0-Production on 27-SEP-201110:47:48 Copyright (c) 1997, 2006, Oracle Corporation. Allrights reserved. Used parameter files: /opt/……/sqlnet.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL =TCP)(HOST =10.20.36.19)(PORT =1520))) (CONNECT_DATA =(SID =ocntest))) OK (10msec)
4.使用Easy Connect語法,透過Drive連接資料庫
pwd =getpass.getpass() connection =cx_Oracle.connect("tp",pwd,"ocn_test")
6 .登陸as SYSDBA
connection =cx_Oracle.connect(sys.argv[1])
在Linux伺服器執行Oracle操作時報了一個錯誤:
connection =cx_Oracle.connect('tp','tp','10.20.36.19:1521/ocntest') #or connection =cx_Oracle.connect('tp/tp@10.20.36.19:1521/ocntest')
解決方式:
tns_name =cx_Oracle.makedsn('10.20.36.19','1521',' ocntest ') connection =cx_Oracle.connect('tp','tp',tns_name)