数据导入导出Oracle数据库

临近春节,接到了一个导入数据的任务,在Linux客户端中的数据有50G,大约3亿3千万行;

刚开始很天真,把原始的txt/csv文件用sh脚本转化成了oralce 的insert into 语句,然后分割原始文件,用sqlplus@文件名导入。

step1
txt 转化为sql

cnt=0
cat /nfsdata/table/dayinsert.txt | awk -F' ' '{ if (cnt<100) { cnt=cnt+1; } else { cnt=0; print "commit;"} print "insert into test_bd (day, daynight, daytomo) values ('\''" $1"'\'','\''"$2"'\'','\''"$3"'\'');"}' >> dayinsert.sql &
echo "commit;"


step 2
sql  上传到 db
nohup /u01/oracle/app/oracle/product/11.2.0/client/bin/sqlplus "user_name/password"@service_name @ dayinsert.sql >>dayinsert.log 2>&1 &

 

结果,第二天直接把oracle数据搞趴掉了。

 

时间越来越短,心情越来越糟。。。。。。经过一番折腾,同事给了sqlldr连接工具,尝试下;

 

load data            
    infile *
    append
    into table test_table        ##要插入的数据库表名
    FIELDS TERMINATED BY ','  ##注意分割符号
    TRAILING NULLCOLS
(
字段1,
字段2,
等等
)

把上述代码放入文件  filename.ctl 文件中

导入命令  sqlldr userid="user_name/password"@service_name control=finename.ctl data=/test.txt

 

该方法很快完成了我的数据导入,而且bug很少。推荐大家使用。

 

从oracle导出数据

把要执行的sql语句放入文件test.sql中,比如select * from dayinsert;
把如下代码放入testexport.sql中
-------------------------------------------------
set echo off;
set feedback off;
set verify off;
set term off;
set trimspool on;
set linesize 3000;
--set pagesize 999;
set newpage none;
set heading off;

spool resultexport.txt;   ##输出结果的文件名字,可自定义
@test.sql;           ##要执行的sql语句,本例为test.sql
spool off;


---------------------------------------------

建立运行脚本run.sh, 放入如下代码


nohup sqlplus "user_name/password"@service_name @testexport.sql &

 

 

 

 

 

#######################################################

1  source profile 不成功,可能是bash没有起来,输入bash,启动bash命令;

2 怎么从一个大文件筛选出符合要求的条目;

cat ./sample.txt|while read line
do
cat ./source.txt |grep "$line" >> result.txt

done

 

第一次导入数据的经历,写下来留待以后查看。。。。

 

参考资料:

1 shell 拆分文件 http://blog.sina.com.cn/s/blog_551d7bff0100szyt.html

(完)

 

你可能感兴趣的:(数据导入导出Oracle数据库)