外观
KingBaseES 表级恢复
表级恢复是KingBaseES数据库恢复的重要组成部分,当单个表或少数表出现数据丢失、损坏或误操作时,表级恢复可以快速恢复这些表的数据,而不需要恢复整个数据库,从而减少恢复时间和业务影响。本文将详细介绍KingBaseES的表级恢复方案。
表级恢复概述
表级恢复的优势
- 快速恢复:只恢复需要的表,减少恢复时间
- 业务影响小:不需要停止整个数据库服务
- 资源消耗低:只需要恢复部分数据,减少CPU、内存和IO资源消耗
- 灵活性高:可以选择性地恢复表的部分数据
表级恢复的适用场景
- 误删除表:表被意外删除
- 误删除数据:表中的数据被意外删除
- 数据损坏:表的数据文件损坏
- 表结构错误:表结构被错误修改
- 数据逻辑错误:业务逻辑错误导致数据不一致
- 测试环境数据恢复:从生产环境恢复表到测试环境
表级恢复的类型
| 恢复类型 | 恢复方式 | 适用场景 | 恢复速度 |
|---|---|---|---|
| 逻辑恢复 | 使用sys_dump/sys_restore | 误删除数据、表结构错误 | 较慢 |
| 物理恢复 | 使用pg_restore_table | 数据文件损坏、大规模数据恢复 | 较快 |
| 基于WAL的恢复 | 使用pg_waldump + 自定义脚本 | 误删除数据、精确时间点恢复 | 中等 |
| 基于副本的恢复 | 从备库复制表 | 主库表损坏、误删除表 | 较快 |
逻辑恢复方法
1. 使用sys_dump/sys_restore恢复表
基于全量备份的表恢复
bash
# 1. 从全量备份中提取指定表
# 查看备份文件中的表列表
sys_restore -l /opt/kingbase/backup/full_backup.dmp
# 2. 创建包含需要恢复表的表清单文件
echo "- schema - public" > table_list.txt
echo "- table - public.users" >> table_list.txt
echo "- table - public.orders" >> table_list.txt
# 3. 从备份中恢复指定表
sys_restore -d test -U system -L table_list.txt /opt/kingbase/backup/full_backup.dmp基于时间点的表恢复
bash
# 1. 恢复整个数据库到指定时间点(临时数据库)
sys_restore -d test_temp -U system -j 4 /opt/kingbase/backup/full_backup.dmp
# 2. 使用pg_resetwal恢复到指定时间点
pg_resetwal -D /opt/kingbase/data_temp --time='2023-05-15 14:30:00'
# 3. 启动临时数据库
kdb5start -D /opt/kingbase/data_temp -i
# 4. 从临时数据库导出需要恢复的表
sys_dump -d test_temp -U system -t public.users -t public.orders -f /tmp/table_backup.dmp
# 5. 关闭临时数据库
kdb5stop -D /opt/kingbase/data_temp -m fast
# 6. 将表恢复到目标数据库
sys_restore -d test -U system /tmp/table_backup.dmp
# 7. 清理临时文件
rm -rf /tmp/table_backup.dmp /opt/kingbase/data_temp2. 使用ksql命令恢复表数据
从SQL文件恢复表
bash
# 1. 从备份中导出表结构和数据
ksql -U system -d test -c "COPY public.users TO '/tmp/users.sql' WITH (FORMAT text);"
# 2. 恢复表结构(如果表已删除)
ksql -U system -d test -c "CREATE TABLE public.users (id serial PRIMARY KEY, name varchar(50), email varchar(100));"
# 3. 恢复表数据
ksql -U system -d test -c "COPY public.users FROM '/tmp/users.sql' WITH (FORMAT text);"从CSV文件恢复表
bash
# 1. 从备份中导出表数据为CSV格式
ksql -U system -d test -c "COPY public.users TO '/tmp/users.csv' WITH (FORMAT csv, HEADER true);"
# 2. 恢复表数据
ksql -U system -d test -c "COPY public.users FROM '/tmp/users.csv' WITH (FORMAT csv, HEADER true);"物理恢复方法
1. 使用pg_restore_table工具恢复表
pg_restore_table是KingBaseES提供的一个物理表恢复工具,可以直接从数据文件中恢复表数据,适用于大规模表的快速恢复。
安装pg_restore_table
bash
# 编译安装pg_restore_table
git clone https://github.com/df7cb/pg_restore_table.git
cd pg_restore_table
make && make install使用pg_restore_table恢复表
bash
# 1. 查看表的OID
ksql -U system -d test -c "SELECT oid, relname FROM pg_class WHERE relname = 'users';"
# 2. 恢复表(假设表OID为16384)
pg_restore_table -D /opt/kingbase/data -C test -t users -O 16384 -o /tmp/users.sql
# 3. 导入恢复的表数据
ksql -U system -d test -f /tmp/users.sql2. 基于文件系统的表恢复
对于使用独立表空间的表,可以直接从备份中复制表空间文件来恢复表。
bash
# 1. 停止数据库服务
kdb5stop -D /opt/kingbase/data -m fast
# 2. 从备份中复制表空间文件
cp -r /opt/kingbase/backup/tbs_user_data/* /opt/kingbase/tbs/user_data/
# 3. 启动数据库服务
kdb5start -D /opt/kingbase/data -i
# 4. 验证表是否恢复成功
ksql -U system -d test -c "SELECT COUNT(*) FROM public.users;"基于WAL的表恢复
1. 使用pg_waldump分析WAL日志
bash
# 查看WAL日志文件列表
ls -la /opt/kingbase/archive/
# 分析WAL日志,查找表的修改记录
pg_waldump -p /opt/kingbase/archive/000000010000000000000001 | grep -i "users"
# 导出指定时间范围内的WAL日志到SQL文件
pg_waldump -p /opt/kingbase/archive/000000010000000000000001 -s "2023-05-15 14:00:00" -e "2023-05-15 14:30:00" -f /tmp/wal_analysis.txt2. 使用自定义脚本恢复表数据
基于WAL日志分析结果,编写自定义脚本恢复表数据:
bash
#!/bin/bash
# 从WAL日志中提取INSERT语句
pg_waldump -p /opt/kingbase/archive/000000010000000000000001 | grep -i "INSERT INTO users" > /tmp/insert_statements.sql
# 清理INSERT语句格式
sed -i 's/^.*INSERT/INSERT/' /tmp/insert_statements.sql
# 导入恢复的数据
ksql -U system -d test -f /tmp/insert_statements.sql基于副本的表恢复
1. 从备库复制表
bash
# 1. 在备库上导出表
sys_dump -d test -U system -t public.users -f /tmp/users.dmp
# 2. 将备份文件复制到主库
scp /tmp/users.dmp kingbase@master:/tmp/
# 3. 在主库上恢复表
sys_restore -d test -U system /tmp/users.dmp2. 使用逻辑复制恢复表
bash
# 1. 在主库上创建发布
ksql -U system -d test -c "CREATE PUBLICATION users_pub FOR TABLE public.users;"
# 2. 在目标库上创建订阅
ksql -U system -d test_target -c "CREATE SUBSCRIPTION users_sub CONNECTION 'host=master port=54321 dbname=test user=system password=Kingbase123' PUBLICATION users_pub;"
# 3. 验证数据同步
ksql -U system -d test_target -c "SELECT COUNT(*) FROM public.users;"
# 4. 删除发布和订阅(可选)
ksql -U system -d test -c "DROP PUBLICATION users_pub;"
ksql -U system -d test_target -c "DROP SUBSCRIPTION users_sub;"版本差异(V8 R6 vs V8 R7)
V8 R6 表级恢复
- 表级恢复功能相对有限
- 主要依赖sys_dump/sys_restore工具
- 不支持pg_restore_table工具
- 基于WAL的恢复功能较弱
- 逻辑复制功能不完善
V8 R7 表级恢复
- 增强了表级恢复功能
- 支持pg_restore_table物理恢复工具
- 改进了sys_dump/sys_restore工具,支持并行恢复
- 增强了基于WAL的恢复功能
- 完善了逻辑复制功能
- 支持表级备份和恢复的更多选项
最佳实践
1. 备份策略
- 定期执行逻辑备份:定期使用sys_dump备份关键表
- 启用WAL归档:确保WAL日志被归档,以便进行基于时间点的恢复
- 使用表空间:将重要表放在独立的表空间,便于物理恢复
- 测试备份:定期测试备份的可用性和完整性
2. 恢复前准备
- 评估恢复需求:确定需要恢复的表和数据
- 备份当前数据:在恢复前备份当前数据,防止恢复失败
- 选择合适的恢复方法:根据恢复场景选择合适的恢复方法
- 准备恢复环境:确保恢复环境的数据库版本与备份一致
3. 恢复过程
- 先恢复表结构:确保表结构正确
- 再恢复表数据:恢复表中的数据
- 验证恢复结果:检查恢复后的数据完整性和一致性
- 更新统计信息:恢复后更新表的统计信息,优化查询性能
4. 恢复后验证
- 数据完整性验证:检查恢复后的数据行数、总和等统计信息
- 数据一致性验证:检查表之间的外键关系和业务逻辑一致性
- 性能验证:检查恢复后的表查询性能
- 业务验证:通过业务测试验证恢复后的数据正确性
常见问题(FAQ)
Q1:如何恢复误删除的表?
A1:
- 如果有逻辑备份,使用sys_restore从备份中恢复表
- 如果有WAL归档,使用基于WAL的恢复方法
- 如果有备库,从备库复制表
- 如果启用了表空间,使用基于文件系统的恢复方法
Q2:如何恢复表中的部分数据?
A2:
- 使用sys_dump的
--where选项导出部分数据 - 使用COPY命令的WHERE子句导出部分数据
- 使用基于WAL的恢复方法,只恢复指定时间范围内的数据
- 使用逻辑复制,只复制满足条件的数据
Q3:表级恢复需要停止数据库服务吗?
A3:
- 逻辑恢复:不需要停止数据库服务
- 物理恢复:如果是从文件系统恢复,需要停止数据库服务
- 基于副本的恢复:不需要停止数据库服务
Q4:如何提高表级恢复的速度?
A4:
- 使用物理恢复方法
- 启用并行恢复
- 使用高性能存储设备
- 减少恢复的数据量
- 优化恢复参数(如work_mem、maintenance_work_mem)
Q5:如何防止表级恢复失败?
A5:
- 定期测试备份和恢复流程
- 确保备份的完整性和可用性
- 使用多种备份策略
- 建立完善的恢复计划
- 对恢复人员进行培训
总结
表级恢复是KingBaseES数据库恢复的重要组成部分,具有快速恢复、业务影响小、资源消耗低和灵活性高等优势。在实际应用中,应根据恢复场景选择合适的恢复方法,如逻辑恢复、物理恢复、基于WAL的恢复或基于副本的恢复。同时,应建立完善的备份策略,定期测试备份和恢复流程,确保在需要时能够快速、可靠地恢复表数据。V8 R7版本相比V8 R6版本提供了更强大的表级恢复功能,建议在新部署时优先选择V8 R7版本。
