Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103070337
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-04-08 21:31:32

作者:大梦   
  #!/bin/sh 

# 说明: 
# +--------------+ +--------------+ 
# | dbexport备份 | ----> WorkDir和dbfname两变量 ----> | dbimport恢复 | 
# +--------------+ +--------------+ 

# 共用环境变量 
INformIXDIR=/usr/informix 
INformIXSERVER=online 
PATH=$PATH:$INformIXDIR/bin:$INformIXDIR/etc:. 
LD_LIBRARY_PATH=$INformIXDIR/lib:$INformIXDIR/lib/esql:$INformIXDIR/lib/tools 
TERM=vt100 
TERMCAP=$INformIXDIR/etc/termcap 
export INformIXDIR INformIXSERVER PATH LD_LIBRARY_PATH TERM TERMCAP 

# 备份输出的目录,也是恢复的目录 
WorkDir="/data/backup" 

# 存放成功备份的数据库名列表文件,也是恢复时用的文件名 
dbfname="Database.list" 

############################################### 
## ## 
## 下载函数 ## 
## ## 
############################################### 

# 下载数据库名列表($allfname), 为dbexport提供数据库名 
unloadalldb() 

echo "下载$INformIXSERVER数据库名列表 . . ." 
echo "下载$INformIXSERVER数据库名列表 . . ." >>$logfname 
isql sysmaster - /dev/null 
unload to "$allfname" delimiter " " 
select name from sysdatabases 
where name not in ("sysmaster""sysutils"); 




# 从 $inputfname 文件中读取库名,并执行下载 
exportdb() 

# 定义有关数据库在恢复(dbimport)过程中,是否要进行清空日志操作的时间(分钟)阀值 
# curontape 当前数据库需要清空日志 
# nextontape 如果当前数据库的数据量过大,恢复时会用去大量的日志, 
# 而导致下一个库在恢复时无足够的日志而失败 
curontapetimes=4 
nextontapetimes=10 

# 是否要进行清空日志操作 
curisontape=0 
nextisontape=0 

echo "Export Begin : `date` . . .">>$logfname 
for dbname in `cat $inputfname` 
do 
echo "正在备份$dbname . . ." 
if [ -e "$dbname.exp" ] 
then 
rm -r "$dbname.exp" 
fi 
beginhour=`date +%H` 
beginminute=`date +%M` 
dbexport $dbname 1>$msgfname 2>&1 
if [ "$?" = "0" ] 
then # 备份成功,必须进行是否清日志的判定 
endhour=`date +%H` 
endminute=`date +%M` 
exporthour=`expr $endhour - $beginhour` 
if [ $exporthour -lt 0 ] 
then 
exporthour=`expr $exporthour + 24` 
fi 
exportminute=`expr $endminute - $beginminute` 
if [ $exportminute -lt 0 ] 
then 
exportminute=`expr $exportminute + 60` 
fi 
exporttimes=`expr $exporthour + $exportminute` 
if [ $nextisontape -le 0 ] 
then 
if [ $exporttimes -ge $curontapetimes ] 
then 
curisontape=1 
else 
curisontape=0 
fi 
else 
curisontape=1 
fi 
if [ $exporttimes -ge $nextontapetimes ] 
then 
nextisontape=1 
else 
nextisontape=0 
fi 
echo "备份$dbname . . . Success" >>$logfname 
echo " Begin : $beginhour:$beginminute" >>$logfname 
echo " End : $endhour:$endminute" >>$logfname 
echo " Interval=$exporttimes Current ontape=$curisontape Next ontape=$nextisontape" >>$logfname 
echo "$curisontape$dbname" >>$successfname 
else # 备份失败 
echo "备份$dbname . . . Fail" >>$logfname 
echo "以下为失败原因:" >>$logfname 
cat $msgfname >>$logfname 
echo "$dbname" >>$failfname 
fi 
done 
echo "Export End : `date` . . .">>$logfname 



# dbexport的主程序 
exportmain() 

# 定义dbexport中用到的有关文件 
inputfname="Export.input" 
allfname="Export.all" 
successfname="Export.success" 
failfname="Export.fail" 
msgfname="Export.message" 
logfname="Export.logfile" 

while true 
clear 
echo "\n\n 
说明:1> 必须确保无任何用户正在访问数据库,否则会备份失败,或在程序 
中加入杀线程的语句 
2> 修改数据库在恢复过程中是否要进行清空日志操作的时间(分钟)阀值 
3> 会删除原有的备份数据 

