Oracle Csv格式文件导入SQLLDR
背景
最近工作需要把Mysql数据导入到Oracle,于是想到了SQLLDR(SQLLDR是Oracle服务端自带的工具)。趁这次机会整理份操作文档方便后续查看。
SQL*Loader支持3种数据加载方式:
- 传统路径加载(direct=false):等同于insert语句(默认)
- 直接路径加载(direct=true):绕过SGA,把数据直接导入高水位线(HWM)以上,可设置并行加载,性能比传统路径加载更高,但限制也更多;
no_index_errors:默认为false,如果为true表示在加载过程中不会把index设为unusable(在此方式可用); - 外部表加载:先为数据文件上创建一个外部表,然后再把数据从外部表insert到目标表中
常用参数介绍:
- errors:最大允许错误的记录数
- discardmax :最大允许丢弃的记录数
- parallel:默认为false,如果为true表示启用并行加载
- skip_index_maintenance:默认为false,如果为true表示在加载过程中停止索引的维护
- rows:表示达到多少行将提交,默认(传统路径加载64,直接路径加载all)
- skip:省略最前面的记录数
- CHARACTERSET UTF8 :导出文件的字符集,以及导入目标字符集
数据加载对目标表处理方式:
- SQL*Loader是以INSERT方式加载数据,目标表必须是空表,否则会报错;(默认)
- APPEND:添加数据至源数据的后面
- REPLACE:在添加数据之前,先执行DELETE FROM TABLE把表清空,注意:这里的REPLACE是表级别的替代,而不是行级别
- TRUNCATE:在添加数据之前,先执行TRUNCATE TABLE table_name REUSE STORAGE
注:SQL*Loader不支持对已存在的行更新,如果你想更新已存在的行,则必须先把数据加载至一个空的中间表,然后在原表和中间表进行关联update
示例:
环境准备
- 准备CSV数据:t.csv
"status","amt","create_time"
"A","90","2024-02-26 13:37:28"
"B","100","2024-03-26 13:37:28"
"B","123","2023-01-26 13:37:28"
"A","10","2024-01-26 13:37:28"
"A","1","2024-03-26 13:37:28"