轻松入门:Linux下SQLLDR使用技巧 (linux sqlldr使用)

SQLLDR是一种在Oracle数据库中使用的数据加载工具,它可以将大量数据从文本文件导入数据库表中。针对初学者,使用Linux系统下的SQLLDR工具可能会面对许多挑战。本文旨在帮助初学者了解Linux下SQLLDR的基本使用技巧,解决在数据加载过程中可能会遇到的问题。

一、为何选择SQLLDR

在介绍SQLLDR使用技巧之前,我们有必要简单介绍一下SQLLDR的优势。与其他数据导入工具相比,SQLLDR有诸多优点:

1. 快速导入数据:SQLLDR使得数据导入数据库更快、更高效,因为SQLLDR是使用Oracle本地SQL语句进行加载,它比其他工具使用SQL*Net协议进行数据传输的速度要快。

2. 减少数据损失:SQLLDR能够提供优秀的容错机制,因此它可以将数据准确地加载到Oracle表中并且减少错误和数据损失。

3. 自动化批量导入:SQLLDR工具支持批量导入数据,这意味着您可以一次性加载大量数据,而不必一次加载一个表。

二、SQLLDR使用规范

在学习SQLLDR使用时,您需要了解SQLLDR的常规语法和规范,这些规范包括:

1. 文件扩展名:SQLLDR只能导入文本类型的数据,你必须将需要导入的文件名后缀改为.txt或者.csv

2. 系统环境变量:在使用SQLLDR之前,一定要确保正确设置了系统环境变量——ORACLE_SID,该变量的值应该是目标Oracle数据库的实例名。

3. 控制文件:SQLLDR运行需要一个称为「控制文件」的文件,我在下面将进一步解释该文件的作用以及如何编写控制文件

三、SQLLDR使用技巧

1. 编写控制文件

控制文件是负责指导SQLLDR如何进行数据导入的文件。控制文件是一个包含指令的文本文件,它描述了要加载的数据的来源,目标表和数据如何被加载到Oracle数据库中。

以下是一个示例控制文件(test.ctl):

LOAD DATA

INFILE ‘/home/test.csv’

INTO TABLE test_table

FIELDS TERMINATED BY ‘,’

OPTIONAL ENCLOSED BY ‘”‘

TRLING NULLCOLS;

该文件指定了SQLLDR需要从test.csv文件中加载数据,并将其加载到名为test_table的表中。该文件还指定了字段分隔符和一个可选的引号字符用于字符列的区分。 Trling NULLCOLS选项指定SQLLDR不会将控制文件中声明的未列出的列作为默认赋值NULL值的列。

2. 运行SQLLDR

有了控制文件,就可以运行SQLLDR来开始加载数据了:

sqlldr userid=USERNAME/PASSWORD control=test.ctl

请注意,控制文件test.ctl必须在SQLLDR命令中指定。还要注意,与Oracle数据库对话需要使用用户名和密码。

3. 处理错误

遇到错误时,SQLLDR会生成一个错误日志文件和一个拒绝文件。错误日志文件包含了加载期间的错误和警告信息,而拒绝文件包含了没有正确加载到表中的数据行。

处理错误的更好方式是使用错误日志文件。标准后缀为.bad的错误日志文件可能与控制文件位于相同的目录中。如果您的SQLLDR命令未指定错误日志文件名称,它将采用默认名称。错误日志文件中包含了相应的错误信息,我们可以使用Vi或Nano等文本编辑器进行打开。通过检查这个文件,我们能够了解哪些记录未被正确加载以及失败的原因。

四、

有了熟练运用SQLLDR的技巧,您可以大大缩短大量数据导入的过程,并且保证数据的准确性和完整性。通过本文简单的介绍,我相信您已经对SQLLDR的基本使用有了一定的认识。还有一些更高级的功能,比如控制文件语法和参数设置等等,但这已经超出了初学者的范畴。希望您的使用SQLLDR愉快!

相关问题拓展阅读:

linux文件入库

sqlldr hr/hr control=d:\test.ctl

test.ctl如下:

Load data

infile ‘d:\test.txt’

insert into table yourtable

fields terminated by X’09’

(key1,key2,key13,……key50)

或:

1、控制文件test.ctl的内容

LOAD DATA

INFILE *

BADFILE ‘宏轿C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.BAD’

DISCARDFILE ‘C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.DSC’

INSERT INTO TABLE 你的表名

Fields terminated by “;” Optionally enclosed by ‘”‘

(

key1,

key2,

key3,

key4,

这里你把所有的列补全。。。。

key50

)

BEGINDATA

“1”;”JP”;”Japan”;”;NULL;NULL;NULL;NULL;NULL;NULL;NULL

“2”;”ssss”;”Japan”;”;NULL;NULL;NULL;NULL;NULL;NULL;NULL

