`

Oracle sqlldr使用

 
阅读更多
Oracle SQLLDR用法


SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据
仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。

SQLLDR的有效关键字

有效的关键字:

    userid -- ORACLE 用户名/口令
   control -- 控制文件名
       log -- 日志文件名
       bad -- 错误文件名(文件中包含由于错误拒绝的数据记录,比如错误的数据类型或者完整性约束)
      data -- 数据文件名
   discard -- 废弃文件名 (文件中包含被控制文件中的过滤语句过滤掉的记录)
discardmax -- 允许废弃的文件的数目         (全部默认)
      skip -- 要跳过的逻辑记录的数目  (默认 0)
      load -- 要加载的逻辑记录的数目  (全部默认)
    errors -- 允许的错误的数目         (默认 50)
      rows -- 常规路径绑定数组中或直接路径保存数据间的行数 (默认: 常规路径 64, 所有行数直接路径)(这里的ROWS在直接路径中貌似只在信息输出中显示逻辑记录计数,但不提交貌似)          
  bindsize -- 常规路径绑定数组的大小 (以字节计)  (默认 256000)
    silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
    direct -- 使用直接路径                     (默认 FALSE)
   parfile -- 参数文件: 包含参数说明的文件的名称
  parallel -- 执行并行加载                    (默认 FALSE)
      file -- 要从以下对象中分配区的文件
skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区  (默认 FALSE)
skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用  (默认 FALSE)
commit_discontinued -- 提交加载中断时已加载的行  (默认 FALSE)
  readsize -- 读取缓冲区的大小               (默认 1048576)
external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE  (默认 NOT_USED)
columnarrayrows -- 直接路径列数组的行数  (默认 5000)
streamsize -- 直接路径流缓冲区的大小 (以字节计)  (默认 256000)
multithreading -- 在直接路径中使用多线程
 resumable -- 启用或禁用当前的可恢复会话  (默认 FALSE)
resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计)  (默认 7200)
date_cache -- 日期转换高速缓存的大小 (以条目计)  (默认 1000)

--来看个实例,result.csv为数据文件

result.csv内容:

1,默认 Web 站点,192.168.2.254:80:,RUNNING
2,other,192.168.2.254:80:test.com,STOPPED
3,third,192.168.2.254:81:thirdabc.com,RUNNING

从中,我们看出4列,分别以逗号分隔,为变长字符串。

--控制文件内容,控制文件是包含对数据如何被加载的信息

创建制定控制文件result.ctl内容如下:

load data
infile 'result.csv' --可以写多个infile,支持一次性导入多个数据文件
into table resultxt
fields terminated by ','
TRAILING NULLCOLS--指当数据文件的最后一列为空时,Oracle会报错( ENTIRE_LINE 出现错误。在逻辑记录结束之前未找到列),使用TRAILING NULLCOLS可以解决这个问题
(
resultid,
website,
ipport,
status
)

说明:
infile --指数据源文件
into table resultxt --默认是INSERT,APPEND 在表中追加新记录,REPLACE 删除旧记录,替换成新装载的记录 TRUNCATE 同上
terminated by ',' --指用逗号分隔
terminated by whitespace --结尾以空白分隔

--创建目标表
create table resultxt
(
resultid varchar2(50),
website varchar2(50),
ipport varchar2(50),
status varchar2(50)
);

--开始执行,sqlldr会默认在D盘根目录(执行命令的目录)下寻找控制文件以及数据文件,除非指定目录
--若不通过log命令来指定日志文件,Oracle会自动生成(名称默认为控制文件的名称,.log作为扩展名)
D:\>sqlldr userid=admin/admin control=result.ctl log=resulthis.out

SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 1月 8 14:07:14 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

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


--以下是sqlldr的日志文件内容

SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 1月 8 14:07:14 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

控制文件:      result.ctl
数据文件:      result.csv
错误文件:      result.bad
废弃文件:      未作指定
 
(可废弃所有记录)

要加载的数: ALL
要跳过的数: 0
允许的错误: 50
绑定数组: 64 行, 最大 256000 字节
继续:    未作指定
所用路径: 常规

表 RESULTXT,已加载从每个逻辑记录
插入选项对此表 INSERT 生效

   列名                        位置      长度  中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
RESULTID                            FIRST     *   ,       CHARACTER            
WEBSITE                              NEXT     *   ,       CHARACTER            
IPPORT                               NEXT     *   ,       CHARACTER            
STATUS                               NEXT     *  WHT      CHARACTER            


表 RESULTXT:
3 行 加载成功。
由于数据错误, 0 行 没有加载。
由于所有 WHEN 子句失败, 0 行 没有加载。
由于所有字段都为空的, 0 行 没有加载。


为绑定数组分配的空间: 66048 字节 (64 行)
读取   缓冲区字节数: 1048576

跳过的逻辑记录总数: 0
读取的逻辑记录总数: 3
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0

从 星期三 1月  08 14:07:14 2014 开始运行
在 星期三 1月  08 14:07:15 2014 处运行结束

经过时间为: 00: 00: 00.89
CPU 时间为: 00: 00: 00.06

--下面是按照固定长度进行分割的控制文件内容
--
OPTIONS (BINDSIZE=65536000,DIRECT=TRUE,ERRORS=100000000,DISCARDMAX =0,SKIP=7,ROWS=100000) 
LOAD DATA
INFILE 'F:\SM-HQ-20131227\SM-HQ-20131227\84744.DATA'
APPEND INTO TABLE TMP2
TRAILING NULLCOLS
(
BRCH POSITION(3:8), 
JOURNAL_NBR POSITION(10:21),
JOURNAL_ID POSITION(23:33),
POST_DATE POSITION(35:45),
TRAN_DATE POSITION(47:57),
GL_CLASS_CODE POSITION(71:74),
TRAN_CODE POSITION(86:94),
TRAN_NAME POSITION(95:124),
FCY_CODE POSITION (125:127),
AMT POSITION(128:178) "REPLACE(:AMT, ',', '')",
ACCOUNT_NO POSITION(179:196),
SOURCE_APPLN POSITION(197:208),
ERROR_NO POSITION(211:220),
TELLER_NO POSITION(221:229),
CHANNEL_TYPE POSITION(232:243),
PROM_CODE POSITION(246:250)
)

--测试下直接加载与传统加载对表的高水位的影响

CREATE TABLE T AS SELECT * FROM DBA_OBJECTS;
DELETE T;

admin@ORCL> set serveroutput on
admin@ORCL> exec show_space ('T');
Unformatted Blocks .....................               0
FS1 Blocks (0-25) ......................               0
FS2 Blocks (25-50) .....................               0
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................           1,014
Full Blocks ............................               0
Total Blocks............................           1,152
Total Bytes.............................       9,437,184
Total MBytes............................               9
Unused Blocks...........................             112
Unused Bytes............................         917,504
Last Used Ext FileId....................               9
Last Used Ext BlockId...................         510,985
Last Used Block.........................              16

--先测试直接加载

options (direct=true)
load data
infile 'T.csv' 
APPEND into table T 
fields TERMINATED BY ',' optionally enclosed by '"'
(
OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED "to_date(:CREATED,'YYYY/MM/DD HH24:MI:SS')", 
LAST_DDL_TIME  "to_date(:LAST_DDL_TIME,'YYYY/MM/DD HH24:MI:SS')",
TIMESTAMP,
STATUS,
TEMPORARY,
GENERATED,
SECONDARY 
)

--执行sqlldr
D:\>sqlldr admin/admin control=result.ctl log=result.log

加载完成 - 逻辑记录计数 70575。

--查看段T块的使用量,可以看出块几乎增加了一倍
admin@ORCL> set serveroutput on
admin@ORCL> exec show_space ('T');
Unformatted Blocks .....................               0
FS1 Blocks (0-25) ......................               0
FS2 Blocks (25-50) .....................               0
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................           1,014
Full Blocks ............................           1,013
Total Blocks............................           2,176
Total Bytes.............................      17,825,792
Total MBytes............................              17
Unused Blocks...........................             107
Unused Bytes............................         876,544
Last Used Ext FileId....................               9
Last Used Ext BlockId...................         512,009
Last Used Block.........................              21

PL/SQL 过程已成功完成。

--重复上面的步骤,利用常规插入(direct=false),看看块是否增加
--结果是段T的总数据块没有增加,Oracle会自动在段下寻找空闲块进行插入

admin@ORCL> exec show_space ('T');
Unformatted Blocks .....................               0
FS1 Blocks (0-25) ......................               0
FS2 Blocks (25-50) .....................               1
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................               1
Full Blocks ............................           1,012
Total Blocks............................           1,152
Total Bytes.............................       9,437,184
Total MBytes............................               9
Unused Blocks...........................             112
Unused Bytes............................         917,504
Last Used Ext FileId....................               9
Last Used Ext BlockId...................         510,985
Last Used Block.........................              16

PL/SQL 过程已成功完成。

--直接路径加载将使唯一索引以及主键索引无效,这点需要注意


admin@ORCL> create table t as select * from dba_objects;

表已创建。

admin@ORCL> alter table t add primary key(object_id);

表已更改。

admin@ORCL>
admin@ORCL> create index idx_t_objectid on t(data_object_id);

索引已创建。

admin@ORCL> select index_name,status from dba_indexes where table_name = 'T' and owner = 'ADMIN';

INDEX_NAME                     STATUS
------------------------------ --------
SYS_C0012772                   VALID
IDX_T_OBJECTID                 VALID

--插入部分数据
D:\sqlldr>sqlldr admin/admin control=LDR_T.ctl


--索引变成无效了,这里是因为输入数据中包含导致索引无效的数据,而Oracle并不报错,继续执行,导致主键无效。
--若输入的数据不会导致重复数据,则索引不会无效
admin@ORCL> select index_name,status from dba_indexes where table_name = 'T' and owner = 'ADMIN';

INDEX_NAME                     STATUS
------------------------------ --------
SYS_C0012773                   UNUSABLE
IDX_T_OBJECTID                 VALID

--在输出的log日志中,也证明了以上观点
表 T 的以下索引已处理:
索引 ADMIN.IDX_T_OBJECTID 已成功加载, 具有 24006 个关键字
索引 ADMIN.SYS_C0012773 无法使用, 因为: 
ORA-00001: 违反唯一约束条件 (ADMIN.SYS_C0012775)


--关注下性能相关的参数
--从传统路径摘取的部分内容,rows采取默认值

绑定数组: 64 行, 最大 256000 字节
为绑定数组分配的空间:                214656 字节 (64 行)
读取   缓冲区字节数: 1048576


--将rows提高到1000,可以看出虽然rows设置了为1000行一提交,但实际上Oracle调整为76行,因为绑定数组的大小限制在25600个字节,
--在传统加载的情况,rows的大小受与绑定数组分区空间大小影响的
绑定数组: 1000 行, 最大 256000 字节
为绑定数组分配的空间:                254904 字节 (76 行)
读取   缓冲区字节数: 1048576


--将bindsize设置为10000000时,Oracle提高以下内容,间接说明了readsize不能小于bindszie,oracle会自动调整readsize
--影响传统路径加载的参数有
--bindsize(绑定数据的大小)
--readsize(读取缓冲区)
readsize 的指定值 (1048576) 小于 bindsize(10000000)

绑定数组: 1000 行, 最大 10000000 字节
为绑定数组分配的空间:  354000 字节 (1000 行)
读取   缓冲区字节数:  10000000



--来看来direct=true时,相关的参数影响,设置rows=1000
--根据日志内容可以得出结论,当采用直接路径时,bindsize是不起作用的,它只会影响传统路径的加载
--而影响直接路径加载的参数包括
--columnarrayrows(列数组)
--streamsize(流缓冲区)
--readsize(读取缓冲区)


在直接路径中没有使用绑定数组大小。
列数组  行数:    1000
流缓冲区字节数:  256000
读取   缓冲区字节数: 1048576

--以上我们知道了影响sqlldr的相关参数,但设置多大比较合适是需要进一步探究的。

另外的关于SQLLDR提高的速度的文章:


http://www.dba-oracle.com/tips_sqlldr_loader.htm
https://cloud.tencent.com/developer/article/1993111
 
分享到:
评论

相关推荐

    oracle sqlldr多文件批量导入

    在“oracle sqlldr多文件批量导入”这个场景下,我们需要掌握如何利用SQL*Loader一次性处理多个数据文件的导入操作。下面我们将详细讲解这个主题。 首先,了解SQL*Loader的基本结构。SQL*Loader通过控制文件(.ctl...

    Oracle64位 sqlldr命令安装包

    oracle11g基本客户端,主要是sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,...如果使用sqlldr 报以下错误 可能环境变量少配置 Message 2100 not found; No message file for product=RDBMS, facility=UL

    oracle_Sqlldr的使用

    Oracle SQL*Loader是Oracle数据库提供的一个用于将外部数据加载到Oracle表中的工具。它是通过读取一个控制文件,然后加载指定的数据文件到数据库中。SQL*Loader支持多种数据加载方式,可以处理不同格式的数据文件,...

    C# 通过oracle sqlldr 将TXT批量导入oracle

    C# 通过oracle sqlldr 将TXT批量导入oracle 一个文件夹里有大量的TXT文件,以"~"区分各字段. 这个程序能批量将此文件夹里的所有的文件导入oralce 并按日期把已导入的TXT文件复制另一个文件夹

    Oracle sqlldr 大批量数据导入工具

    Oracle sqlldr 大批量数据导入工具使用实例,通过Oracle 自带的sqlldr 工具可快速导入大批量的数据至Oracle中。 工具使用前提条件: 1.安装的Oracle Client 不能为精简版,要不然就找不到sqlldr.exe 2.将Oracle的...

    Oracle中的sqlldr用法.doc

    Oracle中的sqlldr用法详解 Oracle中的sqlldr工具是用来将数据从外部文件加载到Oracle数据库中的一个命令行工具。sqlldr命令提供了许多参数来控制加载过程,下面将详细介绍这些参数的作用和用法。 userid 参数...

    oracle sqlldr;;merge;分组排序;条件赋值;表连接。简单示例

    实用基础SQL语句;oracle sqlldr;SQL基础语句;merge;分组排序;条件赋值;表连接。简单示例,Oracle数据库文档数据导入

    Oracle11G客户端64位(sqlldr可用)

    oracle11g基本客户端,主要是sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M ...

    windowns下利用bat命令+oracle的sqlldr功能导入数据

    Oracle的SQL*Loader(简称SQLLDR)工具就是这样一个强大的数据加载器,它能快速高效地将数据从外部文件批量导入到数据库中。结合批处理(BAT)脚本,我们可以自动化这个过程,提高工作效率。下面我们将详细探讨如何...

    Oracle sqlldr导入一个日期列实例详解

    Oracle SQL*Loader(sqlldr)是Oracle数据库提供的一种强大的数据加载工具,用于将大量数据从文本文件快速导入到数据库表中。在这个实例中,我们将详细探讨如何使用SQL*Loader导入包含日期列的数据。 首先,我们...

    oracle sqlldr 导入乱码问题

    1. 文件编码与数据库编码不一致:文件中存储的数据使用了一种编码格式,而Oracle数据库使用了另一种编码格式,两者不匹配就会产生乱码。 2. SQL*Loader配置错误:如果在控制文件中未正确指定字符集,或者没有指定...

    oracle 11.2客户端 sqlldr相关文件

    oracle 11.2客户端(linux) sqlldr相关文件 如果oracle客户端用的是rpm方式安装: sqlldr命令放在bin 其他文件放在lib 如果oracle客户端用的是直接解压方式: 所有都放在根目录即可

    Oracle11G的Linux64的sqlldr版本11.2.0.4

    用的是11.2.0.4的Instant Client,Oracle没给sqlldr,Tools里面也没有(12C就有)。 网上下载了几个都是11.2.0.1的sqlldr,包括标了版本号的,都需要替换库文件。 这个是自己安装p13390677_112040_Linux-x86-64_4of7...

    sqlldr导入带有自动增加的数据

    在Oracle数据库管理中,SQL*Loader(简称sqlldr)是一个非常强大的工具,用于将外部数据文件中的数据批量加载到Oracle数据库表中。当涉及到处理带有自动增加字段的表时,SQL*Loader提供了一些灵活的方法来确保数据的...

    Windows版oracle10g精简客户端(带sqlldr)

    在这个"Windows版oracle10g精简客户端(带sqlldr)"中,我们主要关注两个关键组件:Instant Client和sqlldr。 **Instant Client** 是Oracle提供的一种轻量级客户端工具,它允许用户在没有完整安装Oracle数据库的...

    浅谈ORACLE的SQLLDR

    ### ORACLE SQLLDR知识点详解 #### 一、SQL Loader的特点与应用场景 ##### 特点概述 - **兼容性好**:SQL Loader是Oracle提供的一个非常实用的数据导入工具,能够处理不同格式的数据文件,并将其导入Oracle数据库...

    Oracle Client sqlldr和ulus.msb文件

    在使用`sqlldr`时,通常会遇到以下步骤和注意事项: 1. **创建控制文件**:控制文件是`sqlldr`操作的核心,它定义了数据源、目标表、字段映射、转换规则等。 2. **准备数据文件**:根据控制文件的要求,整理好数据...

    MySQL导出数据并通过sqlldr导入oracle

    同时代码还会生成sqlldr命令需要用到的control文件和bat文件,以及连接Oracle的配置文件,只要将MySQL导出的数据文件合到一起,执行bat文件,即可完成数据导入到Oracle的任务。所有文件都是以导入导出的那张表的表名...

    Oracle11g64位客户端-sqlldr可用

    oracle11g基本客户端,主要是sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M ...

Global site tag (gtag.js) - Google Analytics