暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

使用ociuldr工具实现快速卸载和加载数据

原创 eygle 2019-12-09
1559

怎样将数据卸载为通用格式呢?很多朋友通过select查询spool为文本文件,这种方式无疑效率很差,而且不够方便。

网友DCBA曾经开发了一个小工具──ociuldr(后经过改写更名为sqluldr2),可用于将Oracle数据转储出来,非常简单高效,而且开源。通过ociuldr转储的数据,可以很容易用SQLLDR加载入数据库,两者结合使用,效果非凡。

本文将简要介绍一个这个小工具的使用方法。

先通过以下测试,来熟悉一下这个工具的用法。

卸载命令很简单,通过table参数还可以自动生成用于SQLLDR的控制文件:

D:\>ociuldr user=scott/tiger@eygle2 query="select * from emp" file=emp.txt table=empt

       0 rows exported at 2007-04-23 17:16:32
      14 rows exported at 2007-04-23 17:16:32
         output file emp.txt closed at 14 rows.

检查一下生成的数据文本:

D:\>type emp.txt
7369,SMITH,CLERK,7902,17-12月-80,800,,20
7499,ALLEN,SALESMAN,7698,20-2月 -81,1600,300,30
7521,WARD,SALESMAN,7698,22-2月 -81,1250,500,30
7566,JONES,MANAGER,7839,02-4月 -81,2975,,20
7654,MARTIN,SALESMAN,7698,28-9月 -81,1250,1400,30
7698,BLAKE,MANAGER,7839,01-5月 -81,2850,,30
7782,CLARK,MANAGER,7839,09-6月 -81,2450,,10
7788,SCOTT,ANALYST,7566,19-4月 -87,3000,,20
7839,KING,PRESIDENT,,17-11月-81,5000,,10
7844,TURNER,SALESMAN,7698,08-9月 -81,1500,0,30
7876,ADAMS,CLERK,7788,23-5月 -87,1100,,20
7900,JAMES,CLERK,7698,03-12月-81,950,,30
7902,FORD,ANALYST,7566,03-12月-81,3000,,20
7934,MILLER,CLERK,7782,23-1月 -82,1300,,10

再看看自动生成的控制文件:

D:\>type empt_sqlldr.ctl
--
-- Generated by OCIULDR
--
OPTIONS(BINDSIZE=4194304,READSIZE=4194304,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'emp.txt' "STR X'0a'"
INTO TABLE empt
FIELDS TERMINATED BY X'2c' TRAILING NULLCOLS
(
  EMPNO CHAR(40),
  ENAME CHAR(10),
  JOB CHAR(9),
  MGR CHAR(40),
  HIREDATE DATE "YYYY-MM-DD HH24:MI:SS",
  SAL CHAR(40),
  COMM CHAR(40),
  DEPTNO CHAR(40)
)

可以尝试使用这个控制文件将数据加载到数据库中。
首先在数据库中创建好测试表:

SQL> create table empt as select * from emp where 1=0;
表已创建。

通过sqlldr加载这个文件:

D:\> sqlldr scott/tiger@eygle2 control=empt_sqlldr.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on 星期二 2月 27 16:01:24 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.

达到提交点 - 逻辑记录计数 14

这样数据就加载进入了数据库中。对于大数据表的导出ociuldr工具还支持按照不同的批量导出数据,这通过一个参数batch来实现,默认一个batch是50万条记录,如果指定batch为2就表示100万条记录换一个文件,默认这个选项值是0,就是指不生成多个文件。

在指定batch选项后,需要指定file选项来定义生成的文件名,文件名中间需要包含"%d"字样,在生成文件时,"%d"会被打印成序号,请看以下一个测试:

SQL> SELECT COUNT(*) FROM T_OBJID;
  COUNT(*)
----------
   2430720 

用如下命令进行导出,观查log输出:

C:\TEMP>ociuldr user=anysql/anysql query="select * from t_objid" batch=2 file=test_%d.txt

       0 rows exported at 2006-11-23 21:09:19
  500000 rows exported at 2006-11-23 21:09:20
1000000 rows exported at 2006-11-23 21:09:21
         output file test_1.txt closed at 1000000 rows.
  500000 rows exported at 2006-11-23 21:09:21
1000000 rows exported at 2006-11-23 21:09:22
         output file test_2.txt closed at 1000000 rows.
  430720 rows exported at 2006-11-23 21:09:22
         output file test_3.txt closed at 430720 rows.

这个小工具及其源码可以从DCBA的网站下载:
下载链接:http://www.anysql.net/software/ociuldr.zip
也被包含在eygle博客的源码包中:
下载链接:http://www.eygle.com/orabk/step.by.step.oracle.script.zip

关键字:
SQLLDR,外部表,可写外部表,writeable external tables

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论