备份选项: 1. 备份全部的库 
2. 仅备份失败的 
3. 全部库名列表 
4. 成功库名列表 
5. 失败库名列表 
6. 查阅备份日志 
0. 退 出 
选择:\c" 
read menuoptions 
do 
case "$menuoptions" in 
'0' ) cp $successfname $dbfname 
break 
;; 
'1' ) # 清空有关文件 
cat /dev/null >$inputfname 
cat /dev/null >$allfname 
cat /dev/null >$successfname 
cat /dev/null >$failfname 
cat /dev/null >$msgfname 
cat /dev/null >$logfname 
unloadalldb 
if [ -s "$allfname" ] 
then 
cp $allfname $inputfname 
exportdb 
else 
echo "没有数据库可供备份($allfname)" 
sleep 1 
fi 
;; 
'2' ) if [ -s "$failfname" ] 
then 
cp $failfname $inputfname 
cat /dev/null >$successfname 
cat /dev/null >$failfname 
cat /dev/null >$msgfname 
cat /dev/null >$logfname 
exportdb 
else 
echo "没有备份失败的数据库可供备份($failfname)" 
sleep 1 
fi 
;; 
'3' ) if [ ! -s "$allfname" ] 
then 
unloadalldb 
fi 
if [ -s "$allfname" ] 
then 
pg $allfname 
else 
echo "没有可供备份的数据库($allfname) " 
sleep 1 
fi 
;; 
'4' ) if [ -s "$successfname" ] 
then 
pg $successfname 
else 
echo "没有已成功备份的数据库($successfname)" 
sleep 1 
fi 
;; 
'5' ) if [ -s "$failfname" ] 
then 
pg $failfname 
else 
echo "没有备份失败的数据库($failfname)" 
sleep 1 
fi 
;; 
'6' ) if [ -s "$logfname" ] 
then 
pg $logfname 
else 
echo "日志文件($logfname)没有内容" 
sleep 1 
fi 
;; 
esac 
done 



################################################## 
## ## 
## 恢复函数 ## 
## ## 
################################################## 

## 生成sed脚本,并为informix自动定义的约束改名 
sedscript() 

## 为informix自动定义的约束名改名 
## Constraint type: 
## C = Check constraint 
## P = Primary key 
## R = Referential 
## U = Unique 
## N = Not null 
## Constraint format: 
## {[0-9]}_{[0-9]} 
## script
## s/constraint \"informix\".c0/constraint \"informix\".chk0/g 
## s/constraint \"informix\".c1/constraint \"informix\".chk1/g 
## s/constraint \"informix\".c2/constraint \"informix\".chk2/g 
## s/constraint \"informix\".c3/constraint \"informix\".chk3/g 
## s/constraint \"informix\".c4/constraint \"informix\".chk4/g 
## s/constraint \"informix\".c5/constraint \"informix\".chk5/g 
## s/constraint \"informix\".c6/constraint \"informix\".chk6/g 
## s/constraint \"informix\".c7/constraint \"informix\".chk7/g 
## s/constraint \"informix\".c8/constraint \"informix\".chk8/g 
## s/constraint \"informix\".c9/constraint \"informix\".chk9/g 
## 

echo " 
s/constraint \"informix\".c0/constraint \"informix\".chk0/g 
s/constraint \"informix\".c1/constraint \"informix\".chk1/g 
s/constraint \"informix\".c2/constraint \"informix\".chk2/g 
s/constraint \"informix\".c3/constraint \"informix\".chk3/g 
s/constraint \"informix\".c4/constraint \"informix\".chk4/g 
s/constraint \"informix\".c5/constraint \"informix\".chk5/g 
s/constraint \"informix\".c6/constraint \"informix\".chk6/g 
s/constraint \"informix\".c7/constraint \"informix\".chk7/g 
s/constraint \"informix\".c8/constraint \"informix\".chk8/g 
s/constraint \"informix\".c9/constraint \"informix\".chk9/g 

s/constraint \"informix\".p0/constraint \"informix\".pri0/g 
s/constraint \"informix\".p1/constraint \"informix\".pri1/g 
s/constraint \"informix\".p2/constraint \"informix\".pri2/g 
s/constraint \"informix\".p3/constraint \"informix\".pri3/g 
s/constraint \"informix\".p4/constraint \"informix\".pri4/g 
s/constraint \"informix\".p5/constraint \"informix\".pri5/g 
s/constraint \"informix\".p6/constraint \"informix\".pri6/g 
s/constraint \"informix\".p7/constraint \"informix\".pri7/g 
s/constraint \"informix\".p8/constraint \"informix\".pri8/g 
s/constraint \"informix\".p9/constraint \"informix\".pri9/g 

s/constraint \"informix\".r0/constraint \"informix\".ref0/g 
s/constraint \"informix\".r1/constraint \"informix\".ref1/g 
s/constraint \"informix\".r2/constraint \"informix\".ref2/g 
s/constraint \"informix\".r3/constraint \"informix\".ref3/g 
s/constraint \"informix\".r4/constraint \"informix\".ref4/g 
s/constraint \"informix\".r5/constraint \"informix\".ref5/g 
s/constraint \"informix\".r6/constraint \"informix\".ref6/g 
s/constraint \"informix\".r7/constraint \"informix\".ref7/g 
s/constraint \"informix\".r8/constraint \"informix\".ref8/g 
s/constraint \"informix\".r9/constraint \"informix\".ref9/g 

