用于备份和恢复 Informix 数据库的脚本

Posted

技术标签:

【中文标题】用于备份和恢复 Informix 数据库的脚本【英文标题】:Script to backup and restore an Informix database 【发布时间】:2021-11-18 13:02:51 【问题描述】:

我制作了这个脚本来备份和恢复 Informix 数据库。这是一个具有两个功能的菜单,为您提供两种选择:备份或恢复数据库。

该脚本将使用 dbexport 然后将备份存档到一个目录。

为了恢复数据库,我使用了 dbimport。

#!/bin/sh
###################################################################################
#Usage  ./impexp.sh BASE USER ARCHIVE
###################################################################################
LOGO="DB IMPEXP"

#------------------------------------------------------
# Definition des variables
#------------------------------------------------------

BASE=$1
USER=$2
ARCHIVE=$3
export DBSTOR=/stored/bdd
export TEMPOF=/stored/tmp
ADATE=`date +%Y%m%d`
size_dbs=$(du "$BASE".exp |  sed -e 's/\t.*$//')
size_dbs2=$((size_dbs*4))


#------------------------------------------------------
# MENU PROMPTS
#------------------------------------------------------

ymenu="y.  backup BDD"              ;
zmenu="z.  restore archive "         ; 


#------------------------------------------------------
# MENU FUNCTION DEFINITIONS
#------------------------------------------------------
 
badchoice ()  MSG="Invalid Selection ... Please Try Again" ;  
 

