首先需要说明的一点,我这里所谓的备份与还原操作,纯粹是一种民间艺术,跟南大通用官方提供的备份与恢复工具有所不同。
备份一个数据库,需要备份的是数据库中所有表的结构,以及所有表的数据。那么,如何得到所有表的结构,以及所有表的数据呢?
可以使用如下命令,查看数据库中的所有表:
可以使用如下命令,导出数据库中所有的表结构:
要导出一张表的数据到一个文件中,可以使用如下命令:
由于前面已经得到了所有的表名,可以使用循环语句来遍历导出各个表的数据。
完整的 shell 备份脚本代码如下:
#!/bin/bash
# 作者:靑龍一笑(C.S.Ricen)
# 功能:对 gbase 8s 数据库进行备份
#
# 设置调试模式:1 表示开启;0 表示关闭
IS_DEBUG=1
# 指定数据库备份目录
DB_Backup_Dir="dbbackup"
# 要备份的数据库列表
DB_Backup_Lst="db.list"
# 当前日期
CUR_DATE=`date +%Y%m%d`
# 备份文件保留天数
SAVE_DAYS=15
# 设置环境变量
export GBASEDBTSERVER=gbase8s
export GBASEDBTDIR=/opt/gbase
export GBASEDBTSQLHOSTS=/opt/gbase/etc/sqlhosts.gbase8s
export ONCONFIG=onconfig.gbase8s
export DB_LOCALE=zh_CN.utf8
export CLIENT_LOCALE=zh_CN.utf8
unset GL_USEGLU
export PATH=$GBASEDBTDIR/bin:$GBASEDBTDIR/sbin:$PATH
# 检查当前用户
if [ $UID -eq 0 ]; then
echo "错误:不能使用 root 帐号操作!"
exit 1
fi
# 检查数据库列表
if [ ! -f ${DB_Backup_Lst} ]; then
echo "错误:数据库列表不存在!"
exit 1
fi
# 检查数据库备份目录
if [ ! -d ${DB_Backup_Dir} ]; then
mkdir -p ${DB_Backup_Dir}
fi
# 备份数据库
cat ${DB_Backup_Lst} | while read DB_Name
do
# 创建备份目录
mkdir -p ${DB_Backup_Dir}/${DB_Name}
if [ x"${IS_DEBUG}" == x"1" ]; then
echo -n "开始导出数据库 ${DB_Name} 中所有的表结构 "
fi
# 导出数据库中所有的表结构
dbschema -d ${DB_Name} ${DB_Backup_Dir}/${DB_Name}/${DB_Name}.sql > /dev/null 2>&1
if [ x"${IS_DEBUG}" == x"1" ]; then
echo "【完成】"
fi
# 导出数据库中的所有表名
echo "unload to '${DB_Name}.tmp' delimiter ' ' select tabname from systables where tabid >= 100 order by tabname asc;" | dbaccess ${DB_Name} > /dev/null 2>&1
if [ x"${IS_DEBUG}" == x"1" ]; then
echo "开始导出数据库 ${DB_Name} 中所有的数据 ……"
fi
while read Tab_Name
do
if [ x"${IS_DEBUG}" == x"1" ]; then
echo " → 导出数据表 ${Tab_Name}"
fi
# 导出表数据
echo "unload to '${DB_Backup_Dir}/${DB_Name}/${Tab_Name}_${CUR_DATE}.dmp' select * from ${Tab_Name};" | dbaccess ${DB_Name} > /dev/null 2>&1
done < ${DB_Name}.tmp
# 删除临时文件
rm -rf ${DB_Name}.tmp
if [ x"${IS_DEBUG}" == x"1" ]; then
echo "数据库 ${DB_Name} 备份完成"
fi
done
# 删除备份文件
cat ${DB_Backup_Lst} | while read DB_Name
do
find ${DB_Backup_Dir}/${DB_Name} -mtime +${SAVE_DAYS} -exec rm {} \;
done
exit 0
解决了备份的问题,还原也是一个令人头痛的问题,那么多张表的数据要怎么还原?
我们在备份的时候,要获得数据库中所有的表名,是从数据库中查找。现在要还原的时候,肯定是根据我们手上的备份的文件。
要从一个文件中导入数据到一张表里,可以使用如下命令:
同样,可以使用循环语句来遍历导入。
完整的 shell 还原脚本代码如下:
#!/bin/bash
# 作者:靑龍一笑(C.S.Ricen)
# 功能:还原 GBase 8s 数据
#
##### 还原方式 #####
# 0、不删除数据库
# 1、删除数据库,并重建
IS_NEW=0
# 指定要还原的备份日期
DB_Backup_Date="20211116"
# 指定数据库备份目录
DB_Backup_Dir="dbbackup"
# 要还原的数据库列表
DB_Restore_Lst="db.list"
# 设置环境变量
export GBASEDBTSERVER=gbase8s
export GBASEDBTDIR=/opt/gbase
export GBASEDBTSQLHOSTS=/opt/gbase/etc/sqlhosts.gbase8s
export ONCONFIG=onconfig.gbase8s
export DB_LOCALE=zh_CN.utf8
export CLIENT_LOCALE=zh_CN.utf8
unset GL_USEGLU
export PATH=$GBASEDBTDIR/bin:$GBASEDBTDIR/sbin:$PATH
# 检查当前用户
if [ $UID -eq 0 ]; then
echo "错误:不能使用 root 帐号操作!"
exit 1
fi
# 检查数据库列表
if [ ! -f ${DB_Restore_Lst} ]; then
echo "错误:数据库列表不存在!"
exit 1
fi
# 检查数据库备份目录
if [ ! -d ${DB_Backup_Dir} ]; then
echo "错误:备份目录不存在!"
exit 1
fi
# 还原数据库
cat ${DB_Restore_Lst} | while read DB_Name
do
echo "开始还原数据库 ${DB_Name}"
if [ x"${IS_NEW}" == x"1" ]; then
echo "删除数据库 ${DB_Name}"
# 删除数据库
echo "drop database if exists ${DB_Name};" | dbaccess > /dev/null 2>&1
echo "创建数据库 ${DB_Name}"
# 创建数据库
echo "create database ${DB_Name} in datadbs1 with log;" | dbaccess > /dev/null 2>&1
echo "开始导入数据库 ${DB_Name} 中所有的表结构 ……"
# 导入表结构
dbaccess ${DB_Name} ${DB_Backup_Dir}/${DB_Name}/${DB_Name}.sql > /dev/null 2>&1
fi
# 导入表数据
for Tab_Dump in ${DB_Backup_Dir}/${DB_Name}/*_${DB_Backup_Date}.dmp; do
# 获取备份的文件名
Tab_File_Name=${Tab_Dump##*/}
# 提取数据表名
Tab_Name=${Tab_File_Name%_*}
# 备份文件中存在数据,才执行还原操作
if [ -s ${Tab_Dump} ]; then
if [ x"${IS_NEW}" == x"0" ]; then
echo " → 清空数据表 ${Tab_Name}"
echo "truncate table ${Tab_Name};" | dbaccess ${DB_Name} > /dev/null 2>&1
fi
echo " → 导入数据表 ${Tab_Name}"
echo "load from '${Tab_Dump}' insert into ${Tab_Name};" | dbaccess ${DB_Name} > /dev/null 2>&1
fi
done
echo "数据库 ${DB_Name} 还原完成"
done
exit 0
Copyright © 2005-2023 by www.ricensoftwares.com.cn All Rights Reserved.