s/constraint \"informix\".u0/constraint \"informix\".uni0/g 
s/constraint \"informix\".u1/constraint \"informix\".uni1/g 
s/constraint \"informix\".u2/constraint \"informix\".uni2/g 
s/constraint \"informix\".u3/constraint \"informix\".uni3/g 
s/constraint \"informix\".u4/constraint \"informix\".uni4/g 
s/constraint \"informix\".u5/constraint \"informix\".uni5/g 
s/constraint \"informix\".u6/constraint \"informix\".uni6/g 
s/constraint \"informix\".u7/constraint \"informix\".uni7/g 
s/constraint \"informix\".u8/constraint \"informix\".uni8/g 
s/constraint \"informix\".u9/constraint \"informix\".uni9/g 

s/constraint \"informix\".n0/constraint \"informix\".not0/g 
s/constraint \"informix\".n1/constraint \"informix\".not1/g 
s/constraint \"informix\".n2/constraint \"informix\".not2/g 
s/constraint \"informix\".n3/constraint \"informix\".not3/g 
s/constraint \"informix\".n4/constraint \"informix\".not4/g 
s/constraint \"informix\".n5/constraint \"informix\".not5/g 
s/constraint \"informix\".n6/constraint \"informix\".not6/g 
s/constraint \"informix\".n7/constraint \"informix\".not7/g 
s/constraint \"informix\".n8/constraint \"informix\".not8/g 
s/constraint \"informix\".n9/constraint \"informix\".not9/g 
" > $scriptfname 
echo "为informix自动定义的约束改名" 
echo "为informix自动定义的约束改名" >>$logfname 
for recline in `cat $inputfname` 
do 
dbname=`expr substr "$recline" 2 22` 
if [ -z "$dbname" ] 
then 
continue 
fi 
echo "\t$dbname . . ." 
echo "\t$dbname . . ." >>$logfname 
sqlfname="$dbname.exp/$dbname.sql" 
if [ ! -s "$sqlfname.bak" ] 
then 
cp $sqlfname $sqlfname.bak 
sed -f $scriptfname $sqlfname > $sedfname 
cp $sedfname $sqlfname 
fi 
done 




importdb() 

echo "\n上载数据库($INformIXSERVER) Begin : `date`" >>$logfname 

echo "1> 装载数据库结构" 
echo "\n1> 装载数据库结构" >>$logfname 
count=0 
maxcount=10 ## 最大失败上载次数 
while true 
echo "循环次数=$count" >>$logfname 
for recline in `cat $inputfname` 
do 
isontape=`expr substr "$recline" 1 1` 
dbname=`expr substr "$recline" 2 20` 
if [ -z "$isontape" ] 
then 
isontape=0 
fi 
if [ -z "$dbname" ] 
then 
continue 
fi 
echo "\t$dbname . . . " 

isql - - /dev/null 
drop database $dbname; 
create database $dbname with log; 


dbaccess $dbname $dbname.exp/$dbname.sql 1>/dev/null 2>$msgfname 
if [ $? -eq 0 ] 
then 
echo "Database=$dbname . . . Success" >>$logfname 
echo "$isontape$dbname" >> $successfname 
else 
echo "Database=$dbname . . . Fail" >>$logfname 
echo "$isontape$dbname" >> $failfname 
fi 
if [ $count -eq $maxcount ] 
then 
cat $msgfname >> $logfname 
fi 
done 
do 
count=`expr $count + 1` 
if [ $count -gt $maxcount ] 
then 
break 
else 
if [ -s $failfname ] 
then 
mv $failfname $inputfname 
cat /dev/null > $failfname 
else 
break 
fi 
fi 
done 

echo "2> 装载成功的数据库数据" 
echo "2> 装载成功的数据库数据" >>$logfname 
for recline in `cat $successfname` 
do 
isontape=`expr substr "$recline" 1 1` 
dbname=`expr substr "$recline" 2 20` 
if [ -z "$isontape" ] 
then 
isontape=0 
fi 
if [ -z "$dbname" ] 
then 
continue 
fi 
echo "\t$dbname . . ." 

if [ "$isontape" != "0" ] 
then 
echo "ontape -a . . ." >> $logname 
echo "\ny\n"|ontape -a 1>>$logname 2>&1 
fi 

isql - - /dev/null 
drop database $dbname; 

