#!/bin/ksh #=========================================================================== #filename:dbload.sh #功能: #从文件导入海量数据到informix数据库中 #主要是解决海量数据导入问题,当直接使用形如: #load from loadfile.txt insert into tablename; #导入数据时,如果数据超过几百万条则会使缓存被充满而无法导入 #input: nameDB nameTable dataFile #注意: #1.程序需要informix load 支持 #2.数据文件第行应以"|"结尾 #=========================================================================== #参数输入 if [ $# -ne 3 ];then cat << EOF Usage: $0 nameDB nameTable dataFile nameDB 数据库名 nameTable 数据库表名 dataFile 即将导入数据库的数据文件 EOF exit 1 fi nameDB="$1" #数据库名 nameTable="$2" #数据库表名 dataFile="$3" #即将导入数据库的数据文件 if [ ! -f "$dataFile" ];then echo "<ERROR>数据文件[$dataFile]不存在!" | tee -a $errLog exit 1 fi tmpStr0=`echo $dataFile | sed "s/\//_/g"` errLog="${tmpStr0}_E.log" #日志 :>$errLog delimStr="|" #数据文件中数据分隔符 commitNum=100000 #一次提交的数据条数 canErrNum=1000000 #容许错误的条数 loadCMDFile="load$$.cmd" #load命令文件 tmpFile="`basename $dataFile`.tmp" #临时文件 trap "myExit" 0 1 2 3 9 11 15 myExit() { #程序退出前删除临时文件 #删除load命令文件 rm -f $loadCMDFile rm -f $tmpFile #如果日志文件是空的删除 if [ ! -f "$errLog" ];then return fi _tmpNum="`cat $errLog | wc -c`" _tmpNum="`expr $_tmpNum`" if [ $_tmpNum -eq 0 ];then rm -f $errLog fi } lineNum="`cat $dataFile | wc -l`" #数据行数 lineNum="`expr $lineNum`" if [ $lineNum -eq 0 ];then echo "<ERROR>数据文件[$dataFile]是空的!" | tee -a $errLog exit 1 fi #数据文件数据列数 colNum=`head -n1 $dataFile | awk -F"|" '{print NF}'` #数据文件中的数据行最后有一个"|" colNum=` expr $colNum - 1 ` cat << EOF > $loadCMDFile file "$dataFile" delimiter "$delimStr" $colNum; insert into $nameTable; EOF if [ ! -f "$loadCMDFile" ];then echo "<ERROR>load命令文件[$loadCMDFile]不存在!" | tee -a $errLog exit 1 fi :> $tmpFile dbload -d $nameDB -c $loadCMDFile -l $errLog -n $commitNum -e $canErrNum>> $tmpFile 2>&1 #| tee -a $tmpFile 2>&1 #cat $tmpFile echo "[提示]数据文件行数: $lineNum" #获取导入的数据条数 grepStr="Table $nameTable had " tmpStr=`grep "$grepStr" $tmpFile` insertNum=0 if [ "$tmpStr" != "" ];then for str in $tmpStr do tmpStr2=`echo $str | grep "^[0-9]*$"` if [ "$tmpStr2" = "" ];then continue else insertNum=` expr $str ` echo "[提示]总计导入条数: $insertNum" errNum=` expr $lineNum - $insertNum ` if [ $errNum -gt 0 ];then echo "[ERROR]导入失败条数: $errNum" exit 1 else echo "[OK]导入成功!" fi break fi done else echo "[ERROR]导入失败条数: $lineNum" exit 1 fi源程序发布者informixchina bbs 新程序有改动。我的生产数据为约:2000W条