1、脚本功能描述
本文分享的 Shell 脚本可帮助 DBA(数据库管理员)实现 Kingbase 数据库的自动化全量恢复,支持定时执行、错误处理和日志记录等功能。主要特点包括:
- 智能恢复流程
- 自动解压备份文件(支持 tar.gz 格式)
- 验证备份文件完整性,避免无效恢复
- 使用
sys_restore
命令完成数据库恢复 - 自动清理临时文件,节省存储空间
- 参数化配置
- 支持自定义备份文件路径和命名规则
- 可配置数据库连接参数(主机、端口、用户名等)
- 预设默认配置文件和配置位置
- 健壮性设计
- 完整的错误处理机制(如文件不存在、解压失败)
- 超时控制(支持 10 分钟超时自动终止)
- 详细的日志记录,便于问题排查
- 灵活易用
- 可作为定时任务(如通过
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')"
评论区