`

sql loader(sqlldr)的用法

 
阅读更多

sql loader可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,
是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。                                              

sql loader可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,
是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。
缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。
用法: SQLLDR keyword=value [,keyword=value,...]
 
有效的关键字:
    userid -- ORACLE username/password
   control – 控制文件
       log – 记录的日志文件
       bad – 坏数据文件
      data – 数据文件
   discard – 丢弃的数据文件
discardmax – 允许丢弃数据的最大值        (全部默认)
      skip -- Number of logical records to skip  (默认0)
      load -- Number of logical records to load  (全部默认)
    errors – 允许的错误记录数          (默认50)
      rows -- Number of rows in conventional path bind array or between direct path data saves
                (每次提交的记录数,默认: 常规路径 64, 所有直接路径)
  bindsize -- Size of conventional path bind array in bytes(默认256000)
                每次提交记录的缓冲区的大小(字节为单位,默认256000)
    silent --禁止输出信息 (header,feedback,errors,discards,partitions)
    direct – 使用直通路径方式导入                    (默认FALSE)
   parfile -- parameter file: name of file that contains parameter specifications
  parallel -- 并行导入                   (默认FALSE)
       file -- File to allocate extents from
  与bindsize成对使用,其中较小者会自动调整到较大者
sqlldr先计算单条记录长度,乘以rows,如小于bindsize,不会试图扩张rows以填充bindsize;如超出,则以bindsize为准。
 
external_table
           -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE(默认NOT_USED)
columnarrayrows
           -- Number of rows for direct path column array(默认5000)
streamsize -- Size of direct path stream buffer in bytes(默认256000)
multithreading
           -- use multithreading in direct path
 resumable -- enable or disable resumable for current session(默认FALSE)
resumable_name
           -- text string to help identify resumable statement
resumable_timeout
           -- wait time (in seconds) for RESUMABLE(默认7200)
date_cache -- size (in entries) of date conversion cache(默认1000)
 
注意:有两种方式可以指定命令行参数:通过位置或者通过关键字。前者的例子:'sqlldr scott/tiger foo';
后者的例子:'sqlldr control=foo userid=scott/tiger';
不能前面使用关键字指定后面通过位置制定的混合方式;
比如:'sqlldr scott/tiger control=foo logfile=log' 是允许的,
但'sqlldr scott/tiger control=foo log'不允许。
为清楚起见最好所有命令行参数都用关键字指定。
控制文件:
一个控制命令的脚本文件,通常以ctl结尾,内容如下:
LOAD DATA
INFILE 't.dat'              要导入的文件
// INFILE 'tt.date' 导入多个文件
// INFILE *               表示要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容
 
INTO TABLE table_name    指定装入的表
BADFILE 'c:\bad.txt'    可选,指定坏文件地址,缺省在当前目录下生成与原文件名一致的.bad文件
 
************* 以下是4种装入表的方式
APPEND             原先的表有数据 就加在后面
INSERT             装载空表 如果原先的表有数据 sqlloader会停止 默认值
REPLACE           原先的表有数据 原先的数据会全部删除
TRUNCATE        指定的内容和replace的相同 会用truncate语句删除现存数据
 
************* 指定分隔符
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
// TERMINATED BY WRITESPACE 以空白分割
 
TRAILING NULLCOLS            表的字段没有对应的值时允许为空
 
************* 下面是表的字段
(
col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载
// 如: lg,lg,not 结果 lg lg
)
如果没声明FIELDS TERMINATED BY ',' 时,可以用下面两种方式实现同样功能:
1.为每一列指定分隔符
 (
 col_1 [interger external] TERMINATED BY ',' ,
 col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,
 col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'
 )
2.用位置告诉字段装载数据
 (
col_1 position(1:2),
 col_2 position(3:10),
 col_3 position(*:16), // 这个字段的开始位置在前一字段的结束位置
 col_4 position(1:16),
 col_5 position(3:10) char(8) // 指定字段的类型
 )
 
BEGINDATA         对应开始的 INFILE * 要导入的内容就在control文件里
10,Sql,what
20,lg,show

 

一个简单的例子:

目前所做的项目需要从一个按行记录的数据文件取出部分字段,再将这些字段的按行存储到Oracle数据库。这些数据大约有2 700 000条,原始数据文件有450M左右。至少有两种方法可以实现:

     一.将原始数据文件读进内存流中,每读一行解析一条数据,接着执行一条SQL语句,将解析到的数据插入数据库表;

     二..将原始数据文件读进内存流中,每读一行解析一条数据,接着将解析到的数据按行写入一个临时文件data.tmp,待所有数据均被解析完毕且写入临时文件后,调用SQL Loader,将所有数据一次性从临时文件导入数据库表。

     一开始是按照第一种方法编程的。在本机(Oracle服务器装在本机)测试顺利通过,但是花了大约150分钟才导入解析和完成;当部署到实际环境中运行时,却出现了问题。跟踪发现是因为网络不稳定(程序所在服务器与数据库服务器处于不同的局域网,由防火墙隔开,做了几个特定端口的路由),有时候连接不到数据库,往往只导入了很少的几千条甚至几百条数据时,数据库就连接不上了。

     后来分析,对于大量数据的导入,采用第一种方法会导致频繁写库,每次都要打开数据库(禁用了连接池,后续文章会提到禁用的原因),对数据库造成较大的压力,加上网络环境本来就不够稳定,所以很容易出现问题。于是改用第二种方法。

     使用第二种方法后,解析花的时间大约为90分钟,导入则只花了5分钟左右。看来SQL Loader的效率真的很高。

     下面讲讲SQL Loader的基本用法。
    
     1、在Oracle中按照导入数据的格式建立一个空表

     2、编写一个控制文件control.ctl,内容如下

LOAD DATA 
INFILE 'E:\test\data.tmp' 
BADFILE 'E:\test\data.bad'
DISCARDFILE 'E:\test\data.dsc'
DISCARDMAX 1000

APPEND
INTO TABLE "TB_TEST"
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
  (
   USER_ID, 
   USER_NAME, 
   REG_TIME  DATE(20) "YYYY-MM-DD HH24:MI:SS"
   )

 操作分类:

        a、insert,为缺省方式,在数据装载开始时要求表为空
        b、append,在表中追加新记录
        c、replace,删除旧记录,替换成新装载的记录
        d、truncate,同上

3、在命令行中执行以下语句:

        sqlldr userid/password@database e:\test\control.ctl


参考:1. Oracle SQL*Loader  -- 英文,Sql Loader 的官方使用说明,包含多种类型的  Demo
        2. sql loader的用法  -- 列出了 sql loader 的选择参数的中文说明
        3. 使用SQL Loader导入大量数据,避免使用SQL频繁写库 -- 一个简单的例子,快带了解 Sql Loader 的用法
        4. Oracle SQL Loader的详细语法
        5. oracle sql loader全攻略 -- 还算名符其实。并讲了如何用 SQL *Plus 的  spool 或 UTL_FILE 包生成数据文件
        6. SQL*Loader Control File Reference   -- 英文,控制文件使用参考
        7. 学习oracle sql loader 的使用 
        8. 用sqlloader(sqlldr)装载LOB数据  -- LOB 的内类是一个外部文件,用 sql loader 导入到数据库
        9. SQLLDR直接加载几个参数的测试
        10.Maximizing SQL*Loader Performance

分享到:
评论

相关推荐

    关于 Oracle 的数据导入导出及 Sql Loader (sqlldr)

    在本篇中,我们将深入探讨Oracle的数据导入导出及Sql Loader的使用方法。 1. **Oracle数据导入导出** Oracle提供了多种数据导入导出工具,包括`expdp`(Export Data Pump)和`impdp`(Import Data Pump)以及传统的...

    oracle sql loader 用法详解

    本文旨在通过实例深入探讨SQL Loader的使用方法,帮助读者快速上手。 #### SQL Loader简介 在不同的操作系统环境下,SQL Loader有不同的调用方式。在Windows系统下,其命令为`SQLLDR`;而在UNIX系统下,则通常为`...

    SQL LOADER错误小结

    在使用SQL*Loader进行数据加载时,我们可能会遇到多种错误情况。SQL*Loader是一个Oracle数据库提供的工具,用于高效地从平面文件批量导入数据。以下是一些常见错误的总结及其解决方案: 1. **编码错误导致的乱码...

    SQL Loader 加载数据

    在本文中,我们将深入探讨SQL Loader的工作原理、基本用法以及如何使用它来加载数据,特别是在处理`pet_photo.csv`和`pet_photo.ctl`这样的数据文件时。 1. **SQL Loader简介** SQL Loader是Oracle提供的实用程序...

    oracle sql loader全攻略

    ##### 基本使用方法 通过命令行调用SQL Loader时,需要指定一系列的关键字参数来控制加载过程。下面列举了一些常用的关键字及其作用: - **userid**:指定Oracle数据库的用户名和密码,格式为`username/password`。...

    sqlloader详解

    控制文件的语法复杂,具体使用方法需参考《Oracle服务器工具手册》。 ##### 2. 输入数据格式 SQL*Loader能够处理多种格式的数据文件,包括磁盘或磁带上的文件,甚至记录可以直接嵌入控制文件中。支持固定长度记录...

    SQL_LOADER教程

    ### SQL_LOADER教程详解 #### 一、SQL*LOADER简介 SQL*LOADER是Oracle提供的一款高效的数据加载工具,主要用于将操作...通过本教程的学习,希望读者能够快速掌握SQL*LOADER的使用方法,并能够熟练应用于实际工作中。

    一个简单的调用sql loader批量数据导入程序

    下面,我们将深入探讨SQL*Loader的工作原理、使用方法以及如何通过编写Java程序来调用SQL*Loader进行数据导入。 首先,SQL*Loader(也称为SQL Loader)是Oracle数据库的配套工具,用于将数据从平面文件快速加载到表...

    如何使用SQLloader导入数据(word文档良心出品).doc

    使用 SQLloader 导入数据是一个非常方便和快速的方法, especialmente 对于大数据量的导入。使用 SQLloader 可以快速批量上传数据到 Oracle 表中,不需要使用第三方工具,直接使用 Oracle 自带的程序。

    sql loader详解

    SQL*LOADER是oracle的数据加载工具,在NT下sql*loader的命令为SQLLDR,在UNIX下一般为SQLLDR/SQLLOAD。通常用来将操作系统文件迁移到oracle数据库中。它是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径...

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

    总结来说,通过Windows下的BAT命令与Oracle的SQL*Loader功能结合,我们可以构建一个高效的数据库导入流程,尤其在处理大量数据时,这种自动化方法能够显著提高工作效率。在实际应用中,要根据具体需求灵活调整和优化...

    海量数据装载工具SQL Loader技术分析.pdf

    这一点通过关键词的罗列也可以体现,如“Oracle数据库”、“SQLLoader”、“数据加载”、“情报处理”等。 综上所述,SQL Loader作为一种高效的数据装载工具,在大数据环境下对Oracle数据库的数据装载有着重要的...

    sqlldr报超出字符长度错误

    在使用SQL*Loader工具导入数据时,可能会遇到超出字符长度限制的错误。这类问题通常出现在需要将包含较长字符串的数据加载到表中时,而目标列定义的长度不足以容纳实际数据的情况。本文将围绕SQL*Loader字符长度错误...

    Oracle数据库使用SQL_Loader导入外部数据的方法详解

    Oracle数据库使用SQL_Loader导入外部数据的方法详解,详细讲解 sqlldr的使用

    sql*loader 指南

    ### SQL*Loader 指南:语法...以上介绍了SQL*Loader的基本用法及控制文件的编写方法,通过合理配置控制文件,可以实现高效的数据导入。同时,SQL*Loader还提供了丰富的数据转换功能,使得数据加载过程更加灵活和可控。

    SQL_LOADER例子

    这个“SQL_LOADER例子”提供了一个实际操作的示例,可以帮助我们更深入地理解SQL*Loader的工作原理和使用方法。 首先,SQL*Loader通过控制文件(.ctl文件)来定义数据加载的过程。控制文件包含了一系列指令,如表名...

    SqlLoader实用教程(基础入门)

    这意味着如果目标应用服务器上未安装Oracle客户端(自10g版本起,只需安装服务器端或客户端即可),则无法正常使用SQLLoader的功能。 #### 三、SQLLoader命令格式与参数 SQLLoader的基本命令格式为: ``` SQLLDR ...

    Oracle SQL Loader的详细语法

    #### 三、SQL*Loader 的基本使用方法 1. **使用命令行调用 SQL*Loader** ```bash sqlldr 用户名/密码 control=控制文件路径 ``` 2. **控制文件示例** 下面是一个简单的控制文件示例,用于从 CSV 文件中加载...

Global site tag (gtag.js) - Google Analytics