外观
KingBaseES 备份实施与验证
备份实施概述
备份实施是将备份策略转化为实际操作的过程,包括选择合适的备份工具、执行备份操作、监控备份过程和验证备份结果。
物理备份实施
物理备份是直接备份数据库物理文件,恢复速度快,适合全量备份和灾难恢复。
1. 使用 pg_basebackup 进行物理备份
1.1 准备工作
- 确保主库已启用 WAL 归档
- 确保主库已配置复制用户和权限
- 确保备库可以连接到主库
1.2 执行备份
bash
# 全量备份
pg_basebackup -h 192.168.1.100 -p 54321 -U repluser -D /backup/kingbase_full_$(date +%Y%m%d) -Fp -Xs -P -v
# 压缩备份
pg_basebackup -h 192.168.1.100 -p 54321 -U repluser -D /backup/kingbase_full_$(date +%Y%m%d) -Fp -Xs -P -v -z
# 流式备份(直接输出到tar文件)
pg_basebackup -h 192.168.1.100 -p 54321 -U repluser -F t -Xs -P -v -f /backup/kingbase_full_$(date +%Y%m%d).tar1.3 备份参数说明
| 参数 | 说明 |
|---|---|
-h | 主库主机名或IP地址 |
-p | 主库端口 |
-U | 复制用户名 |
-D | 备份目录 |
-F | 备份格式(p:普通格式,t:tar格式) |
-X | WAL包含方式(f:备份开始时获取WAL,s:流式获取WAL) |
-P | 显示备份进度 |
-v | 显示详细信息 |
-z | 启用压缩 |
-f | 指定输出文件名(仅用于tar格式) |
2. 使用文件系统快照进行物理备份
2.1 准备工作
- 确保使用支持快照功能的文件系统(如LVM、ZFS)
- 确保数据库已关闭或处于一致性状态
2.2 执行备份
bash
# 1. 进入一致性状态
su - kingbase
pg_controldata /data/kingbase
# 2. 创建表空间快照
lvcreate -L 100G -s -n kingbase_snap /dev/vg0/kingbase
# 3. 退出一致性状态
# 如果数据库已关闭,直接启动数据库
# 如果数据库处于只读模式,切换回读写模式
# 4. 挂载快照并备份
mkdir -p /mnt/kingbase_snap
mount /dev/vg0/kingbase_snap /mnt/kingbase_snap
tar -czvf /backup/kingbase_snap_$(date +%Y%m%d).tar.gz /mnt/kingbase_snap
# 5. 卸载并删除快照
umount /mnt/kingbase_snap
lvremove -f /dev/vg0/kingbase_snap逻辑备份实施
逻辑备份是备份数据库的逻辑对象,跨版本兼容性好,适合选择性恢复和数据迁移。
1. 使用 pg_dump 进行逻辑备份
1.1 备份整个数据库
bash
# 导出为自定义格式(推荐)
pg_dump -h localhost -p 54321 -U system -d kingbase -F c -b -v -f /backup/kingbase_full_logical_$(date +%Y%m%d).dmp
# 导出为SQL脚本
pg_dump -h localhost -p 54321 -U system -d kingbase -F p -b -v -f /backup/kingbase_full_logical_$(date +%Y%m%d).sql
# 导出为tar格式
pg_dump -h localhost -p 54321 -U system -d kingbase -F t -b -v -f /backup/kingbase_full_logical_$(date +%Y%m%d).tar1.2 备份特定数据库对象
bash
# 备份特定表
pg_dump -h localhost -p 54321 -U system -d kingbase -F c -t public.employee -v -f /backup/kingbase_employee_$(date +%Y%m%d).dmp
# 备份特定模式
pg_dump -h localhost -p 54321 -U system -d kingbase -F c -n public -v -f /backup/kingbase_public_schema_$(date +%Y%m%d).dmp
# 备份特定函数
pg_dump -h localhost -p 54321 -U system -d kingbase -F c -f public.get_employee_info -v -f /backup/kingbase_function_$(date +%Y%m%d).dmp1.3 备份参数说明
| 参数 | 说明 |
|---|---|
-h | 数据库主机名或IP地址 |
-p | 数据库端口 |
-U | 用户名 |
-d | 数据库名 |
-F | 输出格式(c:自定义,p:SQL,t:tar) |
-b | 包含大对象 |
-v | 显示详细信息 |
-f | 输出文件名 |
-t | 备份特定表 |
-n | 备份特定模式 |
-f | 备份特定函数 |
2. 使用 ksql 进行逻辑备份
bash
# 导出为SQL脚本
ksql -h localhost -p 54321 -U system -d kingbase -c "\o /backup/kingbase_ksql_$(date +%Y%m%d).sql" -c "\dt+" -c "SELECT * FROM public.employee;"3. 使用 pg_dumpall 备份所有数据库
bash
# 备份所有数据库
pg_dumpall -h localhost -p 54321 -U system -v -f /backup/kingbase_all_databases_$(date +%Y%m%d).sqlWAL 归档配置与管理
1. 配置 WAL 归档
编辑 kingbase.conf 文件:
ini
# 启用归档
archive_mode = on
# 归档命令
archive_command = 'cp %p /archive/%f'
# 归档超时时间
archive_timeout = 60
# WAL级别
wal_level = replica2. 管理 WAL 归档
bash
# 创建归档目录
mkdir -p /archive
chown -R kingbase:kingbase /archive
# 配置归档清理策略
# 保留最近7天的归档
sudo find /archive -name "*.history" -o -name "*.backup" -o -name "0000000*" | grep -v "000000010000000000000000" | xargs ls -t | tail -n +100 | xargs rm -f备份验证
备份验证是确保备份可用的重要步骤,应该定期进行。
1. 备份完整性验证
1.1 物理备份完整性验证
bash
# 检查备份目录结构
sudo -u kingbase pg_controldata /backup/kingbase_full_20231001
# 验证数据文件一致性
sudo -u kingbase pg_checksums -c -D /backup/kingbase_full_202310011.2 逻辑备份完整性验证
bash
# 验证自定义格式备份
pg_restore --list /backup/kingbase_full_logical_20231001.dmp
# 验证SQL脚本语法
psql -h localhost -p 54321 -U system -d template1 -f /backup/kingbase_full_logical_20231001.sql --echo-errors --dry-run2. 备份可恢复性验证
2.1 物理备份恢复验证
bash
# 停止测试环境数据库
systemctl stop kingbase8d.service
# 清空测试环境数据目录
rm -rf /data/kingbase/*
# 恢复物理备份
sudo -u kingbase cp -r /backup/kingbase_full_20231001/* /data/kingbase/
# 启动数据库
systemctl start kingbase8d.service
# 验证数据库可用性
psql -h localhost -p 54321 -U system -d kingbase -c "SELECT 1;"2.2 逻辑备份恢复验证
bash
# 创建测试数据库
psql -h localhost -p 54321 -U system -c "CREATE DATABASE test_restore;"
# 恢复逻辑备份
pg_restore -h localhost -p 54321 -U system -d test_restore -F c -b -v /backup/kingbase_full_logical_20231001.dmp
# 验证数据完整性
psql -h localhost -p 54321 -U system -d test_restore -c "SELECT COUNT(*) FROM public.employee;"
# 清理测试数据库
psql -h localhost -p 54321 -U system -c "DROP DATABASE test_restore;"3. 备份性能验证
bash
# 记录备份时间
time pg_dump -h localhost -p 54321 -U system -d kingbase -F c -b -f /backup/kingbase_perf_test.dmp
# 记录恢复时间
time pg_restore -h localhost -p 54321 -U system -d test_db -F c -b /backup/kingbase_perf_test.dmp备份自动化
1. 编写备份脚本
创建自动化备份脚本 kingbase_backup.sh:
bash
#!/bin/bash
# 配置参数
BACKUP_DIR="/backup"
DB_HOST="localhost"
DB_PORT="54321"
DB_USER="system"
DB_NAME="kingbase"
REPL_USER="repluser"
BACKUP_RETENTION_DAYS=7
# 创建备份目录
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/$DATE"
mkdir -p $BACKUP_PATH
# 执行物理备份
echo "开始执行物理备份..."
pgsql -h $DB_HOST -p $DB_PORT -U $DB_USER -c "SELECT pg_start_backup('physical_backup_$DATE');"
ping -c 3 $DB_HOST
pg_basebackup -h $DB_HOST -p $DB_PORT -U $REPL_USER -D $BACKUP_PATH/physical -Fp -Xs -P -v
pgsql -h $DB_HOST -p $DB_PORT -U $DB_USER -c "SELECT pg_stop_backup();"
echo "物理备份完成:$BACKUP_PATH/physical"
# 执行逻辑备份
echo "开始执行逻辑备份..."
pgsql -h $DB_HOST -p $DB_PORT -U $DB_USER -c "CREATE DATABASE IF NOT EXISTS temp_backup;"
pq_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -F c -b -v -f $BACKUP_PATH/logical.dmp
echo "逻辑备份完成:$BACKUP_PATH/logical.dmp"
# 清理过期备份
echo "清理过期备份..."
find $BACKUP_DIR -type d -mtime +$BACKUP_RETENTION_DAYS -exec rm -rf {} \;
echo "备份任务完成!"2. 配置定时任务
bash
# 编辑crontab
crontab -e
# 添加定时任务(每天凌晨2:00执行备份)
0 2 * * * /opt/kingbase/scripts/kingbase_backup.sh >> /var/log/kingbase_backup.log 2>&1备份最佳实践
1. 备份前准备
- 确保数据库处于健康状态
- 检查磁盘空间是否充足
- 通知相关团队备份计划
- 暂停不必要的业务操作
2. 备份中注意事项
- 监控备份进度和资源使用情况
- 记录备份过程中的日志
- 处理备份过程中的错误
- 确保备份过程不影响生产系统性能
3. 备份后操作
- 验证备份完整性和可恢复性
- 记录备份信息(时间、大小、类型)
- 复制备份到异地存储
- 更新备份文档和恢复手册
4. 备份安全
- 加密备份文件
- 限制备份文件的访问权限
- 定期更换备份存储密码
- 考虑备份文件的销毁策略
常见问题
Q1: pg_basebackup 备份失败,提示 "connection to server failed"?
解决方案:
- 检查主库是否正常运行
- 验证复制用户权限是否正确
- 检查防火墙是否开放相关端口
- 确认主库
pg_hba.conf中是否允许复制连接
Q2: 逻辑备份文件太大,无法传输?
解决方案:
- 使用压缩备份
- 分表备份
- 使用增量备份替代全量备份
- 考虑使用物理备份
Q3: 恢复备份时提示 "permission denied"?
解决方案:
- 确保数据目录权限正确
- 使用正确的用户执行恢复操作
- 检查文件系统权限
Q4: WAL 归档失败,提示 "No space left on device"?
解决方案:
- 清理归档目录,删除过期的WAL文件
- 扩大归档目录所在的磁盘空间
- 调整
wal_keep_size参数,减少保留的WAL文件数量
Q5: 备份验证时发现数据不一致?
解决方案:
- 检查备份过程是否中断
- 验证备份时的数据库状态
- 考虑使用更可靠的备份方法
- 检查硬件是否存在故障
版本差异注意事项
V8 R6 与 V8 R7 备份差异
| 特性 | V8 R6 | V8 R7 |
|---|---|---|
| pg_basebackup 压缩 | 不支持 | 支持 -z 参数 |
| WAL 压缩 | 不支持 | 支持 wal_compression 参数 |
| 并行备份 | 有限支持 | 增强支持 |
| 备份验证工具 | 基本工具 | 增强的验证工具 |
| 云存储支持 | 不支持 | 内置支持 |
总结
备份实施与验证是数据库运维中不可或缺的环节,直接关系到数据的安全性和可靠性。通过合理选择备份工具、执行备份操作、验证备份结果,并结合自动化脚本和定时任务,可以确保备份的完整性和可恢复性。
在实施备份时,应注意:
- 根据业务需求选择合适的备份类型
- 定期验证备份的完整性和可恢复性
- 自动化备份过程,减少人工干预
- 备份数据存储在安全可靠的位置
- 建立完善的备份文档和恢复手册
通过遵循备份最佳实践,可以最大程度地减少数据丢失风险,确保在发生灾难时能够快速恢复数据,保障业务的连续性。
