官方说法:Sqluldr2(SQL * UnLoader 第二版)是一个灵活与强大的 Oracle 文本导出程序。linux
可能不少人对它不是很熟悉,虽然是很小的一个工具,可是功能比较完善,全部我都想到的需求,它都能提供。sql
尤为是支持linux下的管道和返回状态,简直太棒了。bash
sqluldr2 scott/tiger … file=- | sqlldr control=…
如上所示,在从 Oracle 向 Oracle 迁移数据时,简单高效,切实的解决了用户的痛点。工具
另外还支持根据条数或者大小分割处处文件。例如每100万条数据存放一个文件或者限制每一个文件为1G。优化
还支持口令加密加密,GZIP压缩,SQL * Loader 的控制文件,针对MySQL特殊优化,简直不能更贴心了。加密
具体用法你们参考官方文档:http://www.onexsoft.com/software/sqluldr2.pdfcode
本文旨在解决另一个问题,在将数据导成文件时,若是字段中包含回车或者换行,就会破坏数据格式,致使数据无法正常导入。文档
最简单的解决方法就是在查询SQL中将回车换行符替换掉get
select replace(replace(column,chr(10),''),chr(15),'') from TABLE_NAME;
可是我的感受这种方法不是很好,由于你不知道哪些字段可能包含回车和换行,挨个字段去replace也比较麻烦,这里提供另一种解决方法,指定回车换行符以外的记录分隔符。通常在GBK字符集下,我用0x06来看成换行符。所以,在用sqluldr2到出数据时,须要设置record参数。it
sqluldr2 scott/tiger sql=emp.sql record=0x06
同时,在用sqlldr导入时,须要ctl控制文件中配置记录分割符号
load data INFILE * "STR X'06'"
这样就能够正常导出导入了。
可是这样作也有一个问题,sqlldr导入失败时候产生的bad文件,因为记录分割符不能正常换行,所以没法直观的看出哪一行数据出错了,很头疼(我以为能够在UltraEdit下转换成16进制,再将0x06替换成换行,有时间验证下)。