dbimport -l $dbname 1>$msgfname 2>&1 
if [ "$?" = "0" ] 
then 
echo "Database=$dbname . . . Success" >>$logfname 
else 
echo "Database=$dbname . . . Fail" >>$logfname 
cat $msgfname >>$logfname 
fi 
done 

echo "Import End : `date`" >>$logfname 




# dbimport的主程序 
importmain() 


## 用于 dbimport 的文件名称 
inputfname="Import.input" ## 用于dbimport的输入的数据库名文件 
sedfname="Import.sed" ## 为informix自动定义的约束名改名的中间文件 
scriptfname="Import.sedscript" ## sed的脚本文件 
msgfname="Import.message" ## 建库结构时存放出错信息 
successfname="Import.success" ## dbimport成功的数据库名文件 
failfname="Import.fail" ## dbimport失败的数据库名文件 
logfname="Import.logfile" ## dbimport建库结构的全过程信息(日志) 

if [ ! -e "$inputfname" ] 
then 
cat /dev/null >$inputfname 
fi 
if [ ! -e "$sedfname" ] 
then 
cat /dev/null >$sedfname 
fi 
if [ ! -e "$scriptfname" ] 
then 
cat /dev/null >$scriptfname 
fi 
if [ ! -e "$successfname" ] 
then 
cat /dev/null >$successfname 
fi 
if [ ! -e "$failfname" ] 
then 
cat /dev/null >$failfname 
fi 

cat /dev/null >$logfname 
cat /dev/null >$msgfname 

while true 
clear 
echo "\n\n 
说明: 
1> 确保有足够的日志空间供一个数据库恢复用,恢复过程中会依据 
备份时的设定自动清日志 
2> 由于清日志会占用长时间,建议将日志设备设为/dev/null 
3> 恢复时间相对较长,请耐心等待 . . . 


备份选项: 1. 恢复数据库 
2. 仅恢复失败的 
3. 全部库名列表 
4. 成功库名列表 
5. 失败库名列表 
6. 查阅恢复日志 
0. 退 出 
选择:\c" 
read menuoptions 
do 
case "$menuoptions" in 
'0' ) break 
;; 
'1' ) if [ -s "$dbfname" ] 
then 
cp $dbfname $inputfname 
sedscript 
importdb 
else 
echo "没有数据库可供恢复($dbfname)" 
sleep 1 
fi 
;; 
'2' ) if [ -s "$failfname" ] 
then 
cp $failfname $inputfname 
sedscript 
importdb 
else 
echo "没有失败的数据库可供恢复($failfname)" 
sleep 1 
fi 
;; 
'3' ) if [ -s "$dbfname" ] 
then 
pg $dbfname 
else 
echo "没有可供恢复的数据库($dbfname)" 
sleep 1 
fi 
;; 
'4' ) if [ -s "$successfname" ] 
then 
pg $successfname 
else 
echo "没有已成功恢复的数据库($successfname)" 
sleep 1 
fi 
;; 
'5' ) if [ -s "$failfname" ] 
then 
pg $failfname 
else 
echo "没有恢复失败的数据库($failfname)" 
sleep 1 
fi 
;; 
'6' ) if [ -s "$logfname" ] 
then 
pg $logfname 
else 
echo "日志文件($logfname)没有内容" 
sleep 1 
fi 
;; 
esac 
done 



################################################## 
## ## 
## 主程序 ## 
## ## 
################################################## 
oldpath=`pwd` 
while true 
clear 
cd "$oldpath" 
echo "\n\n\n 
备份恢复程序 

正确设置环境变量INformIXDIR、INformIXSERVER和 
WorkDir(备份和恢复的工作目录) 
当前值:INformIXDIR=$INformIXDIR 
INformIXSERVER=$INformIXSERVER 
WorkDir=$WorkDir 


选项: 1> 用dbexport备份 
2> 用dbimport恢复 
3> 删除所有的库 
0> 退 出 
选择:\c" 
read mainoptions 
do 
if [ "$mainoptions" = "0" ] 
then 
break 
fi 
if [ -z "$INformIXDIR" ] 
then 
echo "没有设置INformIXDIR环境变量" 
sleep 1 
continue 
fi 
if [ -z "$INformIXSERVER" ] 
then 
echo "没有设置INformIXSERVER环境变量" 
sleep 1 
continue 
fi 
if [ -z "$WorkDir" ] 
then 
echo "没有设置WorkDir环境变量" 
sleep 1 
continue 
fi 
if [ \( ! -d "$WorkDir" \) -o \( ! -w "$WorkDir" \) ] 
then 
echo "WorkDir指定的目录必须有读写权限" 
sleep 1 
if [ ! -d "$WorkDir" ] 
then 
echo "创建目录$WorkDir . . ." 
mkdir $WorkDir 
else 
continue 
fi 
fi 
case "$mainoptions" in 
'1' ) cd $WorkDir 
exportmain 
;; 
'2' ) cd $WorkDir 
importmain 
;; 
'3' ) 
isql sysmaster - /dev/null 
unload to "DelDatabase.txt"" delimiter " " 
select name from sysdatabases 
where name not in ("sysmaster""sysutils"); 

