Skip to content

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_temp

2. 使用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.sql

2. 基于文件系统的表恢复

对于使用独立表空间的表,可以直接从备份中复制表空间文件来恢复表。

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.txt

2. 使用自定义脚本恢复表数据

基于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.dmp

2. 使用逻辑复制恢复表

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版本。