您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > sqluldr2超详细使用教程-loracle数据导出工具及方法
作者:楼方鑫(网名:d.c.b.a)个人主页:作者:楼方鑫(网名:d.c.b.a)个人主页:文本导出文本导出文本导出文本导出将数据导出成文本文件,在其他数据库(如Sybase、SQLServer、MySQL)中看起来是一件很容易的事,因为有官方的类似工具(bcp)或命令(SELECTINTO和LOADDATA),但在Oracle数据库上要做好这件事情却并非易事,Oracle即没有这样的工具,也没有提供这样的命令,因此经常看到论坛上有人在问如何将Oracle的数据快速导出成文本。回想起从大学毕业从事IT行业开始到现在,在许多项目中都遇到了这样的需求,也用过数种不同的语言(Java、PowerBuilder、Perl等)来实现过这个功能,但以前已经实现的每一种都不是最佳的,始终有些缺憾。刚毕业时当程序员,第一年用Developer2000,面对的所有数据库都是Oracle,没有文本导出要求,学会了Oracle的导入导出(exp/imp)功能。第二年用PowerBuilder,面对的数据库就有Oracle和Sybase,就遇到过文本导出的需求,用PowerBuilder的数据管道实现过,都是结合在具体项目中使用,单独用的很少,也不方便,为了一个文本导出功能需要一个很大的运行环境,并且速度也不快。后来Java流行,用JDBC实现了一个,算是比较轻量级的了,基本上Java的运行环境哪儿都有,在测试速度时,发现与OCI程序比要达到同样的速度,运行Java程序的机器上多耗了四倍的CPU,也就是用Java版本的文本导出程序常常让客户端的CPU跑满,因此无法面对更大量(上GB)的数据导出。开始做专职的DBA后,一开始也在找能实现文本导出的好工具,和许多DBA一样在asktom.oracle.com上找到了TomKyte写的两个脚本,一个是用SQL*Plus的spool功能来实现的,另一个是用Pro*C语言来写的程序。用spool实现的不是很喜欢,第一速度不快,第二个不能指定任意字段分隔符,及记录分隔符。Pro*C版本的在性能上很好,但在灵活性上,还是比较差,要实现当时想到的需求,一样要改源程序,并且用Pro*C的程序在编译后很难跨版本通用,而这一点我比较看重,于是就想到以这个高效程序为样本,写一个更灵活通用的文本导出程序。刚好对C语言及OracleCallInterface产生了一些兴趣,就拿这个任务来练手吧。没有想到的是,为了这么一个小工具,前前后后五六年了,还在不停地维护,根据不同用户提出的改进需求完善程序,是当时没有始料到的事情。当然在整个过程中,得到了很多人的感谢邮件,而我自已也体会到坚持的乐趣,也让我对更多的事情多一分坚持。作者:楼方鑫(网名:d.c.b.a)个人主页:作者:楼方鑫(网名:d.c.b.a)个人主页:文本导出程序,已被大众使用三年多了,有几千国内外DBA在使用它或使用过它,并在使用的过程中提出了宝贵实用的改进意见,在完善了众多真实客户的需求后,最终形成了现在的稳定版本。Oracle有一个工具叫SQL*Loader(sqlldr)是用来将文本文件装载到数据库中的,而我的工具是用来将Oracle中的数据导出成文本的,因此取名为SQL*UnLoader(sqluldr),而最后的2是因为第一版是用OCI7接口写的,而现在发布的是用OCI8接口重写的,是第二代的意思。学会这样的好工具,在一定的场合可以让DBA的某些工作做得更轻松自在。文本方式有什么作用?文本方式是不同类型数据库数据交换的重要方式,从小的地方说,例如将一些Oracle性能数据收集到MySQL中,进行分析和展示;从大的地方讲,sqluldr2曾被用来在Oracle系统中导出大批量的数据,然后装载到数据仓库(NCR或SybaseIQ)中。阿里巴巴(Alibaba)集团的DBA几年前就开始用sqluldr从生产系统中导出巨量数据给数据仓库分析,并在真实应用环境下创下了我所见过的文本导出速度的最高记录,总共用了595秒钟导出了171135273条记录,平均每秒287622条记录。或者用在不同字符集的同种数据库之间进行数据交换,如US7ASCII字符集的Oracle数据库和ZHS16GBK字符集的Oracle数据库进行中文信息交换,这时DatabaseLink是不行的。在某些系统中为了防止软件版本变迁的问题,而选择用最简可靠的文本方式来归档和永久保存历史数据。最近也有不少人用sqluldr2来快速将数据导出成文本,为GreenPlum这样的海量数据分析处理系统提供数据。也有做搜索的,结合sqluldr的早期源代码,结合到商品搜索引挚的数据dump程序中。也有人整合sqluldr的早期源代码到普通数据库与内存数据库的数据同步程序中。更有国外的工程师,发邮件来谢谢我免费发布这个小工具,说这个工具被成功地用于某些项目中,帮他们解决了数据迁移的问题。从个人网站的统计来看,源代码和预编译好的可执行文件的累计下载量已经突破了20000大关。Sqluldr2工具的主要优点如下:用Oracle的C语言接口写成,短小精干,运行速度快。0rowsexportedat2007-11-2815:43:09171135273rowsexportedat2007-11-2815:53:04作者:楼方鑫(网名:d.c.b.a)个人主页:作者:楼方鑫(网名:d.c.b.a)个人主页:可指定任意字段分隔符与记录分隔符,分隔符不一定是可见的字符。可自动生成SQL*Loader的控制文件,方便在其他Oracle库上进行导入。丰富的性能调整及功能选项,简化了调优任务。可根据运行返回值确定是否成功执行导出任务,有利于用脚本来处理。用标准C语言写成,多个平台编译执行,如Windows/Linux/AIX/Solaris/HPUX等。直接导出数据到GZIP格式的压缩文件中,降低磁盘空间,节给成本。口令加密功能,降底脚本调度中的安全风险。将数据导出成MySQL或Oracle数据库上的Insert语句,而非文本文件。当然sqluldr2也有缺点,曾经有人在写邮件问,为什么鼠标双击,只看见窗口一闪,就退出了,那是因为这个程序不是图形界面(GUI)的。对于大部份终端用户来讲,它是非图形化的命令行工具,没有导出向导功能而显得不太好用(有国内用户提了这个需求),但不同平台下的图形编程环境不一样,要支持不容易,有时间会研究一下QT的图形界面,这样可以做到平台通用。但这刚好成就了两个比较专业优点,可以在多个平台编译和执行(Windows,Linux,AIX,Solaris,HPUX等),也容易嵌入在其他的脚本中,如Shell或Perl中,或其他编程语言(如Java,来自国内的感谢邮件中看到的)中,只要用几次后,就会习惯它了。软件下载软件下载软件下载软件下载可以访问如下连接获得部份平台的可执行程序和早期源代码:最新软件下载:早期源码下载:使用方法使用方法使用方法使用方法进入到命令行中,如Windows的DOS命令窗口,或Linux/Unix的Shell窗口,通过各种命令行参数来告诉sqluldr2要做什么,不带任何参数运行sqludlr2就可以获得命令行的帮助:作者:楼方鑫(网名:d.c.b.a)个人主页:作者:楼方鑫(网名:d.c.b.a)个人主页:至少要传入两个参数,数据库登录信息和SQL查询语句,例如:SQL*UnLoader:FastOracleTextUnloader(GZIP),Release3.0.1(@)CopyrightLouFangxin2004/2009,allrightsreserved.DonationtoAliPay(anysql@yahoo.com)orPayPal(anysql@live.com).Usage:SQLULDR2keyword=value[,keyword=value,...]ValidKeywords:user=username/password@tnsnamesql=SQLfilenamequery=selectstatementfield=seperatorstringbetweenfieldsrecord=seperatorstringbetweenrecordshead=printrowheader(Yes|No)file=outputfilename(default:uldrdata.txt)read=setDB_FILE_MULTIBLOCK_READ_COUNTatsessionlevelsort=setSORT_AREA_SIZEatsessionlevel(UNIT:MB)hash=setHASH_AREA_SIZEatsessionlevel(UNIT:MB)serial=set_serial_direct_readtoTRUEatsessionleveltrace=setevent10046togivenlevelatsessionleveltable=tablenameinthesqlldrcontrolfilecontrol=sqlldrcontrolfileandpath.mode=sqlldroption,INSERTorAPPENDorREPLACEorTRUNCATElog=logfilename,prefixwith+toappendmodelong=maximumlongfieldsizearray=arrayfetchsizebuffer=sqlldrREADSIZEandBINDSIZE,default16(MB)width=customizedmaxcolumnwidth(w1:w2:...)quote=optionalquotestringrows=printprogressforeverygivenrows(default,1000000)data=disablerealdataunload(NO,OFF)parfile=readcommandoptionfromparameterfilealter=altersessionSQLstobeexecutebeforeunloadsafe=uselargebuffertoavoidORA-24345error(Yes|No)crypt=useencryptedconnecitonstring(Yes|No)sedf/t=enablecharactertranslationfunctionnull=replacenullwithgivenvalueescape=escapecharforMySQLdatabaseformat=MYSQL:MySQLInsertSQLs,SQL:InsertSQLs.forfieldandrecord,youcanuse'0x'tospecifyhexcharactercode,\r=0x0d\n=0x0a|=0x7c,=0x2c,\t=0x09,:=0x3a,#=0x23,=0x22作者:楼方鑫(网名:d.c.b.a)个人主页:作者:楼方鑫(网名:d.c.b.a)个人主页:语句来实现,如果是整表导出,则可以很方便地只指定一个表名,如第二条命令所示。要使用其基本功
本文标题:sqluldr2超详细使用教程-loracle数据导出工具及方法
链接地址:https://www.777doc.com/doc-4620910 .html