1. 项目背景与需求解析
作为国产数据库领域的核心产品,金仓KingbaseES在企业级应用中扮演着重要角色。在实际运维过程中,我们经常遇到只需备份特定业务表的需求——比如仅备份订单表而排除日志表,或者只导出某个模块的关联表集合。这种精细化备份相比全库备份能显著节省存储空间和操作时间。
传统做法是先用sys_dump导出整个数据库再筛选,但面对TB级数据库时,这种方法既浪费资源又效率低下。更合理的方案是通过脚本实现表级精准备份,这也是本次要分享的实战解决方案。
2. 技术方案设计
2.1 核心工具选型
KingbaseES提供了完整的命令行工具链,其中两个核心组件是:
ksql:交互式查询客户端,支持执行SQL文件sys_dump:官方逻辑备份工具,支持表级导出
经过实测对比,直接使用sys_dump的-t参数指定表名是最可靠的方案。其优势在于:
- 原生支持断点续传
- 自动处理外键依赖关系
- 输出格式兼容性强(支持SQL、CSV等多种格式)
2.2 脚本架构设计
完整备份流程包含以下关键环节:
mermaid复制graph TD
A[读取表名清单] --> B[生成备份命令]
B --> C[执行备份操作]
C --> D[验证备份文件]
D --> E[日志记录]
3. 具体实现步骤
3.1 基础环境准备
首先确保已安装KingbaseES客户端工具集。检查方法:
bash复制which sys_dump
which ksql
若未找到,需用root执行:
bash复制yum install kingbase-common kingbase-client # CentOS
apt install kingbase-common kingbase-client # Ubuntu
3.2 备份脚本实现
创建backup_tables.sh脚本:
bash复制#!/bin/bash
# 定义连接参数
DB_HOST="192.168.1.100"
DB_PORT="54321"
DB_USER="dba_admin"
DB_NAME="erp_prod"
BACKUP_DIR="/backups/kingbase"
# 需要备份的表清单
TABLES=(
"public.order_master"
"public.order_detail"
"finance.invoice"
)
# 按日期创建备份目录
BACKUP_DATE=$(date +%Y%m%d)
mkdir -p "${BACKUP_DIR}/${BACKUP_DATE}"
# 逐表备份
for TABLE in "${TABLES[@]}"; do
echo "[$(date '+%F %T')] 开始备份 ${TABLE}"
# 提取schema和table名
IFS='.' read -r SCHEMA TABLE_NAME <<< "${TABLE}"
sys_dump -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} \
-d ${DB_NAME} -t "${SCHEMA}.${TABLE_NAME}" \
-F c -Z 6 -f "${BACKUP_DIR}/${BACKUP_DATE}/${TABLE_NAME}.dump"
# 验证备份文件
if [ ! -s "${BACKUP_DIR}/${BACKUP_DATE}/${TABLE_NAME}.dump" ]; then
echo "ERROR: 备份文件为空!"
exit 1
fi
done
echo "[$(date '+%F %T')] 所有表备份完成"
关键参数说明:
-F c:使用自定义压缩格式-Z 6:启用6级压缩(0-9,默认6)-t:指定schema.table格式的表名
3.3 权限配置
为确保脚本顺利执行,需要:
- 创建专用备份用户:
sql复制CREATE USER backup_user WITH PASSWORD 'StrongPass123!';
GRANT CONNECT ON DATABASE erp_prod TO backup_user;
GRANT USAGE ON SCHEMA public,finance TO backup_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public,finance TO backup_user;
- 配置pg_hba.conf:
code复制host erp_prod backup_user 192.168.1.50/32 md5
4. 高级功能扩展
4.1 自动排除大字段
对于包含BLOB/CLOB等大字段的表,建议添加--exclude-table-data参数:
bash复制sys_dump ... --exclude-table-data "*.file_storage" ...
4.2 并行备份加速
当备份多张大表时,启用并行模式:
bash复制sys_dump ... -j 4 ... # 使用4个并行进程
4.3 定时任务配置
通过crontab实现每日自动备份:
bash复制0 2 * * * /usr/local/scripts/backup_tables.sh >> /var/log/kb_backup.log 2>&1
5. 常见问题处理
5.1 备份中断恢复
当网络故障导致备份中断时:
- 检查临时文件:
bash复制ls -lh /tmp/sys_dump_*
- 使用
--clean重新执行:
bash复制sys_dump ... --clean ...
5.2 权限不足问题
典型错误:
code复制ERROR: permission denied for schema xxx
解决方案:
sql复制ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO backup_user;
5.3 备份文件过大
优化策略:
- 分卷压缩:
bash复制sys_dump ... | split -b 1G - backup_part_
- 排除历史数据:
sql复制-- 只备份最近3个月数据
WHERE create_time > CURRENT_DATE - INTERVAL '3 months'
6. 备份验证方案
6.1 完整性检查
使用pg_restore测试恢复:
bash复制pg_restore -l order_master.dump | grep -c "TABLE DATA"
6.2 数据比对
随机抽样验证:
sql复制-- 原表
SELECT COUNT(*) FROM order_master WHERE order_date > '2023-01-01';
-- 恢复后
SELECT COUNT(*) FROM restored.order_master WHERE order_date > '2023-01-01';
6.3 自动化验证脚本
创建verify_backup.sh:
bash复制#!/bin/bash
RESTORE_DB="backup_verify_$(date +%s)"
createdb ${RESTORE_DB}
pg_restore -d ${RESTORE_DB} $1
if [ $? -ne 0 ]; then
echo "恢复测试失败!"
exit 1
fi
# 执行验证SQL
VERIFY_RESULT=$(ksql -h localhost -U postgres -d ${RESTORE_DB} -t -c "SELECT COUNT(*) FROM order_master;")
if [ ${VERIFY_RESULT} -gt 0 ]; then
echo "验证通过"
else
echo "数据异常"
fi
dropdb ${RESTORE_DB}
7. 性能优化建议
-
IO优化:
- 将备份目录挂载为独立磁盘
- 使用
ionice降低IO优先级:
bash复制
ionice -c 3 sys_dump ... -
内存控制:
bash复制
sys_dump ... --rows-per-insert=1000 ... -
网络优化:
- 添加
-W参数分块传输 - 使用SSH隧道加密:
bash复制
ssh -L 65432:localhost:54321 user@dbserver sys_dump -h localhost -p 65432 ... - 添加
8. 灾备方案设计
建议采用3-2-1备份原则:
- 3份副本(本地+异地+云存储)
- 2种介质(磁盘+磁带)
- 1份离线备份
典型部署架构:
code复制 +-----------------+
| 生产数据库集群 |
+--------+--------+
| sys_dump
+--------v--------+
| 本地备份服务器 |
+--------+--------+
| rsync
+--------v--------+
| 异地备份中心 |
+--------+--------+
| rclone
+--------v--------+
| 云存储OSS |
+-----------------+
9. 监控与告警
9.1 监控指标
关键监控项包括:
- 备份成功率
- 备份耗时
- 备份文件大小变化
- 恢复测试结果
9.2 Prometheus配置示例
yaml复制- job_name: 'kingbase_backup'
metrics_path: '/probe'
params:
module: [backup_check]
static_configs:
- targets:
- /backups/kingbase/latest/order_master.dump
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
9.3 告警规则
yaml复制groups:
- name: backup.rules
rules:
- alert: BackupFailed
expr: probe_success{job="kingbase_backup"} == 0
for: 1h
labels:
severity: critical
annotations:
summary: "Kingbase备份失败 (instance {{ $labels.instance }})"
description: "{{ $labels.instance }} 备份已连续失败1小时"
10. 安全加固措施
- 备份文件加密:
bash复制sys_dump ... | openssl enc -aes-256-cbc -salt -out backup.enc
- 最小权限原则:
sql复制REVOKE ALL ON DATABASE erp_prod FROM backup_user;
GRANT CONNECT ON DATABASE erp_prod TO backup_user;
- 传输安全:
bash复制rsync -e "ssh -p 2222 -i /path/to/key" backup.dump user@remote:/backups/
- 审计日志:
sql复制ALTER SYSTEM SET log_statement = 'ddl';
ALTER SYSTEM SET log_connections = on;