备份和恢复 Informix 数据库的脚本
Script to backup and restore an Informix database
我制作了这个脚本来备份和恢复 Informix 数据库。这是一个有两个功能的菜单,给你两个选择:备份或恢复数据库。
该脚本将使用 dbexport 然后将备份存档到一个目录。
为了恢复数据库,我使用了 dbimport。
#!/bin/sh
###################################################################################
#Usage ./impexp.sh BASE USER ARCHIVE
###################################################################################
LOGO="DB IMPEXP"
#------------------------------------------------------
# Definition des variables
#------------------------------------------------------
BASE=
USER=
ARCHIVE=
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
谢谢。
在对问题进行评论和修改后进行了一些讨论,问题似乎主要出现在 'recover' 阶段,可能是在数据库中创建足够的 space 出了问题space.
我要在这里提到我发现 DB-Access 使用起来很痛苦。如此令人沮丧,以至于我编写了一个现在称为 sqlcmd
的程序来按照我希望 DB-Access 的方式工作。考虑使用 SQLCMD(可从 IIUG 软件获得
存档),其中
我写信是为了在 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 存在,它应该 return 0 或以状态 0 退出;如果 dbspace 不存在,它应该 return 一个非零值或以非零状态退出。 (默认情况下它不应生成任何输出!)我会使用脚本,因为对性能的影响可以忽略不计,而且清晰度和可重用性要简单得多。 YMMV!
块文件必须在 运行 宁 onspaces
之前存在并具有适当的权限。如果用户 运行 使用脚本是 root
或具有系统管理员权限,则以下操作有效。放下
chown
line if necessary,但注意如果所有者不是用户informix,组informix,新的chunk路径可能根本不起作用。
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 "[=14=]: 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 "[=14=]: 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
。您的规避是有效的,但笨拙且不符合地道 shell。我通常引用变量,并且经常将变量名嵌入大括号`“${dbspace_name}”。如果你没有 spaces 或字符串接触变量名,你可以不用额外的标点符号,但它有助于长 运行.
我制作了这个脚本来备份和恢复 Informix 数据库。这是一个有两个功能的菜单,给你两个选择:备份或恢复数据库。
该脚本将使用 dbexport 然后将备份存档到一个目录。
为了恢复数据库,我使用了 dbimport。
#!/bin/sh
###################################################################################
#Usage ./impexp.sh BASE USER ARCHIVE
###################################################################################
LOGO="DB IMPEXP"
#------------------------------------------------------
# Definition des variables
#------------------------------------------------------
BASE=
USER=
ARCHIVE=
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
谢谢。
在对问题进行评论和修改后进行了一些讨论,问题似乎主要出现在 'recover' 阶段,可能是在数据库中创建足够的 space 出了问题space.
我要在这里提到我发现 DB-Access 使用起来很痛苦。如此令人沮丧,以至于我编写了一个现在称为 sqlcmd
的程序来按照我希望 DB-Access 的方式工作。考虑使用 SQLCMD(可从 IIUG 软件获得
存档),其中
我写信是为了在 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 存在,它应该 return 0 或以状态 0 退出;如果 dbspace 不存在,它应该 return 一个非零值或以非零状态退出。 (默认情况下它不应生成任何输出!)我会使用脚本,因为对性能的影响可以忽略不计,而且清晰度和可重用性要简单得多。 YMMV!
块文件必须在 运行 宁 onspaces
之前存在并具有适当的权限。如果用户 运行 使用脚本是 root
或具有系统管理员权限,则以下操作有效。放下
chown
line if necessary,但注意如果所有者不是用户informix,组informix,新的chunk路径可能根本不起作用。
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 "[=14=]: 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 "[=14=]: 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
。您的规避是有效的,但笨拙且不符合地道 shell。我通常引用变量,并且经常将变量名嵌入大括号`“${dbspace_name}”。如果你没有 spaces 或字符串接触变量名,你可以不用额外的标点符号,但它有助于长 运行.