for dbname in `cat DelDatabase.txt` 
do 
if [ -z "$dbname" ] 
then 
continue 
fi 
echo "删除$dbname . . ." 
isql - - /dev/null 
drop database $dbname; 

done 
;; 

esac 
done 
cd "$oldpath" 
 
 


# 无日志的备份与恢复 


# 数据库服务器不境设置 


# 公用定义 
pubfname="Database.$INformIXSERVER" 
WorkDir="`pwd`" 


####################### 
## 
## 下载部分 
## 
####################### 


# 下载数据库服务器中全部库名列表 

unloaddblist() 

echo ` 
isql sysmaster - "$expalldbfname" delimiter " " 
select name from sysdatabases 
where name not in ("sysmaster""sysutils"); 
!` 




# 生成附加SQL文本 

createadditionsql() 

expdropfname="Export.drop.sql" 
expnewfname="Export.new" 
expdifffname="Export.diff" 

echo "生成附加SQL文本 . . ." 
echo "生成附加SQL文本 . . ." >>$explogfname 
for dbname in `cat $expinputfname` 
do 
if [ -z "$dbname" ] 
then 
continue 
fi 
if [ "`expr substr $dbname 1 1`" = "#" ] 
then 
continue 
fi 
echo " $dbname" 
echo " $dbname" >>$explogfname 
# 下载原库结构 
exporigfname="$dbname.orig.sql" 
dbschema -d $dbname $exporigfname 
if [ "$?" != "0" ] 
then 
echo " dbschema 0 . . . fail" >>$explogfname 
echo "$dbname" >>$expfailfname 
continue 
fi 
echo " dbschema 0 . . . Success" >>$explogfname 

# 生成要处理的view、synonym、trigger和procedure列表 
echo ` 
isql $dbname - where tabid>=100 and tabtype in ("V""S"
union 
select trigname, "T" from systriggers 
union 
select procname, "P" from sysprocedures 
where mode in ("D""O"
into temp tmp_tables; 
unload to "$expdropfname" delimiter " " 
select case 
when trim(tabtype)="V" then "drop view" 
when trim(tabtype)="S" then "drop synonym" 
when trim(tabtype)="T" then "drop trigger" 
when trim(tabtype)="P" then "drop procedure" 
end, 
tabname, ";" 
from tmp_tables; 
!` 

# 删除view、synonym、trigger和procedure 
if [ ! -s "$expdropfname" ] 
then 
echo "$dbname" >>$expschemafname 
continue 
fi 
dbaccess $dbname $expdropfname 
if [ "$?" != "0" ] 
then 
echo " drop view、synonym、trigger & procedure . . . fail" >>$explogfname 
echo "$dbname" >>$expfailfname 
continue 
fi 
echo " drop view、synonym、trigger & procedure . . . success" >>$explogfname 

# 下载删除view、synonym、trigger和procedure后的库结构 
dbschema -d $dbname $expnewfname 
if [ "$?" != 0 ] 
then 
echo " dbschema 1 . . . fail" >>$explogfname 
echo "$dbname" >>$expfailfname 
continue 
fi 
echo " dbschema 1 . . . success" >>$explogfname 
echo "$dbname" >>$expschemafname 
diff $exporigfname $expnewfname | grep "^<" | sed 's/^< //g' >$expdifffname 
expadditionfname="$dbname.addi.sql" 
cat $expdropfname $expdifffname >$expadditionfname 
done 




# 下载数据库(删除view synonym procedure & trigger后的) 

exportdb() 

echo "export database . . ." 
echo "export database . . ." >>$explogfname 
for dbname in `cat $expschemafname` 
do 
if [ -z "$dbname" ] 
then 
continue 
fi 
if [ "`expr substr $dbname 1 1`" = "#" ] 
then 
continue 
fi 
echo " $dbname" 
if [ -e "$dbname.exp" ] 
then 
rm -r $dbname.exp 
if [ "$?" != "0" ] 
then 
echo " directory permission denied" >>$explogfname 
continue 
fi 
fi 
dbexport $dbname 
if [ "$?" = "0" ] 
then 
echo " $dbname . . . success" >>$explogfname 
echo "$dbname" >>$expsuccessfname 
else 
echo " $dbname . . . fail" >>$explogfname 
echo "$dbname" >>$expfailfname 
fi 
done 




# 下载主程序 

exportmain() 

expalldbfname="Export.all" 
explogfname="Export.log" 
expinputfname="Export.input" 
expschemafname="Export.schema" 
expsuccessfname="Export.success" 
expfailfname="Export.fail" 

