sqluldr2导出的几个问题

根据实际生产需要我们要吧Oracle数据迁移到mariadb中,因为oracle数据量比较大,因此我们选用sqludr2这个工具进行导出,现将在使用过程中遇到的一些问题进行总结。

我们使用的导出命令是:

./sqluldr2_linux64_10204.bin scott/scott@127.0.0.1:1521/formariadb query=student field=0x01 record=0x02 file=fun.txt

在使用该工具时需要先安装oracle,所有操作至少要有oracle客户端。

其次因为我是使用python写的脚本,因此该服务器还需要安装python3

再次在通过脚本执行导出时需要用到cx_Oracle插件,因此这个插件也是必须要先安装的。

根据设置的配置文件,对导出命令进行拼接:

uldr_cmd = f"./sqluldr2_linux64_10204.bin \'{ora_user}/\"{ora_pwd}\"\'@{ora_url}" + \

            f" field=0x{self.field_sep} record=0x{self.line_sep} batch=yes rows=1000000 lob=FILE" + \

            f" query=\"{query}\" mode=truncate table={tableName} control='../ctl/{tableName}.ctl' file='{EXPORT_DATA_DIR}{tableName}-%B.txt'"

       

拼接时遇到起数据库密码带有特殊字符,在执行时总会出现问题,因此我们在测试时针对这个密码做特殊处理,使用了3种方法:

1.这种针对的是密码中带有“_”,”(“,”-“,”$”,“@”因为我密码中这几个特殊字符都有,我并不确定究竟是那个字符引起的。

 ./sqluldr2_linux64_10204.bin 'scott/"scott"'@127.0.0.1:1521/formariadb query=student field=0x01 record=0x02 file=fun.txt

2. 这种针对的是密码中带有”#”,”,” ,”)”,“@”因为我密码中这几个特殊字符都有,我并不确定究竟是那个字符引起的。

 ./sqluldr2_linux64_10204.bin scott/"""scott"""@127.0.0.1:1521/formariadb query=student field=0x01 record=0x02 file=fun.txt

3.  这种针对的是密码中带有”#”,”[” ,”%” ,” )”,”(“,“@”因为我密码中这几个特殊字符都有,我并不确定究竟是那个字符引起的。

 ./sqluldr2_linux64_10204.bin scott/"scott"@127.0.0.1:1521/ formariadb query="select * from student;" field=0x01 record=0x02 mode=APPEND batch=yes rows=1000000 lob=FILE file=fun.txt;

如果有遇到这个导出命令中的密码有特殊字符,可以这几种方法都试下,如果都是普通字符这个引号也是可以不要的。

Query这个参数我是直接读取的一个配置文件,这文件里面写的是一组sql,如:select * from student;一条语句一行,这个在脚本里面进行了解析,读取出正确的表名,主要是因为除了从oracle导出后还需要即时将导出的数据导入到mariadb数据库中。

如果是导入到oracle数据库的话我们也可以利用sqlldr进行导入。

如:sqlldr scott/scott@127.0.0.1:11521/orcl control=student.ctl

其中control=student.ctl中的这个文件是sqluldr2导出的一个文件,我们可以将这个.ctl和导出的数据文件配合使用进行导入,注意这个地方导入时要注意数据文件的位置,文件名,以及导入方式(导出方式由导出时设置的mode决定)。

另外因为我两个数据库的字符集不太一样,在ctl文件中也进行了处理。在load data 下面增加了一行设置字符集

在实际导入的过程中我们发现一个问题,原来数据库中的null字段导入后变成了空字符串,而且日期字段在导入mariadb后变成了0000-00-00 00:00:00的格式,程序在某些地方使用到这个日期字段的时候就会报错,为此经过大量的测试与修改发现我们只需要在导出的时候将NULL赋值为\N即可。对于默认的FIELDS和LINES值,NULL被写为输出的\N字段值,而\N字段值被读为输入的NULL。

上述导出命令就变成了uldr_cmd = f"./sqluldr2_linux64_10204.bin \'{ora_user}/\"{ora_pwd}\"\'@{ora_url}" + \
            f" field=0x{self.field_sep} record=0x{self.line_sep} charset=GBK safe=yes batch=yes rows=1000000 lob=FILE" + \
            f" query=\"{query}\" NULL=\\\\N mode=truncate table={tableName}  file='{EXPORT_DATA_DIR}{tableName}-%B.txt'"

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值