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就可以了。
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 #直接放到动态库搜索路径中,不需要额外的环境配置 或 $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其实并不存在,是要自己创建的(这个也很恶心,我一开始以为还要安装什么东东。。),我没有使用这种方式,有兴趣的可以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 #有这个文件表示安装成功,根据python的位置,也可能在其他地方,自己找一下吧 |
6.验证及问题解决
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的动态库,check一下环境变量是否配置,是否生效,版本是否正确。
若报错: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 |
再次验证,终于正常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连接数据库
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构成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服务器执行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