while [[ $date < $enddate ]] do echo $date sh ora_csv.sh $date > test_server_log_$date & date=`date -d "+1 day $date" +%Y%m%d` done
ora_csv.sh的脚本内容如下: sqlplus -s / as sysdba < set pages 0 set feedback off set echo off set trimout on set trimspool on set linesize 500 set headsep off select ID ||','|| SN ||','|| GROUP_ID ||','|| SERVER_IP ||','|| SERVER_NAME ||','|| .... CLIENT_STYLE csv_col from test.test_server_log partition (SERVER_LOG_$1) ; EOF 这个脚本一旦运行,就会同时开启多个导出的session,每个分区都会有一个独立的session来导出相应的数据,分区的命名也是规范的,这就为导出提供了很大的便利。 比如导出2011年8月2日到2012年10月1日的数据,就可以这样运行脚本 sh ora_exp.sh 2011-08-29 2012-10-01 但是第一次导出的时候,为了省事,给了一个较大的时间范围,结果同时上百个session导出,风风火火,速度确实还是很快,但是马上碰到的问题就是空间开始告紧。 尽管自己也删除了部分的数据,但是最后还是有一部分的导出失败,总体的感觉就是这种方式看起来还是比较快,但是不太可控,尤其某一个小的环境出问题还是不太好定位。 所以吸取了经验,调整了时间范围,把它切分为多个时间段,导出的文件马上压缩,按照测试的数据来看3G的文件压缩后大概在500M,压缩比还是比较理想的,按照这种情况就需要简单评估最多需要开启多少个并行的导出session了。 以一个dump最大3G的标准,压缩比为500G,有100G的剩余空间,那就是100/3.5总体能够开启30个并行的session了。 所以按照这个基本的思路,就在ora_exp.sh脚本中加入了压缩的部分。每个时间段都是串行执行。 date=`date -d "+0 day $1" +%Y%m%d` enddate=`date -d "+1 day $2" +%Y%m%d`