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