数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

数据批量sql*load导入Oracle数据库


发布日期:2019年10月05日
 
数据批量sql*load导入Oracle数据库

SQL*LOADER是大型数据

仓库选择使用的加载方法因为它提供了最快速的途径(DIRECTPARALLEL)现在我们抛开其理论不谈用实例来使

您快速掌握SQL*LOADER的使用方法

首先我们认识一下SQL*LOADER

在NT下SQL*LOADER的命令为SQLLDR在UNIX下一般为sqlldr/sqlload

如执行d:\oracle>sqlldr

SQL*Loader: Release Production on 星期二 ::

(c) Copyright Oracle Corporation All rights reserved

用法: SQLLOAD 关键字 = 值 [keyword=value]

有效的关键字:

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 (全部默认)

skip Number of logical records to skip (默认)

load Number of logical records to load (全部默认)

errors Number of errors to allow (默认)

rows Number of rows in conventional path bind array or between direct p

ath data saves

(默认: 常规路径 所有直接路径)

bindsize Size of conventional path bind array in bytes(默认)

silent Supdivss messages during run (headerfeedbackerrorsdiscardspart

itions)

direct use direct path (默认FALSE)

parfile parameter file: name of file that contains parameter specification

s

parallel do parallel load (默认FALSE)

file File to allocate extents from

skip_unusable_indexes disallow/allow unusable indexes or index partitions(默认FALSE)

skip_index_maintenance do not maintain indexes mark affected indexes as unusable(默认FALSE)

commit_discontinued commit loaded rows when load is discontinued(默认FALSE)

readsize Size of Read buffer (默认)

PLEASE NOTE: 命令行参数可以由位置或关键字指定

前者的例子是 sqlload scott/tiger foo;

后者的例子是 sqlload control=foo userid=scott/tiger

位置指定参数的时间必须早于但不可迟于由关键字指定的参数例如

SQLLOAD SCott/tiger control=foo logfile=log

不允许 sqlload scott/tiger control=foo log

即使允许参数 log 的位置正确

d:\oracle>

我们可以从中看到一些基本的帮助信息这里我用到的是中文的WINADVSERVER

我们知道SQL*LOADER只能导入纯文本所以我们现在开始以实例来讲解其用法

已存在数据源resultcsv欲倒入ORACLE中FANCY用户下

resultcsv内容

默认 Web 站点::RUNNING

other::STOPPED

third::RUNNING

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

制定控制文件resultctl

resultctl内容

load data

infile resultcsv

into table resultxt

(resultid char terminated by

website char terminated by

ipport char terminated by

status char terminated by whitespace)

说明

infile指数据源文件这里我们省略了默认的discardfile resultdsc badfile resultbad

into table resultxt 默认是INSERT也可以into table resultxt APPEND为追加方式或REPLACE

terminated by 指用逗号分隔

terminated by whitespace结尾以空白分隔

此时我们执行加载

D:\>sqlldr userid=fancy/testpass control=resultctl log=resulthisout

SQL*Loader: Release Production on 星期二 ::

(c) Copyright Oracle Corporation All rights reserved

SQL*Loader: 在描述表RESULTXT时出现错误

ORA: 对象 RESULTXT 不存在

提示出错因为数据库没有对应的表

在数据库建立表

create table resultxt

(resultid varchar()

website varchar()

ipport varchar()

status varchar())

/

重新执行加载

D:\>sqlldr userid=fancy/kill control=resultctl log=resulthisout

SQL*Loader: Release Production on 星期二 ::

(c) Copyright Oracle Corporation All rights reserved

达到提交点逻辑记录计数

达到提交点逻辑记录计数

已经成功!我们可以通过日志文件来分析其过程resulthisout内容如下

SQL*Loader: Release Production on 星期二 ::

(c) Copyright Oracle Corporation All rights reserved

控制文件: resultctl

数据文件: resultcsv

错误文件: resultbad

废弃文件: 未作指定

:

(可废弃所有记录)

装载数: ALL

跳过数:

允许的错误:

绑定数组: 最大 字节

继续: 未作指定

所用路径: 常规

表RESULTXT

已载入从每个逻辑记录

插入选项对此表INSERT生效

列名 位置 长度 中止 包装数据类型

RESULTID FIRST * CHARACTER

WEBSITE NEXT * CHARACTER

IPPORT NEXT * CHARACTER

STATUS NEXT * WHT CHARACTER

表RESULTXT:

行载入成功

由于数据错误 行没有载入

由于所有 WHEN 子句失败 行没有载入

由于所有字段都为空的 行没有载入

为结合数组分配的空间: 字节(行)

除绑定数组外的内存空间分配: 字节

跳过的逻辑记录总数:

读取的逻辑记录总数:

拒绝的逻辑记录总数:

废弃的逻辑记录总数:

从星期二 :: 开始运行

在星期二 :: 处运行结束

经过时间为: : :

CPU 时间为: : : (可

并发操作

sqlldr userid=/ control=resultctl direct=true parallel=true

sqlldr userid=/ control=resultctl direct=true parallel=true

sqlldr userid=/ control=resultctl direct=true parallel=true

当加载大量数据时(大约超过GB)最好抑制日志的产生

SQL>ALTER TABLE RESULTXT nologging;

这样不产生REDOLOG可以提高效率然后在CONTROL文件中load data上面加一行unrecoverable

此选项必须要与DIRECT共同应用

在并发操作时ORACLE声称可以达到每小时处理GB数据的能力!其实估计能到G就算不错了开始可用结构

相同的文件但只有少量数据成功后开始加载大量数据这样可以避免时间的浪费

我的示例

在数据库建立表格weather如下

create table weather(

outlook varchar()

temperature float

humidity float

windy varchar()

play varchar()

)

在F盘建立两个文件 分别如下

#resultctl内容如下

load data

infile resultcsv

into table weather

(outlook char terminated by

temperature char terminated by

humidity char terminated by

windy char terminated by

play char terminated by

)

#resultcsv内容如下

sunnyFALSEno

sunnyTRUEno

overcastFALSEyes

rainyFALSEyes

rainyFALSEyes

rainyTRUEno

overcastTRUEyes

sunnyFALSEno

sunnyFALSEyes

rainyFALSEyes

sunnyTRUEyes

overcastTRUEyes

overcastFALSEyes

rainyTRUEno

命令行下执行

F:\>sqlldr userid=cqsb/ctbujx control=resultctl

搞定

               

上一篇:基于Oracle的高性能动态SQL程序开发

下一篇:Oracle数据库出现奇怪表名的清除方法