设为首页 收藏本站
查看: 2009|回复: 0

[经验分享] oracle sql loader

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-9-24 09:41:26 | 显示全部楼层 |阅读模式
  SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据
  仓库选择使用的加载方法。
  在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload。
  如执行:d:/oracle>sqlldr

  SQL*Loader:>  (c) Copyright 1999 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   (默认0)
  load -- Number of logical records to load   (全部默认)
  errors -- Number of errors to allow           (默认50)
  rows -- Number of rows in conventional path bind array or between direct p
  ath data saves
  (默认: 常规路径 64, 所有直接路径)

  bindsize -->  silent -- Suppress messages during run (header,feedback,errors,discards,part
  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 unus
  able(默认FALSE)
  commit_discontinued -- commit loaded rows when load is discontinued(默认FALSE)

  readsize -->  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' 的位置正确。
  控制文件介绍
  LOAD DATA
  INFILE 't.dat' // 要导入的文件
  // INFILE 'tt.date' // 导入多个文件
  // INFILE * // 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容, *和't.dat'不能同时存在
  INTO TABLE table_name // 指定装入的表
  BADFILE 'c:bad.txt' // 指定坏文件地址
  ************* 以下是4种装入表的方式
  APPEND // 原先的表有数据 就加在后面
  // INSERT // 装载空表 如果原先的表有数据 sqlloader会停止 默认值
  // REPLACE // 原先的表有数据 原先的数据会全部删除
  // TRUNCATE // 指定的内容和replace的相同 会用truncate语句删除现存数据
  ************* 指定的TERMINATED可以在表的开头 也可在表的内部字段部分
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  // 装载这种数据: 10,lg,"""lg""","lg,lg"
  // 在表中结果: 10 lg "lg" lg,lg
  // TERMINATED BY X '09' // 以十六进制格式 '09' 表示的
  // TERMINATED BY WRITESPACE // 装载这种数据: 10 lg lg
  TRAILING NULLCOLS ************* 表的字段没有对应的值时允许为空
  ************* 下面是表的字段
  (
  col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载
  // 如: lg,lg,not 结果 lg lg
  )
  // 当没声明FIELDS TERMINATED BY ',' 时
  // (
  // col_1 [interger external] TERMINATED BY ',' ,
  // col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,
  // col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'
  // )
  // 当没声明FIELDS TERMINATED BY ','用位置告诉字段装载数据
  // (
  // 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) // 指定字段的类型
  // )
  看晕了吧?呵呵,我一开始也看得晕晕的,那就从我的实例开始吧!
  这里,我的操作系统是xp,数据库主机是unix,数据库是oracle 10g。现要将我的机器里的文本文件datafile.txt导入到远程数据库中,
  现在文件里的记录数达几千万。
  datafile.txt文本内容:
  js1a,192.168.2.254:80:,RUNNING
  other,192.168.2.254:80:test.com,STOPPED
  third,192.168.2.254:81:thirdabc.com,RUNNING
  ……
  从中,我们看出有3列,分别以逗号分隔,为变长字符串。
  首先,我们现在数据库建好表
  create table mydata
  (
  mac_name varchar2(10),
  mac_ip varchar2(50),
  status varchar2(10)
  )
  现在我们先整理控制文件myldr.ctl(文件名可以自定义)
  myldr.ctl内容:
  load data
  infile 'datafile.txt'
  into table mydata
  (mac_name char terminated by ',',
  mac_ip char terminated by ',',
  status char terminated by whitespace)
  说明:
  infile 指数据源文件 这里我们省略了默认的 discardfile result.dsc   badfile   result.bad
  into table mydata 默认是INSERT,也可以into table mydata APPEND为追加方式,或REPLACE
  terminated by ',' 指用逗号分隔
  terminated by whitespace 结尾以空白分隔
  此时我们执行加载:
  D:/>sqlldr userid=sdsettle/stl123@js1a control=myldr.ctl log=ldr.log
  一开始我用的是plsql dev的文本导入器,那数据慢的,人都快崩溃了,平均一秒才导入100条数据,一千多万的数据,天啊!
  所以为了快点完成工作(其实是为了早点下班,嘿嘿),所以想到了用sql loader,以前只是听说这个导数据快,还没用过,所以赶紧
  拿这个试试,用了以后那效果,真的是谁用谁知道啊!原来导入估计要30多个小时,现在不到一个小时就搞定了!
  据说还可以并发操作,这个我没实验
  sqlldr userid=/ control=result1.ctl direct=true parallel=true
  sqlldr userid=/ control=result2.ctl direct=true parallel=true
  sqlldr userid=/ control=result2.ctl direct=true parallel=true
  当加载大量数据时(大约超过10GB),最好抑制日志的产生:
  SQL>ALTER TABLE mydata nologging;
  这样不产生REDO LOG,可以提高效率。然后在CONTROL文件中load data上面加一行:unrecoverable
  此选项必须要与DIRECT共同应用。
  在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到1-10G就算不错了,开始可用结构
  相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600496-1-1.html 上篇帖子: oracle程序块 下篇帖子: Oracle Gondel Gate
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表