while true 
clear 
echo "\n\n 
备 份 程 序 

说明: 1> 数据库备份输出在当前目录下,且有<库名.exp>+ 
<库名_addi.sql>两部分组成 
2> 确保备份时无任何用户访问数据库 


选项: 1> 全体备份 
2> 仅备份失败的 
3> 查全体库列表 
4> 查成功的列表 
5> 查失败的列表 
6> 查备份日志 
0> 退出 
选择:\c" 
read options 
do 
if [ "$options" = "0" ] 
then 
break 
fi 
case "$options" in 
'1' ) cat /dev/null > $expalldbfname 
cat /dev/null > $explogfname 
cat /dev/null > $expinputfname 
cat /dev/null > $expsuccessfname 
cat /dev/null > $expfailfname 
cat /dev/null > $expschemafname 

unloaddblist 
if [ -s "$expalldbfname" ] 
then 
cp $expalldbfname $expinputfname 
createadditionsql 
exportdb 
cp $expsuccessfname $pubfname 
else 
echo "没有数据库可供下载 !" 
sleep 1 
fi 
;; 

'2' ) cat /dev/null > $explogfname 
cat /dev/null > $expinputfname 
cat /dev/null > $expschemafname 

if [ -s "$expfailfname" ] 
then 
cp $expfailfname $expinputfname 
cat /dev/null > $expfailfname 
createadditionsql 
exportdb 
cp $expsuccessfname $pubfname 
else 
echo "没有失败的数据库需要重下载 !" 
sleep 1 
fi 
;; 

'3' ) if [ ! -s "$expalldbfname" ] 
then 
unloaddblist 
fi 
if [ -s "$expalldbfname" ] 
then 
pg $expalldbfname 
else 
echo "没有的数据库 !" 
sleep 1 
fi 
;; 

'4' ) if [ -s "$expsuccessfname" ] 
then 
pg $expsuccessfname 
else 
echo "没有已成功下载的数据库名 !" 
sleep 1 
fi 
;; 

'5' ) if [ -s "$expfailfname" ] 
then 
pg $expfailfname 
else 
echo "没有下载失败的数据库名 !" 
sleep 1 
fi 
;; 

'6' ) if [ -s "$explogfname" ] 
then 
pg $explogfname 
else 
echo "没有生成下载日志 !" 
sleep 1 
fi 
;; 
esac 
done 



################################ 
## 
## 上载部分 
## 
################################ 

## 生成sed脚本,并为informix自动定义的约束改名 
sedscript() 

## 为informix自动定义的约束名改名 
## Constraint type: 
## C = Check constraint 
## P = Primary key 
## R = Referential 
## U = Unique 
## N = Not null 
## Constraint format: 
## {[0-9]}_{[0-9]} 
## script
## s/constraint \"informix\".c0/constraint \"informix\".chk0/g 
## s/constraint \"informix\".c1/constraint \"informix\".chk1/g 
## s/constraint \"informix\".c2/constraint \"informix\".chk2/g 
## s/constraint \"informix\".c3/constraint \"informix\".chk3/g 
## s/constraint \"informix\".c4/constraint \"informix\".chk4/g 
## s/constraint \"informix\".c5/constraint \"informix\".chk5/g 
## s/constraint \"informix\".c6/constraint \"informix\".chk6/g 
## s/constraint \"informix\".c7/constraint \"informix\".chk7/g 
## s/constraint \"informix\".c8/constraint \"informix\".chk8/g 
## s/constraint \"informix\".c9/constraint \"informix\".chk9/g 
## 

impscriptfname="Import.script" 
impsedfname="Import.sed" 

echo " 
s/constraint \"informix\".c0/constraint \"informix\".chk0/g 
s/constraint \"informix\".c1/constraint \"informix\".chk1/g 
s/constraint \"informix\".c2/constraint \"informix\".chk2/g 
s/constraint \"informix\".c3/constraint \"informix\".chk3/g 
s/constraint \"informix\".c4/constraint \"informix\".chk4/g 
s/constraint \"informix\".c5/constraint \"informix\".chk5/g 
s/constraint \"informix\".c6/constraint \"informix\".chk6/g 
s/constraint \"informix\".c7/constraint \"informix\".chk7/g 
s/constraint \"informix\".c8/constraint \"informix\".chk8/g 
s/constraint \"informix\".c9/constraint \"informix\".chk9/g 

