Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1828146
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: Oracle

2012-05-10 10:37:57

[ORACLE]sqlldr导入和spool导出  在ORACLE数据库中,导入数据时,有个非常好用的工具:sqlldr;导出数据时,可以用spool方法。下面总结自己使用的方法。

1)sqlldr

sqlldr的说明:$ sqlldr

SQL*Loader: Release 9.2.0.4.0 - Production on Tue Feb 24 11:46:20 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Usage: SQLLDR keyword=value [,keyword=value,...]

Valid Keywords:

    userid -- ORACLE username/password           
   control -- Control file name                  
       log -- Log file name                      
       bad -- Bad file name                      
      data -- Data file name                     
   discard -- Discard file name                  
discardmax -- Number of discards to allow          (Default all)
      skip -- Number of logical records to skip    (Default 0)
      load -- Number of logical records to load    (Default all)
    errors -- Number of errors to allow            (Default 50)
      rows -- Number of rows in conventional path bind array or between direct path data saves
               (Default: Conventional path 64, Direct path all)
  bindsize -- Size of conventional path bind array in bytes  (Default 256000)
    silent -- Suppress messages during run (header,feedback,errors,discards,partitions)
    direct -- use direct path                      (Default FALSE)
   parfile -- parameter file: name of file that contains parameter specifications
  parallel -- do parallel load                     (Default FALSE)
      file -- File to allocate extents from      
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions  (Default FALSE)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable  (Default FALSE)
commit_discontinued -- commit loaded rows when load is discontinued  (Default FALSE)
  readsize -- Size of Read buffer                  (Default 1048576)
external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE  (Default NOT_USED)
columnarrayrows -- Number of rows for direct path column array  (Default 5000)
streamsize -- Size of direct path stream buffer in bytes  (Default 256000)
multithreading -- use multithreading in direct path  
 resumable -- enable or disable resumable for current session  (Default FALSE)
resumable_name -- text string to help identify resumable statement 
resumable_timeout -- wait time (in seconds) for RESUMABLE  (Default 7200)
date_cache -- size (in entries) of date conversion cache  (Default 1000)

PLEASE NOTE: Command-line parameters may be specified either by
position or by keywords.  An example of the former case is 'sqlldr
scott/tiger foo'; an example of the latter is 'sqlldr control=foo
userid=scott/tiger'.  One may specify parameters by position before
but not after parameters specified by keywords.  For example,
'sqlldr scott/tiger control=foo logfile=log' is allowed, but
'sqlldr scott/tiger control=foo log' is not, even though the
position of the parameter 'log' is correct.

使用sqlldr,第一步是先建立一个控制文件,后缀名为 .ctl。使用的时候有些东西我并不理解,从网上找来了注释。

$ cat test_sqlldr_ctl_file.ctl 
LOAD DATA CHARACTERSET zhs16cgb231280
infile "/home/test/test_sqlldr_file.bak"   --导入数据库的文件
into table test_sqlldr_table APPEND   --导入的数据库表
fields terminated by ','      --导入文件中,字段分隔符号
(
   field1,
   field2
)

建立好控制文件之后,接下来就是调用sqlldr了。以下是一个调用的例子。

$ sqlldr  control='/home/test/test_sqlldr_ctl_file.ctl' Direct=true errors=3 log='/home/test/test_sqlldr.log' bad='/home/test/test_sqlldr.bad'

说明:   -- 数据库的用户/密码@数据库名

control='...'   --控制文件的存放路径

Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的性能

log='...'   --入库日志的全路径

bad='...'  --入库失败记录的全路径

 参考:http://www.blogjava.net/Unmi/archive/2009/01/05/249956.html  --关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

 

2)spool方法

导出数据时,如果用plsql导,数据的记录如果太大,速度慢的影响就会很明显,我们可以用spool方法。

spool常用的设置
set colsep' ';    //域输出分隔符
set echo off;    //显示start启动的脚本中的每个sql命令,缺省为on
set feedback off;  //回显本次sql命令处理的记录条数,缺省为on
set heading off;   //输出域标题,缺省为on
set pagesize 0;   //输出每页行数,缺省为24,为了避免分页,可设定为0。
set termout off;   //显示脚本中的命令的执行结果,缺省为on
set trimout on;   //去除标准输出每行的拖尾空格,缺省为off
set trimspool on;  //去除重定向(spool)输出每行的拖尾空格,缺省为off

以下是我的例子:第一步是写一个sql的文件,里面是spool的各种配置信息

$ cat test_spool.sql
set feedback off
set heading off
set termout off
set pagesize 0
set linesize 150
set verify off
set echo off
spool /home/test/test_spool_out_file.sql    --spool输出的文件
select field1||'|'||field2 from test_spool;
spool off

第二步是写一个脚本,包括有连接的数据库信息等,例子如下:

$ cat test_spool.sh
/home/oracle_app/bin/sqlplus test_user/test_pass << eof
@/home/test/test_spool.sql
exit;
eof

第三步是曾加test_spool.sh的执行权限,并执行test_spool.sh

$ chmod +x test_spool.sh

$./test_spool.sh

这里只介绍了spool的一种用法,另外还有其他的方法和设置,不过从网上的介绍来看,这个方法是比较好的,另外的方法的的主要区别是在sql语句的写法上,还增加了域分隔符的设置而已,出错概率高一些。

参考:Oracle spool 用法小结 

 ===================

sqlldr控制文件范例

目前控制文件如下:
Load data
infile 'impfile.txt'
BADFILE 'loadbad'
REPLACE
into table TBName
FIELDS TERMINATED BY '

阅读(2187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~