分享(6)一个使用 exp 备份 人大金仓数据库的脚本

编写目的

使用 exp 对人大金仓 数据库进行在线备份,并指定轮转次数

说明

因为个人原因,有点强迫症, 喜欢编写能够复用且使用简单的脚本,提供简单的功能, 先是写的oracle备份脚本, 后来陆续写了其他数据库和操作系统的脚本

MySQL 备份也有类似脚本,请看我以前些的文章。

能看懂脚本的花几分钟基本上也就明白了, 也都在测试环境和生产环境用过,但还是建议根据你的环境测试一下 也许有bug我没测出来,哈哈

为了节省大家时间,也能放心使用,把大概功能略述一下

一 使用时只需要提供备份目的地和轮转次数

1. 备份目的地就不说了

扫描二维码关注公众号,回复: 15322997 查看本文章

2. 轮转次数. 有点像 logrotate,每次备份会在备份目的地生成一个序号命名的子文件夹, 到指定的轮转次数再从头开始

二 临时文件

记录上次备份状态的文件, 主要用于防止上一次备份未结束,定时任务又启动了下一次任务。

记录轮转序号的隐藏文件, 决定下次备份到哪儿,每次备份结束+1, 到最大了再从0开始

日志文件,记录了备份的开始时间,每个库的开始备份时间,结束时间

数据库列表文件,先查询数据库名称并记录于这个文件, 然后挨个备份。 不喜欢整个实例一起备份, 还是分数据库一个一个的好, 个人习惯。

当然,不需要备份的数据库可以加入自定义名单,备份时会跳过不备份

三 执行顺序

先查询数据库, 再挨个备份数据库, 如果目录已经有上一次轮转时的备份文件, 会覆盖。

四 备份时间

后台备份的话可以看日志文件减一下, 前台执行的话脚本运行结束也会计算运行了多久(开始,结束时间减了一下)

速度比较

测试数据库 12G :备份花了 6 分钟

人大金仓备份脚本

  #!/bin/bash

# =========================================================================
# (C) Copyright 2003-2033 hoplite([email protected])
# =========================================================================
# Script Purpose : exp kingbase v8 user data by exp
# -------------------------------------------------------------------------
# Version Date    Description
# -------------------------------------------------------------------------
# V1.0 2023-04-26 Initial version
# =========================================================================
[ -f ~/.bash_profile ] && . ~/.bash_profile
set -Eeuo pipefail

show_usage ()
{
  echo "usage: `basename $0` connstr TARGETDIR ROTATE"
  echo "eg.    `basename $0` system/[email protected]:54321/test /backup/kb_exp 7"
}

if [ $# -lt 3 ] || [ $# -gt 3 ]; then
  show_usage
  exit 1
fi

start_time=$(date +%F' '%T)

p_connstr=$1
p_targetdir=$2
p_rotate=$3

v_user=`echo ${p_connstr}|cut -f1 -d\/`
v_pwd=`echo ${p_connstr}|cut -f2 -d\/|cut -f1 -d@`
v_ip=`echo ${p_connstr}|cut -f2 -d@|cut -f1 -d:`
v_port=`echo ${p_connstr}|cut -f2 -d:|cut -f1 -d\/`
v_default_db=`echo ${p_connstr}|cut -f3 -d\/`

if [ ${p_connstr} != "${v_user}/${v_pwd}@${v_ip}:${v_port}/${v_default_db}" ]; then
  show_usage
  exit 1
fi

v_id=$(date +%Y%m%d%H%M%S)
v_hash=`echo -n ${p_connstr}|md5sum|cut -f1 -d" "`
stusfile=${p_targetdir}/.status.${v_hash}.9de7bb31d0644e7393039222babfed10 #file to record last backup status
rotafile=${p_targetdir}/.rotate.${v_hash}.9de7bb31d0644e7393039222babfed10 #file to record rotate number
log_file=${p_targetdir}/backup.log
err_file=${p_targetdir}/error.log
#file to record databases
vdbsfile1=$(mktemp -t .tmp.9de7bb31d0644e7393039222babfed10.XXXXXXXXXX.vdbs) || exit 1
vdbsfile2=$(mktemp -t .tmp.9de7bb31d0644e7393039222babfed10.XXXXXXXXXX.vdbs) || exit 1

#record last backup result,if fail, exit, must fix it manully, then reset the status
if [ -f ${stusfile} ]; then
  if [ `cat ${stusfile}` = "running" ]; then
    loginfo="$(date +%F' '%T) ...ERROR:last backup fail, check it,then drop status file and rerun." ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}
    exit 1
  else
    echo "running" > ${stusfile}
  fi
else
  echo "running" > ${stusfile}
fi

#rotate number,+1 every time
if [ -f ${rotafile} ]; then
  v_last_id=`cat ${rotafile}`
  v_incr_id=`expr ${v_last_id} + 1`
  v_curr_id=$(( ${v_incr_id} % ${p_rotate} ))
else
  v_curr_id=0
fi
echo ${v_curr_id} > ${rotafile}

v_targetdir=${p_targetdir}/${v_curr_id}
[ -d ${v_targetdir} ] || mkdir -p ${v_targetdir}
cd ${v_targetdir}

loginfo="$(date +%F' '%T) ...start backup to ${v_targetdir}" ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}

ksql "host=${v_ip} port=${v_port} user=${v_user} password=${v_pwd} dbname=${v_default_db}" -c "select concat('9de7bb31d0644e7393039222babfed10 ',usename) username from sys_user where usename not in ('system','sao','sso');" -o ${vdbsfile1}

cat ${vdbsfile1} |grep 9de7bb31d0644e7393039222babfed10|grep -v 'SQL>'|awk '{print $2;}' > ${vdbsfile2}
filtered_dbs=("user_you_do_not_want_to_exp" "IDADMIN")
while read v_db
do
  is_in_filtered_db="N"
  for fd in ${filtered_dbs[*]} ; do
    if [ "${fd}" == "${v_db}" ]; then
      is_in_filtered_db="Y"
      break
    fi
  done

  if [[ "${is_in_filtered_db}" == "N" ]]; then
    loginfo="$(date +%F' '%T) ...backup database ${v_db}" ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}
    exp host=${v_ip} port=${v_port} user=${v_user} password=${v_pwd} dbname=${v_db} file=${v_db}.dmp log=${v_db}.exp.log owner=${v_db} 2>${err_file}
  fi
done < ${vdbsfile2}
loginfo="$(date +%F' '%T) ...end backup to ${v_targetdir}" ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}
rm "${vdbsfile1:-unset}"
rm "${vdbsfile2:-unset}"
echo "completed" > ${stusfile}

end_time=$(date +%F' '%T)
t_start_time=`date -d "${start_time}" +%s`
t_end_time=`date -d "${end_time}" +%s`
t_diff_secs=$((${t_end_time} - ${t_start_time}))
t_hours=$((${t_diff_secs}/3600))
t_mins=$(($((${t_diff_secs}-${t_hours}*3600))/60))
t_secs=$((${t_diff_secs}%60))

echo
echo ==================================================
echo "File Name:`basename $0`    Start Time:${start_time}    End Time:${end_time}    Total Cost:${t_hours}:${t_mins}:${t_secs}"
echo ==================================================
echo

猜你喜欢

转载自blog.csdn.net/weixin_44496870/article/details/131072075