python cx_Oracle模块的安装和使用详细介绍
pythoncx_Oracle模块的安装
最近需要写一个数据迁移脚本,将单一Oracle中的数据迁移到MySQLSharding集群,在linux下安装cx_Oracle感觉还是有一点麻烦的,整理一下,做个总结。
对于Oracle客户端,不只需要安装相应的python模块(这里我用了Oracle官方的python模块——cx_Oracle),还需要安装OracleClient,一般选择InstantClient就足够了,还需要配置tnsnames.ora(当然也可以简单的通过host:port/schema访问)。
安装:
1.首先确定版本。因为我们的Oracle数据是在是有点老,所以我选择了一个比较老的版本——OracleInstantClient10.2.0.4。
2.下载instantclient-basic。下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。这里要严重BSOracle,居然要先注册才能下载,这也算了,关键是注册的时候,密码居然要求有数字有字母,字母还要有大小写,还必须至少8位。逼迫我搞了一个比我银行密码还要安全的密码(好吧,现在我已经忘记我填了什么了...),下basic就可以了。
$wgethttp://download.oracle.com/otn/linux/instantclient/10204/basic-10.2.0.4.0-linux-x86_64.zip
3.安装配置
$unzipinstantclient-basic-linux.x64-10.2.0.4.0.zip $cdinstantclient_10_2 $cp*/usr/lib#直接放到动态库搜索路径中,不需要额外的环境配置 或 $unzipinstantclient-basic-linux.x64-10.2.0.4.0.zip $cp-rfinstantclient_10_2/opt/ $vi/etc/profile exportORACLE_HOME=/opt/instantclient_10_2 exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME $source/etc/profile
4.配置tnsnames.ora(可不用配置tns)
注意tnsnames.ora其实并不存在,是要自己创建的(这个也很恶心,我一开始以为还要安装什么东东。。),我没有使用这种方式,有兴趣的可以google一下。
5.下载安装cx_Oraclepython模块
$wgethttp://downloads.sourceforge.net/project/cx-oracle/5.1.2/cx_Oracle-5.1.2-10g-py26-1.x86_64.rpm $rpm-ivhcx_Oracle-5.1.2-10g-py26-1.x86_64.rpm $ls/usr/lib/python2.6/site-packages/cx_Oracle.so#有这个文件表示安装成功,根据python的位置,也可能在其他地方,自己找一下吧
6.验证及问题解决
$python >>importcx_Oracle
若报错:importcx_OraclegaveImportError:libclntsh.so.10.1:cannotopensharedobjectfile:Nosuchfileordirectory
表示没有找到instantclient的动态库,check一下环境变量是否配置,是否生效,版本是否正确。
若报错:ImportError:./cx_Oracle.so:undefinedsymbol:PyUnicodeUCS4_Decode
Google的信息:ThereisnothingwrongwithDebian.Pythonsupportstwoincompatible modesofoperationforUnicode,UCS2(thedefault),andUCS4.Debianusesthedefault, RedhatusesUCS4.YouneedtorecompiletheextensionforUCS-2mode (i.e.usingaDebianinstallation);thiswouldfixtheundefinedsymbol:PyUnicodeUCS4_Decode
所以重新编译python
$./configure--prefix=/usr/local/python2.6.5--enable-shared-enable-unicode=ucs4 $make;makeinstall
再次验证,终于正常import了。
使用:
1.基本连接–使用Oracletnsalias
connection=cx_Oracle.connect("tp/tp@ocn_test") #查看tnsalias命令 cmd>tnspingocn_test TNSPingUtilityforLinux:Version9.2.0.8.0-Productionon27-SEP-201110:47:48 Copyright(c)1997,2006,OracleCorporation.Allrightsreserved. Usedparameterfiles: /opt/……/sqlnet.ora UsedTNSNAMESadaptertoresolvethealias Attemptingtocontact(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.20.36.19)(PORT=1520)))(CONNECT_DATA=(SID=ocntest))) OK(10msec)
2.用户输入密码连接
pwd=getpass.getpass() connection=cx_Oracle.connect("tp",pwd,"ocn_test")
3.用户直接在Python命令中输入连接账号信息,格式如pythonscript.pytp/tp@ocn_test
connection=cx_Oracle.connect(sys.argv[1])
4.使用EasyConnect语法,通过Drive连接数据库
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构成TNSNAME
tns_name=cx_Oracle.makedsn('10.20.36.19','1521','ocntest') connection=cx_Oracle.connect('tp','tp',tns_name)
6.登陆asSYSDBA
connection=cx_Oracle.connect('tp/tp@ocn_test',mode=cx_Oracle.SYSDBA) #orasSYSOPER connection=cx_Oracle.connect('tp/tp@ocn_test',mode=cx_Oracle.SYSOPER)
在Linux服务器执行Oracle操作时报了一个错误:
TNS:listenerdoesnotcurrentlyknowofservicerequestedinconnectdescriptor
解决方式:
问题分析见http://ora-12514.ora-code.com/,一番折腾,最后使用第5种连接方式,瞬间解决此问题。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!