s/constraint \"informix\".p0/constraint \"informix\".pri0/g 
s/constraint \"informix\".p1/constraint \"informix\".pri1/g 
s/constraint \"informix\".p2/constraint \"informix\".pri2/g 
s/constraint \"informix\".p3/constraint \"informix\".pri3/g 
s/constraint \"informix\".p4/constraint \"informix\".pri4/g 
s/constraint \"informix\".p5/constraint \"informix\".pri5/g 
s/constraint \"informix\".p6/constraint \"informix\".pri6/g 
s/constraint \"informix\".p7/constraint \"informix\".pri7/g 
s/constraint \"informix\".p8/constraint \"informix\".pri8/g 
s/constraint \"informix\".p9/constraint \"informix\".pri9/g 

s/constraint \"informix\".r0/constraint \"informix\".ref0/g 
s/constraint \"informix\".r1/constraint \"informix\".ref1/g 
s/constraint \"informix\".r2/constraint \"informix\".ref2/g 
s/constraint \"informix\".r3/constraint \"informix\".ref3/g 
s/constraint \"informix\".r4/constraint \"informix\".ref4/g 
s/constraint \"informix\".r5/constraint \"informix\".ref5/g 
s/constraint \"informix\".r6/constraint \"informix\".ref6/g 
s/constraint \"informix\".r7/constraint \"informix\".ref7/g 
s/constraint \"informix\".r8/constraint \"informix\".ref8/g 
s/constraint \"informix\".r9/constraint \"informix\".ref9/g 

s/constraint \"informix\".u0/constraint \"informix\".uni0/g 
s/constraint \"informix\".u1/constraint \"informix\".uni1/g 
s/constraint \"informix\".u2/constraint \"informix\".uni2/g 
s/constraint \"informix\".u3/constraint \"informix\".uni3/g 
s/constraint \"informix\".u4/constraint \"informix\".uni4/g 
s/constraint \"informix\".u5/constraint \"informix\".uni5/g 
s/constraint \"informix\".u6/constraint \"informix\".uni6/g 
s/constraint \"informix\".u7/constraint \"informix\".uni7/g 
s/constraint \"informix\".u8/constraint \"informix\".uni8/g 
s/constraint \"informix\".u9/constraint \"informix\".uni9/g 

s/constraint \"informix\".n0/constraint \"informix\".not0/g 
s/constraint \"informix\".n1/constraint \"informix\".not1/g 
s/constraint \"informix\".n2/constraint \"informix\".not2/g 
s/constraint \"informix\".n3/constraint \"informix\".not3/g 
s/constraint \"informix\".n4/constraint \"informix\".not4/g 
s/constraint \"informix\".n5/constraint \"informix\".not5/g 
s/constraint \"informix\".n6/constraint \"informix\".not6/g 
s/constraint \"informix\".n7/constraint \"informix\".not7/g 
s/constraint \"informix\".n8/constraint \"informix\".not8/g 
s/constraint \"informix\".n9/constraint \"informix\".not9/g 
" > $impscriptfname 
echo "为informix自动定义的约束改名" 
echo "为informix自动定义的约束改名" >>$implogfname 
for dbname in `cat $impinputfname` 
do 
if [ -z "$dbname" ] 
then 
continue 
fi 
echo "\t$dbname . . ." 
echo "\t$dbname . . ." >>$implogfname 
sqlfname="$dbname.exp/$dbname.sql" 
if [ ! -s "$sqlfname.bak" ] 
then 
cp $sqlfname $sqlfname.bak 
sed -f $impscriptfname $sqlfname > $impsedfname 
cp $impsedfname $sqlfname 
fi 
done 





# 上载实表 

importdb() 

echo "import database . . . " 
echo "import database . . . " >>$implogfname 
for dbname in `cat $impinputfname` 
do 
if [ -z "$dbname" ] 
then 
continue 
fi 

# 上载实表 
echo `isql - - !` 
dbimport $dbname 
if [ "$?" = "0" ] 
then 
echo " $dbname . . . success" >>$implogfname 
echo "$dbname" >>$impsuccessfname 
else 
echo " $dbname . . . fail" >>$implogfname 
echo "====== error information =======" >>$implogfname 
cat dbimport.out >>$implogfname 
echo "===============" >>$implogfname 
echo "$dbname" >>$impfailfname 
fi 
done 




# 增加日志 

addunbuffer() 

echo "add unbuffer log . . . " 
echo "add unbuffer log . . . " >>$implogfname 
for dbname in `cat $impinputfname` 
do 
if [ -z "$dbname" ] 
then 
continue 
fi 
echo " $dbname" 
echo " $dbname" >>$implogfname 
ontape -s -U $dbname 
done 




# 上载附加SQL文件 

importaddition() 

echo "import addition sql . . ." 
echo "import addition sql . . ." >>$implogfname 

impaddinputfname="Import.addi.input" 
impaddfailfname="Import.addi.fail" 

cp $impinputfname $impaddinputfname 
cat /dev/null > $impaddfailfname 

