Informix数据库备份还原Shell脚本执行报错问题排查求助
问题根源排查
- 磁盘空间不足错误(225/131):
dbexport默认将导出数据存放在脚本执行的当前工作目录,若当前目录剩余空间小于数据库导出大小,就会触发ISAM无可用磁盘空间报错。- 脚本中
size_dbs、size_dbs2的赋值时机错误:脚本启动时就执行du "$BASE".exp,但此时dbexport还未运行,$BASE.exp目录不存在,计算出来的size_dbs为空值,后续还原环节创建表空间时传入的空间大小为0,导致无法创建系统表。
import_erreur: command not found错误:你实际运行的脚本第61行调用了未定义的命令/函数,你当前粘贴的脚本中无该行,属于代码输入错误。- 隐藏问题:还原环节引用的
$DBPATH变量未定义,执行cd $DBPATH会跳转路径异常,导致后续解压、导入操作失败。
修复方案
你可以直接使用修改后的脚本,注意提前将路径参数改为你环境的实际配置:
#!/bin/sh ################################################################################### #Usage ./impexp.sh BASE USER ARCHIVE ################################################################################### LOGO="DB IMPEXP" #------------------------------------------------------ # 变量定义 请根据实际环境修改路径 #------------------------------------------------------ BASE=$1 USER=$2 ARCHIVE=$3 export DBSTOR=/stored/bdd export TEMPOF=/stored/tmp # 补全DBPATH定义 export DBPATH=/stored/restore ADATE=`date +%Y%m%d` #------------------------------------------------------ # MENU PROMPTS #------------------------------------------------------ ymenu="y. backup BDD" ; zmenu="z. restore archive " ; #------------------------------------------------------ # MENU FUNCTION DEFINITIONS #------------------------------------------------------ badchoice () { MSG="Invalid Selection ... Please Try Again" ; } ypick () { echo "Backup BDD" # 先切换到临时目录执行导出,避免当前目录空间不足 cd $TEMPOF || { echo "临时目录不存在,备份失败"; return 1; } # 执行导出前先删除旧的导出目录,避免残留文件干扰 rm -rf ./$BASE.exp ./dbexport.out dbexport $BASE || { echo "dbexport执行失败,备份终止"; return 1; } mkdir -m 0777 -p "$DBSTOR" tar -czvf $DBSTOR/$BASE.exp.$ADATE.tgz ./$BASE.exp && chmod 644 $DBSTOR/* rm -rf ./$BASE.exp rm -f ./dbexport.out # 备份完成后再计算目录大小,供还原环节使用 size_dbs=$(du -s "$DBSTOR/$BASE.exp.$ADATE.tgz" | awk '{print $1}') size_dbs2=$((size_dbs*4)) echo "备份完成,备份文件路径:$DBSTOR/$BASE.exp.$ADATE.tgz,预估还原所需空间:$size_dbs2 KB" } zpick () { echo "Restoring archive" cd $DBPATH || { echo "还原目录不存在,还原失败"; return 1; } rm -rf ./$BASE.exp tar -xzvf $ARCHIVE || { echo "归档解压失败,还原终止"; return 1; } # 解压后重新计算导出目录大小 size_dbs=$(du -s ./$BASE.exp | awk '{print $1}') size_dbs2=$((size_dbs*4)) onspaces -a dbs_"$BASE"_01 -p /bases_data/data_"$BASE"_01.dbs -o 0 -s ${size_dbs2} || { echo "表空间创建失败,还原终止"; return 1; } dbimport -q "$BASE" -d dbs_"$BASE"_01 || { echo "dbimport执行失败,还原终止"; return 1; } echo "Import done" } #------------------------------------------------------ # DISPLAY FUNCTION DEFINITION #------------------------------------------------------ themenu () { # clear the screen clear echo `date` echo echo " " $LOGO echo echo " Please Select:" echo echo " " $ymenu echo " " $zmenu echo " " echo " " echo " x. Exit" echo echo $MSG echo echo Select by pressing the letter and then ENTER ; } MSG= while true do themenu read answer MSG= case $answer in y|Y) ypick;; z|Z) zpick;; x|X) break;; *) badchoice;; esac echo "" echo "Press <ENTER> to return to the menu..." read junk clear done
额外注意:
- 执行脚本前请确认
$TEMPOF、$DBSTOR、$DBPATH对应的磁盘分区剩余空间充足,至少为数据库大小的5倍以上- 请手动删除你实际脚本中第61行的
import_erreur错误代码
内容的提问来源于stack exchange,提问作者TenEM
相关产品推荐
相关产品推荐

