通过sqlldr将txt文件导入oracle数据库

有个项目每天要往数据库里插入大量的数据,峰值大概每秒一万条左右。如果直接用insert语句,即使使用了批量也效果不是很理想。
听说从文件导入的方式效率很高,所以尝试一下。

【创建一个表】
CREATE TABLE T_20200310_TEST 
(
  PHONE VARCHAR2(20 BYTE) NOT NULL 
, NAME VARCHAR2(20 BYTE) NOT NULL 
, AGE VARCHAR2(20 BYTE) NOT NULL 
, CREATETIME DATE NOT NULL 


【写一个CTL文件】命名:20200311_insert.ctl
load data
characterset utf8
INFILE '/user/InputTxt2OracleTest/InputFile.txt' -- txt文件所在路径
Append into table T_20200310_TEST -- 要导入的表名称
fields terminated by "|" -- 字段分隔符
(
phone char(16) "replace(:CONTENT,'XXX','YYY')", -- 把txt对应字段中的XXX替换为YYY
name char(1000), -- 要导入字段的最大长度,如果不写默认是255
age,
createtime date'YYYYMMDDhh24miss' -- 要导入的时间格式
)

【创建一个txt文件】
13900001260|老大|48|20190901103133
13800007326|老二|38|20190802113234
13400005323|老三|40|20190703123335
13000000196|老四|65|20190604133436
13600009320|老五|68|20190505143537

【用oracle用户调用CTL】
sqlldr userid=oracle用户名/oracle密码@oracle的sid control=/user/InputTxt2OracleTest/20200311_insert.ctl

【导入完成】

我计划让程序一直生成文件,然后让oracle用户自动执行20200311_insert.ctl,不停的向数据库里导入记录。

首先写一个.sh脚本里面一句话就行:
sqlldr userid=oracle用户名/oracle密码@oracle的sid control=/user/InputTxt2OracleTest/20200311_insert.ctl

然后让crontab来定时调用这个.sh,我设置的是每分钟执行一次:
*/1 * * * * su - oracle -c "/home/oracle/test.sh"

这样就实现了数据的高速导入。但是要注意,这个还是受限于服务器的配置和磁盘io速度。

你可能感兴趣的:(通过sqlldr将txt文件导入oracle数据库)