侧边栏壁纸
博主头像
小白不想白 博主等级

行动起来,活在当下

  • 累计撰写 21 篇文章
  • 累计创建 5 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

人大金仓自动化数据库恢复脚本:保障数据安全与高效运维

小白不想白
2025-05-17 / 0 评论 / 0 点赞 / 2 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、脚本功能描述

本文分享的 Shell 脚本可帮助 DBA(数据库管理员)实现 Kingbase 数据库的自动化全量恢复,支持定时执行、错误处理和日志记录等功能。主要特点包括:

  1. 智能恢复流程
    • 自动解压备份文件(支持 tar.gz 格式)
    • 验证备份文件完整性,避免无效恢复
    • 使用 sys_restore命令完成数据库恢复
    • 自动清理临时文件,节省存储空间
  2. 参数化配置
    • 支持自定义备份文件路径和命名规则
    • 可配置数据库连接参数(主机、端口、用户名等)
    • 预设默认配置文件和配置位置
  3. 健壮性设计
    • 完整的错误处理机制(如文件不存在、解压失败)
    • 超时控制(支持 10 分钟超时自动终止)
    • 详细的日志记录,便于问题排查
  4. 灵活易用
    • 可作为定时任务(如通过 crontab)自动执行
    • 彩色输出提示,直观展示恢复进度
    • 支持交互式密码输入(通过 expect实现)

使用该脚本,您可以显著提高数据库恢复效率,减少人工干预,同时保障数据安全性和一致性。

2、使用示例

# 手动执行全量恢复
./全量恢复数据库脚本.sh

# 添加为定时任务(每天03:00执行)
crontab -e
# 添加以下行
0 3 * * * /path/to/全量恢复数据库脚本.sh >> /var/log/db_restore.log 2>&1

通过简单配置,该脚本即可适应不同项目需求,成为数据库运维的得力助手。

3、脚本内容

#!/usr/bin/env bash

# 添加定时任务:在crontab 文件中添加(需要修改具体路径)
# 0 3 * * * /path/to/全量恢复数据库脚本.sh >> /path/to/script.log 2>&1

# 配置数据库连接信息和备份文件路径(需要修改具体数据库信息)
DB_HOST="localhost"
DB_PORT="port"
DB_NAME="dbname"
DB_USER="username"
DB_PASSWORD="password"

# 打印恢复开始时间
echo "开始恢复数据库: $(date '+%Y-%m-%d %H:%M:%S')"

# 创建日志文件
restore_log="restore_filename_$(date '+%Y%m%d')02.log"

# 时间
current_date="$(date '+%Y%m%d')02"

# 要恢复的数据文件(需要修改具体文件路径)
backup_file="/root/filename_${current_date}.tar.gz"

# 检查备份文件是否存在
if [ ! -f "$backup_file" ]; then
    error_msg="$(date '+%Y%m%d%H') Error: 备份文件${backup_file}不存在."
    echo "$error_msg" >> $restore_log
    echo "$error_msg"
    exit 1
fi

# 解压备份文件(如果是压缩文件)
if [[ $backup_file == *.tar.gz ]]; then
    # 创建临时目录用于解压
    extract_dir=$(mktemp -d)
    echo "解压缩到临时目录: $extract_dir"

    # 解压到临时目录并捕获输出
    tar_output=$(tar zxvf "$backup_file" -C "$extract_dir" 2>&1)
    tar_status=$?

    if [ $tar_status -ne 0 ]; then
        error_msg="$(date '+%Y%m%d%H') Error: 提取备份文件${backup_file}失败."
        echo "$error_msg" >> $restore_log
        echo "$error_msg"
        echo "$tar_output" >> $restore_log  # 输出详细错误信息
        echo "$tar_output"
        rm -rf "$extract_dir"
        exit 1
    fi

    # 获取解压出的文件列表
    extracted_files=("$extract_dir"/*)

    # 检查是否有文件被解压出来
    if [ ${#extracted_files[@]} -eq 0 ]; then
        error_msg="$(date '+%Y%m%d%H') Error: 解压后没有找到文件."
        echo "$error_msg" >> $restore_log
        echo "$error_msg"
        rm -rf "$extract_dir"
        exit 1
    elif [ ${#extracted_files[@]} -gt 1 ]; then
        warning_msg="$(date '+%Y%m%d%H') Warning: 提取后发现多个文件。使用第一个."
        echo "$warning_msg" >> $restore_log
        echo "$warning_msg"
        echo "Extracted files: ${extracted_files[*]}" >> $restore_log
        echo "Extracted files: ${extracted_files[*]}"
    fi

    # 获取解压后的文件路径
    dmp_file="${extracted_files[0]}"

    echo "Extracted file: $dmp_file" >> $restore_log
    echo "Extracted file: $dmp_file"

else
    dmp_file="$backup_file"
fi

# 后续处理
echo "最终备份文件: $dmp_file" >> $restore_log
echo "最终备份文件: $dmp_file"

# 恢复数据库命令(需要修改sys_restore的具体路径)
restore_cmd="/data/apps/Kingbase/ClientTools/bin/sys_restore  -h $DB_HOST -p $DB_PORT -d $DB_NAME -U $DB_USER $dmp_file"

echo $restore_cmd >> $restore_log
echo $restore_cmd

# 使用 expect 执行恢复命令并记录输出
restore_output=$(
/usr/bin/expect <<EOF
set time 600
spawn $restore_cmd
expect {
    "Password:" { send "$DB_PASSWORD\r" }
	timeout {
        puts "执行超时,已超过 10 分钟,终止操作。"
        exit 1
    }
    eof {
        puts "操作结束。"
    }
}

log_file $restore_log
expect eof
EOF
)

restore_status=$?

if [ $restore_status -ne 0 ]; then
    error_msg="$(date '+%Y%m%d%H') Error: 恢复数据库失败."
    echo "$error_msg" >> $restore_log
    echo "$error_msg"
    echo "$restore_output" >> $restore_log  # 输出详细错误信息
    echo "$restore_output"
else
    success_msg="$(date '+%Y%m%d%H') Success: 数据库恢复成功."
    echo "$success_msg" >> $restore_log
    echo "$success_msg"
fi

# 清理临时目录
if [ -d "$extract_dir" ]; then
    rm -rf "$extract_dir"
fi

# 打印恢复结束时间
echo "恢复数据库完成: $(date '+%Y-%m-%d %H:%M:%S')" >> $restore_log
echo "恢复数据库完成: $(date '+%Y-%m-%d %H:%M:%S')"

0

评论区