oracle linux shell sqlloader导入文件以及exp备份的优化问题

在进行导入和导出的时候,因为数据源不是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
)


linux_sqlldr.sh

#!/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=$ROWS_SUBMIT direct=y

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之间时达到最优。


你可能感兴趣的:(ORACLE)