Kingbase 数据库定时备份脚本

一、备份目标与设计原则

目标

  • 对 Kingbase(PostgreSQL 兼容)数据库进行全库数据备份
  • 支持 crontab 定时执行
  • 备份文件与日志文件分目录存放,便于运维管理

设计原则

  • 自动化(无交互)
  • 安全(不在脚本中明文写密码)
  • 可恢复(使用自定义格式备份)
  • 可维护(日志清晰、结构规范)

二、目录结构规范(log / data 分离)

/data/db_data_back/
└── dify
    ├── data        # 数据备份文件
    │   ├── dify_full_20260106.backup.gz
    │   └── ...
    └── log         # 备份日志
        └── db_backup_202601.log

说明:

  • data/:只存放数据库备份数据文件
  • log/:只存放日志文件,不参与清理

三、免密认证方式(必须)

进入安装数据库的bin目录下使用sys_encpwd工具

image


四、全库备份脚本(最终版)

#!/bin/bash

############################################
# Kingbase 全库数据备份脚本
############################################

set -o nounset
set -o pipefail

# Kingbase bin 目录
kdb_home="/data/kingbase/ES/V9/Server/bin"

# 备份根目录
backup_root="/data/db_data_back"

# 数据库连接信息
kdb_user="system"
kdb_host="localhost"
kdb_port="5432"
database="dify"

# 数据保留天数
keep_days=60

# 日期
current_date=$(date '+%Y%m%d')

# 目录结构
db_root="${backup_root}/${database}"
data_dir="${db_root}/data"
log_dir="${db_root}/log"

mkdir -p "${data_dir}" "${log_dir}"

# 日志文件
log_file="${log_dir}/db_backup_$(date '+%Y%m').log"
touch "${log_file}" || exit 1

# 备份文件
dump_file="${data_dir}/${database}_full_${current_date}.backup"

# 日志开始
{
  echo "======================================"
  echo "全库备份开始时间: $(date '+%Y-%m-%d %H:%M:%S')"
  echo "数据库: ${database}"
  echo "======================================"
} >> "${log_file}"

# 执行备份
"${kdb_home}/sys_dump" \
  -h "${kdb_host}" \
  -p "${kdb_port}" \
  -U "${kdb_user}" \
  -w \
  -F c \
  -f "${dump_file}" \
  "${database}"

if [ $? -ne 0 ]; then
  echo "❌ 数据库备份失败" >> "${log_file}"
  exit 1
fi

echo "✅ 数据库备份成功" >> "${log_file}"

# 压缩
gzip "${dump_file}"

if [ $? -eq 0 ]; then
  echo "✅ 备份文件压缩成功" >> "${log_file}"
else
  echo "⚠️ 压缩失败" >> "${log_file}"
fi

# 清理过期数据备份
echo "开始清理 ${keep_days} 天前的数据备份文件" >> "${log_file}"

old_files=$(find "${data_dir}" -type f -name "*.gz" -mtime "+${keep_days}" 2>/dev/null)
old_count=$(echo "${old_files}" | grep -c . || true)

if [ "${old_count}" -gt 0 ]; then
  echo "${old_files}" | while read -r file; do
    echo "删除过期备份: ${file}" >> "${log_file}"
    rm -f "${file}"
  done
  echo "清理完成,删除 ${old_count} 个文件" >> "${log_file}"
else
  echo "无过期备份文件" >> "${log_file}"
fi

# 日志结束
{
  echo "备份结束时间: $(date '+%Y-%m-%d %H:%M:%S')"
  echo "======================================"
  echo ""
} >> "${log_file}"

五、crontab 定时示例

每天凌晨 3 点执行:

0 3 * * * /bin/bash /path/kingbase_db_backup.sh

建议:

  • 使用 绝对路径
  • 使用与 .pgpass 同一个用户

六、恢复命令示例

1. 解压

gunzip dify_full_20260106.backup.gz

2. 恢复数据库

sys_restore -U system -d dify dify_full_20260106.backup

七、常见注意事项

  • 不要在脚本中明文写密码
  • .pgpass 权限必须是 600
  • 清理操作只针对 data 目录,避免误删日志
  • 建议使用专用备份账号(只读 + dump 权限)

八、可扩展方向(后续可加)

  • 周备 / 月备(长期留存)
  • 备份失败告警(邮件 / 企业微信)
  • 备份完成后 rsync / scp 到异地
  • 备份文件完整性校验(sys_restore -l)
Kingbase 多数据库全库备份脚本
#!/bin/bash

################################################
# Kingbase 多数据库全库备份脚本
################################################

# ====== 安全设置 ======
set -o nounset
set -o pipefail

# ====== 基础配置 ======
# Kingbase bin 目录
kdb_home="/data/kingbase/ES/V9/Server/bin"

# 备份根目录
backup_root="/data/db_data_back"

# 数据库连接信息
kdb_user="system"
kdb_host="localhost"
kdb_port="5432"

# 需要备份的数据库列表
databases=("dify" "dify_plugin")

# 备份保留天数
keep_days=60

# ====== 时间变量 ======
current_date=$(date '+%Y%m%d')

# ====== 循环备份每个数据库 ======
for database in "${databases[@]}"; do

    # ====== 目录结构 ======
    db_root="${backup_root}/${database}"
    data_dir="${db_root}/data"
    log_dir="${db_root}/log"

    mkdir -p "${data_dir}" "${log_dir}"

    # ====== 日志文件 ======
    log_file="${log_dir}/db_backup_$(date '+%Y%m').log"
    touch "${log_file}" || exit 1

    # ====== 备份文件 ======
    dump_file="${data_dir}/${database}_full_${current_date}.backup"

    # ====== 日志开始 ======
    {
    echo "======================================"
    echo "数据库备份开始: ${database}"
    echo "开始时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "======================================"
    } >> "${log_file}"

    # ====== 执行备份 ======
    "${kdb_home}/sys_dump" \
        -h "${kdb_host}" \
        -p "${kdb_port}" \
        -U "${kdb_user}" \
        -w \
        -F c \
        -f "${dump_file}" \
        "${database}"

    if [ $? -ne 0 ]; then
        echo "❌ 数据库 ${database} 备份失败" >> "${log_file}"
        continue
    fi

    echo "✅ 数据库 ${database} 备份成功" >> "${log_file}"

    # ====== 压缩 ======
    gzip "${dump_file}"

    if [ $? -eq 0 ]; then
        echo "✅ 数据库 ${database} 压缩成功" >> "${log_file}"
    else
        echo "⚠️ 数据库 ${database} 压缩失败" >> "${log_file}"
    fi

    # ====== 清理过期数据文件 ======
    echo "开始清理 ${keep_days} 天前的数据备份文件" >> "${log_file}"

    old_files=$(find "${data_dir}" -type f -name "*.gz" -mtime "+${keep_days}" 2>/dev/null)
    old_count=$(echo "${old_files}" | grep -c . || true)

    if [ "${old_count}" -gt 0 ]; then
        echo "${old_files}" | while read -r file; do
            echo "删除过期备份: ${file}" >> "${log_file}"
            rm -f "${file}"
        done
        echo "清理完成,删除 ${old_count} 个文件" >> "${log_file}"
    else
        echo "无过期备份文件需要清理" >> "${log_file}"
    fi

    # ====== 日志结束 ======
    {
    echo "结束时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "======================================"
    echo ""
    } >> "${log_file}"

done

posted @ 2026-01-06 16:46  槑孒  阅读(10)  评论(0)    收藏  举报