• Oracle--大数据迁移--sqlldr技术的应用


    1. 让表不产生REDO LOG
    SQL> ALTER TABLE  table_name   nologging;

    2.编写控制文件 *.ctl (重点)

    如 0120.ctl

    3.准备数据文件 

    如 0120.csv

    4. 在装有oracle服务的Linux服务器上执行

    sqlldr    db_user/db_pwd@//url:port/orcl   control=0120.ctl   direct=true ; 注意这里的数据库连接串是oracle 18c的写法。

    5. 执行结果

    先使用 echo $?  回车,结果为0是成功;它也会生成日志文件查看具体情况的

     

    详解0120.ctl的文件内容(以下表字段是原表的缩略版,删除了不少字段,但不影响使用)

    OPTIONS (skip=1,rows=5000,errors=0) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行(第一行往往是表头)
    unrecoverable                    -- 此选项必须要与DIRECT共同应用  
    LOAD DATA 
    CHARACTERSET 'UTF8'             --设置编码
    INFILE "0120.csv"                 --指定外部数据文件  
    --INFILE "0121.csv"              --若有多个数据文件要以前执行,则按照本行的写法继续写
                                    --这里还可以使 用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,  
    truncate                         --操作类型,truncate会清空表,还可以有 append 追加数据 
    INTO TABLE table_name             -- 要插入记录的表  
    Fields terminated by ","         -- 数据中每行记录用 "," 分隔  
    Optionally enclosed by '"'         -- 数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时  
    trailing nullcols                 --表的字段没有对应的值时允许为空  
    (  
    --  virtual_column FILLER,         --这是一个虚拟字段,用来跳 过由 PL/SQL Developer 生成的第一列序号,若有则需要跳过该列,否则注释掉  
      oid "sys_guid()"        ,          -- 第一个主键字段使用 oracle的uuid函数生成
      instcode                       ,-- 默认是varchar类型的,默认最大支持255的长度,如果超长的自己要手动设长度  如 instcode char(1024),
      instname                       ,   
      name                           , 
      idcard                       ,  
      phone                           , 
      dayavginsuranceassets           NULLIF (dayavginsuranceassets="") "to_number(:dayavginsuranceassets)"    ,  --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL  
      banktimepointassets           NULLIF (banktimepointassets="") "to_number(:banktimepointassets)"    ,          --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL 
      enterpriseassetsratio                    , 
      systime            "sysdate"  , --这里使用系统默认生产时间,日期字段也可以参考number类型,使用to_date("yyyy-MM-dd",:systime)
      updatetime        "sysdate"  , --这里使用系统默认生产时间,日期字段也可以参考number类型,使用to_date("yyyy-MM-dd",:updatetime)
      dayavgcurrentassets_total      NULLIF (dayavgcurrentassets_total="") "to_number(:dayavgcurrentassets_total)"     , --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL 
      stat_date                            ,
      stat_dd                              , 
      city_code                
    ) 

    csv文件,因保密原因只能截图部分字段

     

    输出日志

     

    经验之谈:

    1. 如果分成几个csv格式的文件插入到同一个表完成数据的导入,第一个用truncate,后面的几个请使用append;

    2. 如果把多个文件让一个ctl执行时,切记后面的文件不能有表头第一行;

    我参考了两篇文章

    sqlldr的用法 (这个最完整)

    sqlldr使用详解

  • 相关阅读:
    SaaS模式应用之多租户系统开发(单数据库多Schema设计)
    web-api POST body object always null
    linq to js 用法
    c#导出数据到csv文本文档中,数据前面的0不见了解决方法
    金蝶BOS元模型分析
    DotNet 资源大全中文版
    JavaScript中的类方法、对象方法、原型方法
    解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题
    在需要隐藏navigationController控制器
    升级macOS Sierra系统 导致错误 app: resource fork, Finder information, or similar detritus not allowed
  • 原文地址:https://www.cnblogs.com/xin1006/p/14306309.html
Copyright © 2020-2023  润新知