count=1 
while true 
if [ $count -gt 10 ] 
then 
break 
else 
if [ -s "$impaddfailfname" ] 
then 
cp $impaddfailfname $impaddinputfname 
cat /dev/null > $impaddfailfname 
else 
if [ $count -gt 1 ] 
then 
break 
fi 
fi 
fi 
do 
echo "loop count=$count" >>$implogfname 
for dbname in `cat $impaddinputfname` 
do 
if [ -z "$dbname" ] 
then 
continue 
fi 
impaddsql="$dbname.addi.sql" 
if [ -s "$impaddsql" ] 
then 
dbaccess $dbname $impaddsql 
if [ "$?" = "0" ] 
then 
echo " $dbname . . . success" >>$implogfname 
else 
echo " $dbname . . . fail" >>$implogfname 
echo "$dbname" >>$impaddfailfname 
fi 
fi 
done 

count=`expr $count + 1` 
done 




# 上载主程序 

importmain() 

impinputfname="Import.input" 
implogfname="Import.log" 
impsuccessfname="Import.success" 
impfailfname="Import.fail" 

while true 
clear 
echo "\n\n 
恢复程序 

说明: 请将设为/dev/null 

选项: 1> 全部恢复 
2> 仅恢复失败的 
3> 查全部库名列表 
4> 查成功的列表 
5> 查失败的列表 
6> 查日志 
0> 退出 
选择:\c" 
read options 
do 
if [ "$options" = "0" ] 
then 
break 
fi 
case "$options" in 
'1' ) cat /dev/null >$impinputfname 
cat /dev/null >$implogfname 
cat /dev/null >$impsuccessfname 
cat /dev/null >$impfailfname 

if [ -s "$pubfname" ] 
then 
cp $pubfname $impinputfname 
sedscript 
importdb 
addunbuffer 
importaddition 
else 
echo "无数据库可供恢复 !" 
sleep 1 
fi 
;; 

'2' ) if [ -s "$impfailfname" ] 
then 
cat /dev/null > $implogfname 
cp $impfailfname $impinputfname 
cat /dev/null > $impfailfname 
sedscript 
importdb 
addunbuffer 
importaddition 
else 
echo "无可供恢复的库名 !" 
sleep 1 
fi 
;; 

'3' ) if [ -s "$pubfname" ] 
then 
pg $pubfname 
else 
echo "无可供恢复的库名 !" 
sleep 1 
fi 
;; 

'4' ) if [ -s "$impsuccessfname" ] 
then 
pg $impsuccessfname 
else 
echo "无可供恢复的库名 !" 
sleep 1 
fi 
;; 

'5' ) if [ -s "$impfailfname" ] 
then 
pg $impfailfname 
else 
echo "无可供恢复的库名 !" 
sleep 1 
fi 
;; 

'6' ) if [ -s "$implogfname" ] 
then 
pg $implogfname 
else 
echo "无可供恢复的库名 !" 
sleep 1 
fi 
;; 
esac 
done 



################################ 
## 
## 主程序 
## 
################################ 


# 上载附加SQL文件,根据当前目录下.addi.sql格式的文件进行 

loadadditionsql() 

echo "load addition sql . . ." 

loadinputfname="Load.Addi.input" 
loadfailfname="Load.Addi.fail" 

ls *.addi.sql > $loadinputfname 

count=1 
while [ $count -le 10 ] 
do 
cat /dev/null > $loadfailfname 

echo "loop count=$count" 
for fname in `cat $loadinputfname` 
do 
dbname=`basename $fname ".addi.sql"
if [ -z "$dbname" ] 
then 
continue 
fi 
echo " $dbname ----> $fname . . . " 
dbaccess $dbname $fname 
if [ "$?" = "0" ] 
then 
echo " ----> $fname . . . success" 
else 
echo " ----> $fname . . . fail" 
echo "$fname" >>$loadfailfname 
fi 
done 

if [ ! -s "$loadfailfname" ] 
then 
break 
fi 

cp $loadfailfname $loadinputfname 
count=`expr $count + 1` 
done 




opath=`pwd` 

cd $WorkDir 

while true 
clear 
echo "\n\n 
备份与恢复 
说明: 1> 确定以下环境变量设置正确: 
INformIXDIR=$INformIXDIR 
INformIXSERVER=$INformIXSERVER 
WorkDir=$WorkDir 
2> 备份时会删除库中定义的视图、同义名、存储过程和触发器 
3> 单独上载附加的SQL,根据当前目录下.addi.sql格式的文件进行 

选项: 1> 备份 
2> 恢复 
3> 单独上载附加的SQL 
0> 退出 
选择:\c" 
read options 
do 
if [ "$options" = "0" ] 
then 
break 
fi 
case "$options" in 
'1' ) exportmain 
;; 

'2' ) importmain 
;; 

'3' ) loadadditionsql 
;; 

esac 
done 

cd $opath 
阅读(1886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~