Oracle数据库备份与恢复(2):SQL*Loader(一)

2014-11-24 14:57:19 · 作者: · 浏览: 1

一、基本知识

  Oracle 的 SQL* LOADER 可以将外部格式化的文本数据加载到数据库表中。通常 与 SPOOL导出文本数据方法配合使用。

  1、命令格式

  SQLLDR keyword=value [,keyword=value,……]

  例:$ sqlldr user/pwd control=emp.ctl data=emp.dat bad=emp.bad log=emp.log

  2、控制文件

  SQL*LOADER 根据控制文件可以找到需要加载的数据。并且分析和解释这些数据。

  控制文件由三个部分组成,具体参数参考帮助文档:1. 全局选件,行,跳过的记录数等;2. INFILE 子句指定的输入数据;3. 数据特性说明。

  comment: ――注释

  例:

  load data infile *

  append ――除了 append外,还有 insert、replace、truncate等方式

  into table emp fields terminated b y ‘|’

  (

  no float external, name char(20),

  age integer external,

  duty char(1),salary float external,

  upd_ts date(14) ‘YYYYMMDDHH24MISS’)

  begindata

  100000000003|Mulder|000020|1|000000005000|20020101000000

  100000000004|Scully|000025|2|000000008000|20020101235959

  控制文件中infile选项跟sqlldr 命令行中data 选项含义相同,如使用infile *则表明数据在本控制文件以 begin data 开头的区域内。 一些选项:FIELDS TERMINATED BY WHITESPACE FIELDS TERMINATED BY x09 FILLER_1 FILLER, // 指定某一列将不会被装载

  DEPTNO position(1:2), DNAME position(*:16), // 指定列的位置SEQNO RECNUM //载入每行的行号

  SKIP n // 指定导入时可以跳过多少行数据

  3、数据文件

  按控制文件数据格式定义的数据行集,

  例:

  100000000001|Tom|000020|1|000000005000|20020101000000

  100000000002|Jerry|000025|2|000000008000|20020101235959

  固定格式、可变格式、流记录格式:

  固定格式:

  当数据固定的格式(长度一样)时且是在文件中得到时,要用 INFILE "fix n"

  load data

  infile example.dat "fix 11"

  into table example

  fields terminated b y , optionally enclosed by "

  (col1 char(5), col2 char(7)) example.dat:

  001, cd, 0002,fghi,

  00003,lmn,

  1, "pqrs",

  0005,uvwx,

  可变格式:

  当数据是可变格式(长度不一样)时且是在文件中得到时,要用 INFILE "var n".如:

  load data

  infile example.dat "var 3"

  into table example

  fields terminated b y , optionally enclosed by "

  (col1 char(5), col2 char(7)) example.dat:

  009hello,cd,010world,im,

  012my,name is,

  流记录格式: // Stream-recored format:load data infile xx.dat "str | "

  into table xx field terminated b y , optionally enclosed by "

  (col1 char(5), col2 char(7))

  example.dat:

  hello, ccd,|

  world, bb,|

  4、坏文件

  bad=emp.bad坏文件包含那些被 SQL*Loader拒绝的记录。被拒绝的记录可能是不符合要求的记录。

  5、日志文件及日志信息

  log=emp.log当 SQL*Loader 开始执行后,它就自动建立 日志文件。日志文件包含有加载的总 结,加载中的错误信息等。

 二、高级选项

  1、Conventional Path Load与Direct Path Load

  Conventional-path Load:通过常规通道方式上载。

  特点:commit, always gen redo logs, enforce all constraints, fire insert triggers, can load into cluster, other user can make change

  rows:每次提交的记录数

  bindsize:每次提交记录的缓冲区

  readsize:与 bindsize 成对使用,其中较小者会自动调整到较大者

  sqlldr 先计算单条记录长度,乘以 rows,如小于 bindsize,不会试图扩张,rows以填充 bindsize;如超出,则以 bindsize 为准。 命令为:

  $ sqlldr dbuser/oracle control=emp.ctl log=emp.log rows=10000 bindsize=8192000

  Direct-Path Load:

  通过直通方式上载,可以跳过数据库的相关逻辑,不进行 SQL解析,而直接将数 据导入到数据文件中。

  特点:save, conditionly gen redo logs, enforce PK UK NN, not fire triggers, can not load into cluster, other user can not make change命令为:

  $ sqlldr dbuser/oracle control=emp.ctl log=emp.log direct=true

  2、SPOOL导出文本数据方法

  导入的数据文件可以用 SPOOL导出文本数据方法生成。

  SQL*PLUS环境设置

  SET NEWPAGE NONE HEADING OFF SPACE 0

  PAGESIZE 0 SET TRIMOUT ON TRIMSPOOL ON LINESIZE 2500

  注:LINESIZE 要稍微设置大些,免得数据被截断,它应和相应的 TRIMSPOOL结合使用防止导出的文本有太多的尾部空格。

  但是如果 LINESIZE 设置太大,会大大降低导出的速度,另外在 WINDOWS下导 出最好不要用 PLSQL导出,速度比较慢,直接用 COMMEND 下的 SQLPLUS命令最 小化窗口执行。对于字段内包含很多回车换行符的应该给与过滤,形成比较规矩的文本 文件。

  通常情况下,我们使用 SPOOL方法,将数据库中的表导出为文本文件,如下述:

  set trimspool on

  set linesize 120 pagesize 2000 newpage 1 heading off term off spool 路径+文件名

  select col1||,||col2||,||col3||,||col4||…… fr