官方說法: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替換成換行,有時間驗證下)。