当前位置:首页 > 其它
国产数据库 gbase8s 的备份与还原
来源:靑龍一笑的博客  作者:靑龍一笑  发布时间:2021-11-16 11:44:46  点击量:504  评论:0

    首先需要说明的一点,我这里所谓的备份与还原操作,纯粹是一种民间艺术,跟南大通用官方提供的备份与恢复工具有所不同。
    备份一个数据库,需要备份的是数据库中所有表的结构,以及所有表的数据。那么,如何得到所有表的结构,以及所有表的数据呢?
    可以使用如下命令,查看数据库中的所有表:

select tabname from systables where tabid >= 100;

    可以使用如下命令,导出数据库中所有的表结构:

dbschema  -d  数据库名  导出的文件名.sql

    要导出一张表的数据到一个文件中,可以使用如下命令:

unload to '文件名' select * from 表名;

    由于前面已经得到了所有的表名,可以使用循环语句来遍历导出各个表的数据。
    完整的 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

    解决了备份的问题,还原也是一个令人头痛的问题,那么多张表的数据要怎么还原?
    我们在备份的时候,要获得数据库中所有的表名,是从数据库中查找。现在要还原的时候,肯定是根据我们手上的备份的文件。
    要从一个文件中导入数据到一张表里,可以使用如下命令:

load from '文件名' insert into 表名;

    同样,可以使用循环语句来遍历导入。
    完整的 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

版权所有 © 2005-2023 靑龍一笑的博客  Powered by C.S.Ricen
Copyright © 2005-2023 by www.ricensoftwares.com.cn  All Rights Reserved.

欢迎光临本站,这里是靑龍一笑的博客。

因资金匮乏,本站已迁到国外的免费空间,可能导致本站的访问速度较慢,由此给您带来的不便,敬请谅解。

您可以通过下方的“支持本站建设”链接,给本站提供资金支持。

Free Web Hosting