ypick ()      echo "Backup BDD"
    #------------------------------------------------

    dbexport $BASE
    
    mkdir -m 0777 -p "$DBSTOR"
    
    tar -czvf $DBSTOR/$BASE.exp.$ADATE.tgz ./$BASE.exp && chmod 777 $DBSTOR/*

    rm -rf ./$BASE.exp
    rm -f  ./dbexport.out
 
zpick ()      echo "Restoring archive"
    #---------------------------------------
    cd $DBPATH

    tar -xzvf $ARCHIVE
    
    onspaces -a dbs_"$BASE"_01 -p /bases_data/data_"$BASE"_01.dbs -o 0 -s $size_dbs2
    dbimport -q "$BASE" -d dbs_"$BASE"_01 
    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

遗憾的是它不能正常工作,尤其是我有这些错误消息的备份部分:

   create database
   225 - Cannot create file for system catalog (systables).
   131 - ISAM error: no free disk space
   ./impexp.sh: line 61: import_erreur: command not found

谢谢。

【问题讨论】:

在哪些方面不能正常工作? @JonathanLeffler 老实说,我尝试按照您之前的建议使用 onbar,但失败得很惨,我无法理解如何在交互式 shell 上使用它并存储备份文件,我使用了 dbimport因为这对我来说更容易理解,但这是一个巨大的错误,需要花费太多时间,而且在某些机器上不起作用我在其他机器上存在文件夹权限问题,这是数据库用户权限。 在函数ypick中,有一个else和一个fi,没有开始if。您可能应该只使用mkdir -p "$DBPATH" 来创建目录。您不应将目录权限设置为777 IMO;这是一个重大的安全风险。请改用 775 或 755。在现代 POSIX 系统(Linux 等)上,您应该能够指定 mkdir -m 0755 -p "$DBPATH"。另请注意,DBPATH 环境变量对 Informix 服务器具有特定含义,尽管它很少使用。除了破坏的 shell 语法,备份选项还有哪些问题? 关于import_erreur not found 的消息是因为dbimport 报告失败,退出状态为非零,然后您的脚本尝试调用import_erreur,但它不是脚本中的函数,而且不是这个之外的程序(脚本?)。空间不足错误意味着您的 Informix 服务器需要更多磁盘空间(将块添加到相关 dbspace),或者您需要删除不再需要的数据库。 您的问题是“特别是备份部分”,然后是有关创建数据库的错误消息。那个“备份”应该是“恢复”吗? 【参考方案1】:

在 cmets 中的一些讨论和对问题的修改之后,问题似乎主要处于“恢复”阶段,问题可能在于在 dbspace 中创建足够的空间。

我将在这里提到我发现 DB-Access 使用起来很痛苦。如此令人痛心的是,我编写了一个现在名为 sqlcmd 的程序来按照我希望 DB-Access 的方式工作。考虑使用 SQLCMD(可从IIUG Software Archive 获得),它 我写的是在 shell 脚本上下文中表现一致,而 DB-Access 没有。 它可以追溯到 1986 年(之前有 dbaccess;在那些日子里,你 改用 isql — DB-Access 是从 isql 中分割出来的 晚上),最初称为rdsql。 它与 Microsoft 的 johnny-come-lately 计划无关 同名——除了名称并具有相同的通用目的 (操作 SQL 数据库)。

我提到它是因为“是否已经有一个名为 'xyz' 的 dbspace?”的脚本。变得微不足道:

dbspace="xyz"
if [ -n "$(sqlcmd -d sysmaster "select name from sysdbspaces where name = '$dbspace'") ]
then : dbspace exists - add space to it
else : dbspace does not exist - create it
fi

使用 DB-Access,这更难。应该起作用的是:

dbspace="xyz"
result=$(dbaccess sysmaster - 2>/dev/null <<EOF
select name from sysdbspaces where name = '$dbspace';
EOF
)
if [ -n "$result" ]
then : dbspace exists - add space to it
else : dbspace does not exist - create it
fi

这段代码应该被封装到一个shell函数或者一个叫做dbspace_exists的shell脚本中,可以被脚本使用。如果 dbspace 存在,它应该返回 0 或以状态 0 退出;如果 dbspace 不存在,它应该返回一个非零值或以非零状态退出。 (默认情况下它不应该生成任何输出!)我会使用脚本,因为性能影响可以忽略不计,而且清晰度和可重用性要简单得多。 YMMV!

在运行onspaces 之前,块文件必须存在并具有适当的权限。如果运行脚本的用户是root 或具有系统管理员权限,则以下操作有效。放下 chown 行如果需要的话,但是注意如果所有者不是用户informix,组informix,新的块路径可能根本不起作用。

cp /dev/null "$chunkpath"
chown informix:informix "$chunkpath"
chmod 660 "$chunkpath"

您的代码不断重复一些结构 - 使用变量让您保持 DRY(“不要重复自己”)。

你有一些类似的东西:

cd $DBSTOR          # Changed from DBPATH

tar -xzvf $ARCHIVE

onspaces -c -d dbs_"$BASE"_01 -p /bases_data/data_"$BASE"_01.dbs -o 0 -s $size_dbs2
dbimport -q "$BASE" -d dbs_"$BASE"_01 
echo "Import done"

我认为你需要更多类似的东西:

cd "$DBSTOR" || exit 1

tar -xzvf "$ARCHIVE"

dbspace_name="dbs_$BASE_01"
dbspace_path="/bases_data/$dbspace_name.dbs"
if [ -f "$dbspace_path" ]
then
    echo "$0: dbspace chunk file $dbspace_path already exists" >&2
    exit 1
fi
cp /dev/null "$dbspace_path"
chown informix:informix "$dbspace_path"
chmod 660 "$dbspace_path"

if dbspace_exists "$dbspace_name"
then onspaces -a    "$dbspace_name" -p "$dbspace_path" -o 0 -s "$size_dbs2"
else onspaces -c -d "$dbspace_name" -p "$dbspace_path" -o 0 -s "$size_dbs2"
fi
if [ "$?" != 0 ]
then
    echo "$0: failed to create/expand dbspace $dbspace_name" >&2
    exit 1
fi
if dbimport -q "$BASE" -d "$dbspace_name"
then echo "Import of $BASE done"
else
    echo "Import of $BASE failed" >&2
    exit 1
fi

# Remove the files extracted from the tar file
rm -fr …

exit 0

在尝试使用新的 dbspace 之前,您应该进行存档——我没有将它集成到脚本中。没有存档,额外的块可能不可用。

还有很多工作要做。

注意dbspace_name="dbs_$BASE_01" 中大括号的使用。这可确保变量名称为$BASE 而不是$BASE_01。您的规避是有效的,但笨拙而不是惯用的外壳。我通常引用变量,并且经常将变量名嵌入大括号“$dbspace_name”中。如果你没有空格或字符串接触变量名,你可以不用额外的标点符号,但从长远来看它会有所帮助。

【讨论】:

谢谢乔纳森,你的回答一如既往地解释和教导,再次感谢你

以上是关于用于备份和恢复 Informix 数据库的脚本的主要内容,如果未能解决你的问题,请参考以下文章

MySQL备份脚本

用于 SQL Server 持续集成测试的备份/恢复数据库

基于 mysql 镜像的定时自动备份数据和清除过期备份

7 MSSQL数据库备份与恢复

如何利用pg_dumpall备份的文件,恢复数据库

【MySQL】Xtrabackup备份及恢复脚本