“3”;”fdsfsfs”;”fdfsfsf”;”;NULL;NULL;”ssss”搏绝姿;NULL;NULL;NULL

–反正上面写50列,写够。基绝

请教SQL LOAD 中的“OPTIONAL ENCLOSED BY”

1、准备工作:创建需要导入数据的表结构,如果已有相关的表,此步省略!

  SQL> create table test

  2 (

hostVARCHAR2(30),

user_name VARCHAR2(30),

ip_address VARCHAR2(15),

passVARCHAR2(4) default ‘no’ not null,7 judgeNUMBER default 0 not null,8 endtimeDATE

  9 );

  表已创建。

  2、编写sqlload导入数据的控制文件,这里测试的控制文件如下,可以根据自己需要添加相关的控制参数,测试的话复制保存为txt文件即可!

  LOAD DATA

  INFILE ‘d:\data.txt’

  INTO TABLE test

  TRUNCATE

  fields terminated by ‘,’

  trailing nullcols

  (HOST,USER_NAME,IP_AddrESS,PASS,JUDge,endTIME)控制文件还有其他参数,根据自己需求调整和测试:

  附部分控制参数:具体用法以官方文档为准

  OPTIONS (skip=1,rows=128) — sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的之一行LOAD DATA

  INFILE “users_data.csv”指定外部数据文件,可以是不同格式的数据文件,如csv、txt都支持可以写多个 INFILE “another_data_file.csv” 指定多个数据文件truncate操作类型,用 truncate table 来清除表中原有记录,根据情况而定是否需要清楚原有表中数据INTO TABLE users-要插入记录的表Fields terminated by “,”数据中每行记录用 “,” 分隔Optionally enclosed by ‘”‘ –数据中每个字段用 ‘”‘ 框起,比如字段中有 “,” 分隔符时trailing nullcols表的字段没有对灶册应的值时允许为空(

  virtual_column FILLER, –这是一个虚拟字段,用来跳过由 PL/隐芹宏SQL Developer 生成的之一列序号user_id number,字段可以指定类型,否则认为是 CHARACTER 类型, log 文件中有显示user_name,

  login_times,

  last_login DATE “-MM-DD HH24:MI:SS” — 指定接受日期的格式,相当用 to_date() 函数转换)

  insert为缺省方式,在首举数据装载开始时要求表为空append –在表中追加新记录

  replace –删除旧记录(用 delete from table 语句),替换成新装载的记录truncate –删除旧记录(用 truncate table 语句),替换成新装载的记录3、创建需要导入的数据,注意数据格式必须和表结构严格对应,否则导入失败!测试数据如下:有部分数据最后字段为空,所以控制文件中需要加trailing nullcols 参数!

  ttt,SCOTT,192.168.1.111,yes,1,

  ,JACK,192.168.1.20,no,1,

  ,TOM,192.168.1.20,no,1,

  WEB1,HAHA,192.168.1.1,no,1,

  XXX,ROBIN,111.111.111.111,no,1,08-AUG-08

  DB2,LUCY,192.168.10.10,no,1,

  ORACLE,LI,222.222.222.222,no,1,

  WORKGROUP,DENNIS,133.133.133.133,no,0,08-AUG-08DCR,CANDY,192.168.100.10,no,1,

  T3,F,192.168.10.33,no,1,

  T1,LINDA,192.168.10.200,no,1,08-AUG-08

  T2,LILEI,192.168.100.31,no,1,08-AUG-08

  4、导入数据-导入时也有相关的参数进行控制

  附部分导入参数:各参数可以再命令行下输入sqlldr查看C:\Documents and Settings\Administrator>sqlldrSQL*Loader: Release 11.2.0.1.0 – Production on 星期三 2月 27 17:13:Copyright (c) 1982, 2023, Oracle and/or its affiliates. All rights reserved.

  用法: SQLLDR keyword=value

  有效的关键字:

  userid — ORACLE 用户名/口令

  control — 控制文件名

  log — 日志文件名

  bad — 错误文件名

  data — 数据文件名

  discard — 废弃文件名

  discardmax — 允许废弃的文件的数目(全部默认)skip — 要跳过的逻辑记录的数目 (默认 0)

  load — 要加载的逻辑记录的数目 (全部默认)errors — 允许的错误的数目(默认 50)rows — 常规路径绑定数组中或直接路径保存数据间的行数(默认: 常规路径 64, 所有直接路径)

  bindsize — 常规路径绑定数组的大小 (以字节计) (默认)silent — 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)direct — 使用直接路径(默认 FALSE)parfile — 参数文件: 包含参数说明的文件的名称parallel — 执行并行加载 (默认 FALSE)file — 要从以下对象中分配区的文件

  skip_unusable_indexes — 不允许/允许使用无用的索引或索引分区 (默认 FALSE)skip_index_maintenance — 没有维护索引, 将受到影响的索引标记为无用 (默认 FALSE)commit_discontinued — 提交加载中断时已加载的行 (默认 FALSE)readsize — 读取缓冲区的大小 (默认)external_table — 使用外部表进行加载; NOT_USED, GENERATE_ON, EXECUTE (默认 NOT_USED)

  columnarrayrows — 直接路径列数组的行数 (默认 5000)streamsize — 直接路径流缓冲区的大小 (以字节计) (默认)multithreading — 在直接路径中使用多线程

  resumable — 启用或禁用当前的可恢复会话 (默认 FALSE)resumable_name — 有助于标识可恢复语句的文本字符串resumable_timeout — RESUMABLE 的等待时间 (以秒计) (默认 7200)date_cache — 日期转换高速缓存的大小 (以条目计) (默认 1000)no_index_errors — 出现任何索引错误时中止加载 (默认 FALSE)如下命令:control=指定控制文件和路径 log=导入日志文件保存 bad=错误信息 data=数据文件开始导入:

  C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txtSQL*Loader: Release 11.2.0.1.0 – Production on 星期三 2月 27 17:06:Copyright (c) 1982, 2023, Oracle and/or its affiliates. All rights reserved.

  达到提交点 – 逻辑记录计数 12

  导入成功后查看结果:

  C:\Documents and Settings\Administrator>sqlplus scott/tigerSQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 27 17:07:Copyright (c) 1982, 2023, Oracle. All rights reserved.

  连接到:

  Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> select * from test;

  HOSTUSER_NAME IP_ADDRESSPASSJUDGE ENDTIME—tttSCOTT.168.1.yes JACK.168.1.no TOM.168.1.no 1WEBHAHA.168.1.no 1DBLUCY.168.10. no 1ORACLE LI.222.222. no 1DCRCANDY.168.100. no 1TF.168.10. no 1已选择8行。

  结果显然与数据文件不一致,最后一个字段有值的数据没有导入!这不是最后想要的结果!但可以确定已经有数据导入,表示表对象和控制文件没问题!

  应该是数据文件的格式问题!注意数据文件最后一个字段是日期型数据。查看是不是数据库现有日期类型不支持数据文件的表示格式SQL> select sysdate from dual;

  SYSDATE

  27-2月 -13

  显然和我们数据文件的日期显示不一致,且是中文,这里可以把数据文件的最后字段的数据改成和数据库一样的格式,也可以对数据库的格式和语言进行更改,因为测试系统是windows才会出现这个错误,在linux可以避免!

  如果是linux 可以尝试以下步骤解决:

  alter system set nls_date_format=’DD-MON-RR’;alter system set nls_language= american scope = spfile;得重启数据库这里由于是windows,这里就不更改语言和重启数据库,直接对数据文件进行更改,修改后的数据文件如下ttt,SCOTT,192.168.1.111,yes,1,

  ,JACK,192.168.1.20,no,1,

  ,TOM,192.168.1.20,no,1,

  WEB1,HAHA,192.168.1.1,no,1,

  XXX,ROBIN,111.111.111.111,no,1,08-5月 -08DB2,LUCY,192.168.10.10,no,1,

  ORACLE,LI,222.222.222.222,no,1,

  WORKGROUP,DENNIS,133.133.133.133,no,0,08-5月 -08DCR,CANDY,192.168.100.10,no,1,

  T3,F,192.168.10.33,no,1,

  T1,LINDA,192.168.10.200,no,1,08-5月 -08

  T2,LILEI,192.168.100.31,no,1,08-5月 -08

  再导入一次,导入后进行查看结果

  C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txtSQL*Loader: Release 11.2.0.1.0 – Production on 星期三 2月 27 17:48:Copyright (c) 1982, 2023, Oracle and/or its affiliates. All rights reserved.

  达到提交点 – 逻辑记录计数 12

  C:\Documents and Settings\Administrator>sqlplus scott/tigerSQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 27 17:49:Copyright (c) 1982, 2023, Oracle. All rights reserved.

  连接到:

  Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> col host for a10

  SQL> col user_name for a15

  SQL> select * from test;

  HOSTUSER_NAMEIP_ADDRESSPASSJUDGE ENDTIMEttt SCOTT.168.1.yes JACK2.168.1.no TOM92.168.1.no 1WEBHAHA2.168.1.no 1XXXROBIN.111.111.no月 -08DBLUCY2.168.10.no 1ORACLELI2.222.222.no 1WORKGROUP DENNIS.133.133. no月 -08DCRCANDY.168.100.no 1T F92.168.10.no 1TLINDA.168.10.no月 -08TLILEI.168.100.no月 -08已选择12行。

关于linux sqlldr使用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 轻松入门:Linux下SQLLDR使用技巧 (linux sqlldr使用)