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工具

四、全库备份脚本(最终版)
#!/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

浙公网安备 33010602011771号