在进行导入和导出的时候,因为数据源不是exp导出的,所以需要自己写控制文件。
linux_sql.ctl(如果需要从shell脚本中向ctl中传递变量,参考这里的第三条)
load data infile './test.unl' append into table TBL_MERCH_INFO_TEST fields terminated by '@|#' trailing nullcols ( MERCH_ID,CLIENT_ID,PROV_CODE,BRANCH_ID,AREA )
#!/bin/bash DATE_STRING=$(date +%Y%m%d) DATE_STRING_LOG=${DATE_STRING}"log" DATE_STRING_BAD=${DATE_STRING}"bad" ERRORS_NUM=1000 ROWS_SUBMIT=200000 DB_USER="user" DB_PASS="password" DB_SERVICE="localhost/orcl" mkdir $DATE_STRING if [ ! -d $DATE_STRING ] then echo "[日志目录创建失败] $DATE_STRING" exit -1 fi echo "开始导入..." sqlldr $DB_USER/$DB_PASS@$DB_SERVICE control=linux_sql.ctl log=$DATE_STRING/$DATE_STRING_LOG.log bad=$DATE_STRING/$DATE_STRING_BAD.log errors=$ERRORS_NUM rows=<span style="color:#ff0000;">$ROWS_SUBMIT</span> <span style="background-color: rgb(255,0);">direct=y</span> echo "导入完成。"数据总量大概在125W条左右,之前的rows_submit设置的太小了,全部导入需要17分钟,改为100000或者200000后,可以达到3分钟左右
按表备份,因为不需要备份所有的表,所以只把自己需要的提取出来备份就可以
linux_exp.sh
#!/bin/bash DATE_STRING=$(date +%Y%m%d) DB_USER="user" DB_PASS="password" DB_SERVICE="localhost/orcl" DB_BUFFER=10240000 mkdir -p $DATE_STRING if [ ! -d $DATE_STRING ] then echo "[备份目录创建失败] $DATE_STRING" exit -1 fi echo "[表备份目录] $DATE_STRING" echo "开始按表进行备份..." #从数据库中读取数据表的名称 SLCT_TBLNM_RSLT=` sqlplus -s $DB_USER/$DB_PASS@$DB_SERVICE<< EOF set echo off Feedback off heading off underline off; select TABLE_NAME from USER_TABLES where TABLE_NAME like 'TBL%'; commit; exit; EOF` #开始进行数据库备份 for loop in `echo "$SLCT_TBLNM_RSLT" | sed 's/ //g;s/-//g'` do FILENAME=`echo $loop` exp $DB_USER/$DB_PASS@$DB_SERVICE buffer=$DB_BUFFER file=./$DATE_STRING/$FILENAME.dmp tables=$loop done echo "按表备份结束" exit 0关键在于buffer,之前buffer值设为64000的时候,需要大概3分钟,设为10240000,只需要18s,buffer的值在1024000到10240000之间时达到最优。