| 最近需要写一个数据迁移脚本,将单一Oracle中的数据迁移到MySQL Sharding集群,刚好最近在学习python,就用它来练手。很快搞定了MySQL,只需要安装一个MySQLdb的python模块就可以了。但是对于Oracle客户端,不只需要安装相应的python模块(这里我用了Oracle官方的python模块——cx_Oracle),还需要安装Oracle Client,一般选择Instant Client就足够了,还需要配置tnsnames.ora(当然也可以简单的通过host:port/schema访问)。 -
 
 下面是具体步骤。
 首先确定版本。因为我们的Oracle数据是在是有点老,所以我选择了一个比较老的版本——Oracle Instant Client 10.2.0.4。一般从官方网站下载就可以了。下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。这里要严重BS Oracle,居然要先注册才能下载,这也算了,关键是注册的时候,密码居然要求有数字有字母,字母还要有大小写,还必须至少8位。逼迫我搞了一个比我银行密码还要安全的密码(好吧,现在我已经忘记我填了什么了。。)。下载的时候要特别注意,一定要下载rpm包,zip不知道是什么。下basic就可以了。forrest@Ubuntu:~/Sources$ wget http://download.Oracle.com/otn/linux/instantclient/10204/oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm
 由于是rpm包,在Ubuntu下先将其转成deb包:
 forrest@Ubuntu:~/Sources$ sudo alien Oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm
 得到Oracle-instantclient-basic_10.2.0.4-2_amd64.deb。
 可以安装了,
 forrest@Ubuntu:~/Sources$ sudo dpkg -i Oracle-instantclient-basic_10.2.0.4-2_amd64.deb
 这样会安装在默认的目录下——/usr/lib/Oracle/10.2.0.4/client64/
 forrest@Ubuntu:/usr/lib/Oracle/10.2.0.4/client64$ ls
 bin  lib
 安装完成之后,还需要暴露一些环境变量,否则会报错:
 * import cx_Oracle gave ImportError: libclntsh.so.10.1: cannot open shared object file: No such file or directory until I set LD_LIBRARY_PATH=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib/
 * conn = cx_Oracle.Connection('scott/tiger@xe') gave RuntimeError: Unable to acquire Oracle environment handle until I set ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
 forrest@Ubuntu:~/Sources$ sudo vim ~/.profile
 在最后添加如下语句:
 export Oracle_HOME=/usr/lib/oracle/10.2.0.4/client64
 export PATH=$PATH:$Oracle_HOME/bin
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Oracle_HOME/lib
 export TNS_ADMIN=$Oracle_HOME/network/admin
 注意到TNS_ADMIN所在目录其实并不存在,是要自己创建的(这个也很恶心,我一开始以为还要安装什么东东。。)
 $ sudo mkdir -p $Oracle_HOME/network/admin
 $ sudo cp tnsnames.ora $Oracle_HOME/network/admin
 如果你有安装sqlplus,此时就可以用它来测试安装是否正确了:$ sqlplus 'username/password@SID'
 不过linux下的sqlplus太烂,我没打算安装,所以留着吧,接下去安装python模块——cx_Oracle——参考Install cx_Oracle in Ubuntu(http://leojay.blog.163.com/blog/static/1739841912009101165546640/) 到SourceForge搜索cx_Oracle,根据我的python版本和要操作的数据库版本,选择了cx_Oracle-5.1-10g-py26-1.x86_64.rpm这个版本,只能说我相信高版本是向后兼容的。先试一下吧,呵呵。
 下完之后解压,将cx_Oracle.so放在dist-packages下:
 $ sudo cp cx_Oracle.so /usr/local/lib/python2.6/dist-packages/
 这样就OK了。
 写个简单的测试程序测试一下吧:
 #!bin/python
 import cx_Oracle
 conn = cx_Oracle.connect('user/passwd@sid') cursor = conn.cursor()cursor.execute("SELECT * from product_detail where product_id = 232896483")
 row = cursor.fetchone()
 print "result: ", row
 cursor.close()conn.close()
 如果没有问题应该就可以看到结果了。这时候一般会遇到这样的问题:forrest@Ubuntu:~/work/data-migration$ python Oracledb.py
 Traceback (most recent call last):
 File "Oracledb.py", line 5, in <module>
 conn = cx_Oracle.connect(''user/passwd@sid')
 cx_Oracle.DatabaseError: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
 查看一下你的/usr/lib/Oracle/10.2.0.4/client64/network/admin/tnsnames.ora配置文件,确保sid是配置正确的。
 或者直接使用host:port/schema方式:
 conn = cx_Oracle.connect('user/passwd@host:port/schema')
 如果有其他问题,可以在/usr/lib/Oracle/10.2.0.4/client64/network/admin下添加一个sqlnet.ora文件,以trace方式运行:
 If for some reason you have some trouble connecting, you can create a sqlnet.ora file under $Oracle_HOME with some tracing options.
 $ sudo vi $Oracle_HOME/network/admin/sqlnet.ora
 TRACE_DIRECTORY_CLIENT=/tmp
 TRACE_LEVEL_CLIENT=SUPPORT
 The next time the Oracle Instant Client is used, it will create a detailed log file under /tmp like the following: cli_1968.trc. Make sure to turn this option off when you are done as the logfile can get quite large!
 PS:目前看来cx_Oracle还是有向下兼容的。希望如此,搞个环境比写个程序麻烦多了 本文出自:亿恩科技【www.enkj.com】
 
 
		服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM] |