linux将文件内容写入oracle,通过Python脚本将DMP文件写入AWS RDS Oracle中

该文章详细介绍了如何在Oracle RDS不支持SSH和FTP的情况下,利用UTL_FILE包和Python脚本来实现本地DMP文件上传到RDS的过程。通过在RDS中创建空文件,然后利用Python读取本地文件并分块写入,从而规避网络和安全限制。文中还提到了如何将写入过程封装为RDS的函数,以提高效率。
摘要由CSDN通过智能技术生成

由于RDS(Oracle)不直接支持SSH,FTP(基于安全因素吧).所以原有系统expdp或exp出来的dmp文件,不能直接导入到RDS中。官方文档里建议通过networklink或者dblink的方式 从原有数据库迁移到RDS,考虑到网络和安全因素,此方法暂被忽略掉。

查找各种文档发现,可以通过Oracle自身的UTL_FILE包来写dmp文件到RDS的文件夹里,读取EC2里的本地文件部分通过Python脚本实现,这样变相实现了,从EC2本地上传到RDS的功能。

代码如下:

def cpy_to_rds():

file_name = 'test4.dmp'

src_name = 'c:/testdata/test4.dmp'

#在RDS,DATA_PUMP_DIR下新建或者覆盖一个空文件

UTL_FILE_NEW_FILE = "DECLARE fi UTL_FILE.FILE_TYPE; BEGIN fi:=UTL_FILE.fopen('DATA_PUMP_DIR','{0}','wb',32766); UTL_FILE.fclose(fi); END;"

#写入RDS

UTL_FILE_CREATE_FILE = "DECLARE " \

"fi UTL_FILE.FILE_TYPE; " \

"v_buffer RAW(32760); " \

"BEGIN " \

"v_buffer:= hextoraw('{1}') ; " \

"fi:=UTL_FILE.fopen('DATA_PUMP_DIR','{0}','ab');" \

"UTL_FILE.put_raw(fi,v_buffer);" \

"UTL_FILE.fclose(fi); " \

"END;"

con = cx_Oracle.connect('User/Password@SID')

cur = con.cursor()

# 在RDS,DATA_PUMP_DIR下新建或者覆盖一个空文件

cur.execute(UTL_FILE_NEW_FILE.format(file_name))

chunk = 3000

f = open(src_name, 'rb')

line = f.read(chunk)

# 写入RDS

cur.execute(UTL_FILE_CREATE_FILE.format(file_name, line.hex()))

while (len(line)) > 0:

line = f.read(chunk)

# 写入RDS

cur.execute(UTL_FILE_CREATE_FILE.format(file_name, line.hex()))

cur.close()

con.close()

需要注意的是chunk设置不能为32760。

UTL_FILE_CREATE_FILE语句也可以转换为RDS中的一个Function函数:

create or replace function gen_dmp(i_name IN VARCHAR2, i_buffer IN RAW ) return varchar2 is

begin

declare

v_file  utl_file.file_type;

begin

v_file:=utl_file.fopen('DATA_PUMP_DIR',i_name,'ab');

utl_file.put_raw(v_file,i_buffer);

utl_file.fclose(v_file);

return 'OK';

end;

end;

在Python中调用此函数,这样chunk就可以设置到32767最大值了.

def cpy_to_rds_func():

file_name = 'tes4.dmp'

src_name = 'c:/testdata/test4.dmp'

UTL_FILE_NEW_FILE = "DECLARE fi UTL_FILE.FILE_TYPE; BEGIN fi:=UTL_FILE.fopen('DATA_PUMP_DIR','{0}','wb',32766); UTL_FILE.fclose(fi); END;"

con = cx_Oracle.connect('User/Password@SID')

cur = con.cursor()

cur.execute(UTL_FILE_NEW_FILE.format(file_name))

chunk = 32760

f = open(src_name, 'rb')

line = f.read(chunk)

cur.callfunc('gen_dmp', cx_Oracle.STRING, (file_name, line))

while (len(line)) > 0:

line = f.read(chunk)

cur.callfunc('gen_dmp', cx_Oracle.STRING, (file_name, line))

cur.close()

con.close()

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值