python cx_Oracle模塊的安裝
最近需要寫一個數(shù)據(jù)遷移腳本,將單一Oracle中的數(shù)據(jù)遷移到MySQL Sharding集群,在linux下安裝cx_Oracle感覺還是有一點(diǎn)麻煩的,整理一下,做個總結(jié)。
對于Oracle客戶端,不只需要安裝相應(yīng)的python模塊(這里我用了Oracle官方的python模塊——cx_Oracle),還需要安裝Oracle Client,一般選擇Instant Client就足夠了,還需要配置tnsnames.ora(當(dāng)然也可以簡單的通過host:port/schema訪問)。
安裝:
1. 首先確定版本。因?yàn)槲覀兊腛racle數(shù)據(jù)是在是有點(diǎn)老,所以我選擇了一個比較老的版本——Oracle Instant Client 10.2.0.4。
2. 下載instantclient-basic。下載地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。這里要嚴(yán)重BS Oracle,居然要先注冊才能下載,這也算了,關(guān)鍵是注冊的時候,密碼居然要求有數(shù)字有字母,字母還要有大小寫,還必須至少8位。逼迫我搞了一個比我銀行密碼還要安全的密碼(好吧,現(xiàn)在我已經(jīng)忘記我填了什么了...),下basic就可以了。
1
|
$wget http: / / download.oracle.com / otn / linux / instantclient / 10204 / basic - 10.2 . 0.4 . 0 - linux - x86_64. zip |
3.安裝配置
1
2
3
4
5
6
7
8
9
10
11
12
|
$unzip instantclient - basic - linux.x64 - 10.2 . 0.4 . 0.zip $cd instantclient_10_2 $cp * / usr / lib #直接放到動態(tài)庫搜索路徑中,不需要額外的環(huán)境配置 或 $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)
注意tnsnames.ora其實(shí)并不存在,是要自己創(chuàng)建的(這個也很惡心,我一開始以為還要安裝什么東東。。),我沒有使用這種方式,有興趣的可以google一下。
5.下載安裝cx_Oracle python模塊
1
2
3
|
$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 #有這個文件表示安裝成功,根據(jù)python的位置,也可能在其他地方,自己找一下吧 |
6.驗(yàn)證及問題解決
1
2
|
$python >> import cx_Oracle |
若報錯:import cx_Oracle gave ImportError: libclntsh.so.10.1: cannot open shared object file: No such file or directory
表示沒有找到instant client的動態(tài)庫,check一下環(huán)境變量是否配置,是否生效,版本是否正確。
若報錯:ImportError: ./cx_Oracle.so: undefined symbol: PyUnicodeUCS4_Decode
1
2
3
4
|
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 |
所以重新編譯python
1
2
|
$. / configure - - prefix = / usr / local / python2. 6.5 - - enable - shared - enable - unicode = ucs4 $make;make install |
再次驗(yàn)證,終于正常import了。
使用:
1.基本連接–使用Oracle tns alias
1
2
3
4
5
6
7
8
9
10
|
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 ) |
2.用戶輸入密碼連接
1
2
|
pwd = getpass.getpass() connection = cx_Oracle.connect( "tp" ,pwd, "ocn_test" ) |
3.用戶直接在Python命令中輸入連接賬號信息,格式如python script.py tp/tp@ocn_test
1
|
connection = cx_Oracle.connect(sys.argv[ 1 ]) |
4.使用Easy Connect語法,通過Drive連接數(shù)據(jù)庫
1
2
3
|
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' ) |
5.先使用DSN構(gòu)成TNSNAME
1
2
|
tns_name = cx_Oracle.makedsn( '10.20.36.19' , '1521' , ' ocntest ' ) connection = cx_Oracle.connect( 'tp' , 'tp' ,tns_name) |
6.登陸as SYSDBA
1
2
3
|
connection = cx_Oracle.connect( 'tp/tp@ocn_test' , mode = cx_Oracle.SYSDBA) #or as SYSOPER connection = cx_Oracle.connect( 'tp/tp@ocn_test' , mode = cx_Oracle.SYSOPER) |
在Linux服務(wù)器執(zhí)行Oracle操作時報了一個錯誤:
1
|
TNS:listener does not currently know of service requested in connect descriptor |
解決方式:
問題分析見http://ora-12514.ora-code.com/,一番折騰,最后使用第5種連接方式,瞬間解決此問題。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://www.cnblogs.com/oubo/archive/2012/07/24/2607034.html