一、前提假设(可根据环境调整)
| 项目 | 假设值 |
|---|---|
| 数据库 | 人大金仓 KingbaseES |
| 部署方式 | Docker 容器 |
| 容器名称 | kingbase |
| 数据库用户 | system |
| 数据库名 | testdb |
| 数据库端口 | 54321 |
| 备份目录 | /data/backup/kingbase |
| 备份保留天数 | 7 天 |
| 备份工具 | sys_dump / sys_restore |
⚠️ 人大金仓兼容 PostgreSQL 协议,但必须使用自带的 sys_dump 与 sys_restore,不可用 pg_dump。
二、自动备份脚本
📄 backup_kingbase.sh
bash
#!/bin/bash
# ================= 配置区 =================
CONTAINER_NAME="kingbase"
DB_USER="system"
DB_NAME="testdb"
DB_PORT="54321"
BACKUP_DIR="/data/backup/kingbase"
DATE=$(date +"%Y%m%d_%H%M%S")
KEEP_DAYS=7
# =========================================
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 备份文件名
BACKUP_FILE="$BACKUP_DIR/kingbase_${DB_NAME}_${DATE}.dump"
echo "[$(date)] 开始备份 Kingbase 数据库:$DB_NAME"
# 在 Docker 容器中执行 sys_dump
docker exec "$CONTAINER_NAME" \
sys_dump \
-U "$DB_USER" \
-d "$DB_NAME" \
-p "$DB_PORT" \
-Fc \
-f "/tmp/$(basename "$BACKUP_FILE")"
# 从容器拷贝到宿主机
docker cp "$CONTAINER_NAME:/tmp/$(basename "$BACKUP_FILE")" "$BACKUP_FILE"
# 清理容器内临时文件
docker exec "$CONTAINER_NAME" rm -f "/tmp/$(basename "$BACKUP_FILE")"
if [ $? -eq 0 ]; then
echo "[$(date)] 备份成功:$BACKUP_FILE"
else
echo "[$(date)] 备份失败"
exit 1
fi
# 删除过期备份
find "$BACKUP_DIR" -name "kingbase_*.dump" -mtime +$KEEP_DAYS -delete
echo "[$(date)] 清理超过 $KEEP_DAYS 天的备份完成"
三、脚本赋权
bash
chmod +x backup_kingbase.sh
四、手动测试
bash
./backup_kingbase.sh
验证备份文件
bash
ls /data/backup/kingbase
预期结果:
kingbase_testdb_20260115_030000.dump
五、配置定时任务(Crontab)
编辑定时任务:
bash
crontab -e
每天凌晨 2 点执行备份:
0 2 * * * /path/to/backup_kingbase.sh >> /var/log/backup_kingbase.log 2>&1
六、数据库恢复示例(重要)
1️⃣ 将备份文件拷贝进容器
bash
docker cp kingbase_testdb_20260115_030000.dump kingbase:/tmp/
2️⃣ 执行恢复
bash
docker exec -it kingbase \
sys_restore \
-U system \
-d testdb \
-p 54321 \
-c \
/tmp/kingbase_testdb_20260115_030000.dump
-c:恢复前清理已有对象,避免冲突。
七、人大金仓特有说明
✅ 为什么使用 sys_dump / sys_restore?
| 工具 | 说明 |
|---|---|
sys_dump |
人大金仓专用备份工具 |
sys_restore |
人大金仓专用恢复工具 |
pg_dump |
版本不兼容,禁止使用 |
✅ 端口说明
| 数据库 | 默认端口 |
|---|---|
| PostgreSQL | 5432 |
| 人大金仓 | 54321 |