本文档风哥主要介绍HBase备份恢复实战,包括快照备份、导出备份、数据恢复等内容,风哥教程参考HBase官方文档Backup and Restore、Snapshots等内容,适合大数据开发运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 备份恢复概述
HBase备份恢复是保障数据安全的重要手段,可以在数据丢失或损坏时快速恢复数据。学习交流加群风哥微信: itpux-com
- 快照备份:轻量级、快速、元数据级别
- Export导出:数据级别、可跨集群
- CopyTable:表级别复制
- DistCp:HDFS级别复制
1. 快照备份
优点:
– 创建速度快(秒级)
– 存储空间小(元数据)
– 不影响业务
– 支持增量快照
缺点:
– 依赖原数据文件
– 不能跨集群直接恢复
– 需要定期导出
2. Export导出
优点:
– 数据完全独立
– 可跨集群恢复
– 支持增量导出
缺点:
– 导出时间长
– 占用存储空间大
– 影响集群性能
3. CopyTable
优点:
– 实时复制
– 可跨集群
缺点:
– 性能影响大
– 网络带宽消耗
4. DistCp
优点:
– HDFS级别
– 并行复制
缺点:
– 需要停服务
– 不一致性问题
# 备份恢复场景
1. 误操作恢复
– 误删表
– 误删数据
– 错误更新
2. 数据迁移
– 跨集群迁移
– 环境升级
3. 灾难恢复
– 机房故障
– 数据损坏
1.2 备份类型详解
备份类型详解:
1. 快照原理
– 记录表的元数据
– 不复制实际数据
– 使用HDFS快照机制
2. 快照类型
– 全量快照:完整表状态
– 增量快照:基于上次快照
3. 快照存储
– 元数据存储在HDFS
– 路径:/hbase/.hbase-snapshot
4. 快照操作
– 创建:snapshot ‘table’, ‘snapshot_name’
– 列出:list_snapshots
– 恢复:restore_snapshot ‘snapshot_name’
– 删除:delete_snapshot ‘snapshot_name’
# Export导出详解
1. Export原理
– 读取表数据
– 写入HDFS文件
– 使用MapReduce
2. Export类型
– 全量导出:所有数据
– 增量导出:指定时间范围
3. Export存储
– HDFS文件
– SequenceFile格式
4. Export操作
– 导出:hbase org.apache.hadoop.hbase.mapreduce.Export
– 导入:hbase org.apache.hadoop.hbase.mapreduce.Import
# CopyTable详解
1. CopyTable原理
– 读取源表数据
– 写入目标表
– 使用MapReduce
2. CopyTable类型
– 全表复制
– 范围复制
– 增量复制
3. CopyTable操作
– 命令:hbase org.apache.hadoop.hbase.mapreduce.CopyTable
# DistCp详解
1. DistCp原理
– HDFS文件复制
– 并行复制
– MapReduce实现
2. DistCp操作
– 命令:hadoop distcp
3. DistCp限制
– 需要停止写入
– 数据一致性问题
1.3 备份策略设计
备份策略设计详解:
1. 备份频率
– 核心表:每天快照 + 每周导出
– 重要表:每周快照 + 每月导出
– 一般表:每月快照
2. 备份保留
– 快照:保留7-30天
– 导出:保留30-90天
– 归档:保留1年以上
3. 备份验证
– 定期恢复测试
– 数据完整性验证
– 恢复时间评估
# 备份策略示例
1. 核心业务表
表名:fgedu_user, fgedu_order, fgedu_payment
备份策略:
– 每天凌晨2点创建快照
– 每周日凌晨3点导出
– 快照保留7天
– 导出保留30天
2. 重要业务表
表名:fgedu_log, fgedu_behavior
备份策略:
– 每周日凌晨2点创建快照
– 每月1号凌晨3点导出
– 快照保留14天
– 导出保留90天
3. 一般业务表
表名:fgedu_config, fgedu_temp
备份策略:
– 每月1号凌晨2点创建快照
– 快照保留30天
# 备份脚本示例
#!/bin/bash
# backup_hbase.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
DATE=$(date +%Y%m%d)
BACKUP_DIR=”/backup/hbase/$DATE”
LOG_FILE=”/bigdata/logs/hbase/backup_$DATE.log”
# 创建备份目录
hdfs dfs -mkdir -p $BACKUP_DIR
# 核心表快照
for table in fgedu_user fgedu_order fgedu_payment; do
snapshot_name=”${table}_${DATE}”
echo “$(date) Creating snapshot $snapshot_name” >> $LOG_FILE
echo “snapshot ‘$table’, ‘$snapshot_name'” | hbase shell >> $LOG_FILE 2>&1
done
# 导出快照
for table in fgedu_user fgedu_order fgedu_payment; do
snapshot_name=”${table}_${DATE}”
echo “$(date) Exporting snapshot $snapshot_name” >> $LOG_FILE
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot $snapshot_name \
-copy-to $BACKUP_DIR/snapshots \
>> $LOG_FILE 2>&1
done
# 清理旧快照
for table in fgedu_user fgedu_order fgedu_payment; do
old_date=$(date -d “7 days ago” +%Y%m%d)
old_snapshot=”${table}_${old_date}”
echo “$(date) Deleting old snapshot $old_snapshot” >> $LOG_FILE
echo “delete_snapshot ‘$old_snapshot'” | hbase shell >> $LOG_FILE 2>&1
done
echo “$(date) Backup completed” >> $LOG_FILE
Part02-生产环境规划与建议
2.1 备份规划建议
备份规划建议:
1. 存储规划
– 快照存储:HDFS(本地集群)
– 导出存储:HDFS(异地集群)
– 归档存储:对象存储(OSS/S3)
2. 网络规划
– 备份网络:独立网络
– 带宽限制:避免影响业务
– 跨集群备份:专线或VPN
3. 时间规划
– 备份时间:业务低峰期
– 导出时间:凌晨或周末
– 验证时间:定期执行
# 备份存储计算
假设:
– 表数据量:1TB
– 每天变化:50GB
– 快照保留:7天
– 导出保留:30天
存储需求:
– 快照存储:约10GB(元数据)
– 导出存储:1TB * 4次 = 4TB
– 增量导出:50GB * 30天 = 1.5TB
– 总计:约5.5TB
# 备份目录规划
HDFS目录结构:
/backup/hbase/
├── snapshots/
│ ├── 20260401/
│ │ ├── fgedu_user_20260401/
│ │ ├── fgedu_order_20260401/
│ │ └── fgedu_payment_20260401/
│ ├── 20260402/
│ └── …
├── exports/
│ ├── 20260401/
│ │ ├── fgedu_user/
│ │ ├── fgedu_order/
│ │ └── fgedu_payment/
│ └── …
└── logs/
└── backup_20260401.log
# 备份权限规划
1. HDFS权限
– 备份目录:hbase:hbase
– 权限:750
2. HBase权限
– 快照权限:Admin权限
– 导出权限:Read权限
# 创建备份目录
$ hdfs dfs -mkdir -p /backup/hbase/snapshots
$ hdfs dfs -mkdir -p /backup/hbase/exports
$ hdfs dfs -mkdir -p /backup/hbase/logs
$ hdfs dfs -chown -R hbase:hbase /backup/hbase
$ hdfs dfs -chmod -R 750 /backup/hbase
2.2 快照规划建议
快照规划建议:
# hbase-site.xml
# 快照命名规范
格式:表名_日期_类型
示例:
fgedu_user_20260401_daily
fgedu_user_20260401_weekly
fgedu_user_20260401_before_upgrade
# 快照管理脚本
#!/bin/bash
# snapshot_manager.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
TABLE=$1
TYPE=${2:-daily}
DATE=$(date +%Y%m%d)
SNAPSHOT_NAME=”${TABLE}_${DATE}_${TYPE}”
RETENTION_DAYS=${3:-7}
# 创建快照
create_snapshot() {
echo “$(date) Creating snapshot $SNAPSHOT_NAME”
echo “snapshot ‘$TABLE’, ‘$SNAPSHOT_NAME'” | hbase shell
}
# 清理旧快照
clean_old_snapshots() {
echo “$(date) Cleaning old snapshots for $TABLE”
old_snapshots=$(echo “list_snapshots ‘$TABLE.*'” | hbase shell | \
grep “$TABLE” | awk ‘{print $1}’)
for snapshot in $old_snapshots; do
snapshot_date=$(echo $snapshot | awk -F’_’ ‘{print $2}’)
snapshot_age=$(( ($(date +%s) – $(date -d $snapshot_date +%s)) / 86400 ))
if [ $snapshot_age -gt $RETENTION_DAYS ]; then
echo “$(date) Deleting old snapshot $snapshot”
echo “delete_snapshot ‘$snapshot'” | hbase shell
fi
done
}
# 验证快照
verify_snapshot() {
echo “$(date) Verifying snapshot $SNAPSHOT_NAME”
snapshot_info=$(echo “snapshot_info ‘$SNAPSHOT_NAME'” | hbase shell)
if echo “$snapshot_info” | grep -q “SNAPSHOT”; then
echo “$(date) Snapshot $SNAPSHOT_NAME created successfully”
return 0
else
echo “$(date) Failed to create snapshot $SNAPSHOT_NAME”
return 1
fi
}
# 主流程
create_snapshot
verify_snapshot
clean_old_snapshots
2.3 恢复规划建议
恢复规划建议:
1. 恢复时间目标(RTO)
– 核心表:< 1小时
- 重要表:< 4小时
- 一般表:< 24小时
2. 恢复点目标(RPO)
- 核心表:< 1小时
- 重要表:< 24小时
- 一般表:< 7天
3. 恢复优先级
- 核心表优先
- 业务依赖关系
- 数据量大小
# 恢复流程规划
1. 快照恢复流程
步骤:
a. 确认恢复目标
b. 选择合适的快照
c. 禁用目标表
d. 执行快照恢复
e. 启用目标表
f. 验证数据完整性
2. 导出恢复流程
步骤:
a. 确认恢复目标
b. 准备目标表
c. 执行数据导入
d. 验证数据完整性
e. 重建索引
3. 跨集群恢复流程
步骤:
a. 传输备份数据
b. 导入快照
c. 恢复表
d. 验证数据
# 恢复演练计划
1. 演练频率
- 核心表:每月一次
- 重要表:每季度一次
- 一般表:每半年一次
2. 演练内容
- 快照恢复测试
- 导出恢复测试
- 跨集群恢复测试
- 恢复时间记录
3. 演练报告
- 恢复时间
- 数据完整性
- 问题和改进
Part03-生产环境项目实施方案
3.1 快照备份实战
3.1.1 创建快照
hbase(main):001:0> snapshot ‘fgedu_user’, ‘fgedu_user_20260401’
Took 0.5678 seconds.
# 查看快照列表
hbase(main):002:0> list_snapshots
SNAPSHOT TABLE + CREATION TIME
fgedu_user_20260401 fgedu_user (Mon Apr 01 13:00:00 +0800 2026)
1 row(s)
Took 0.1234 seconds.
# 查看快照详细信息
hbase(main):003:0> snapshot_info ‘fgedu_user_20260401’
Snapshot Info:
Name: fgedu_user_20260401
Type: FLUSH
Table: fgedu_user
Creation Time: Mon Apr 01 13:00:00 +0800 2026
Format Version: 2
Snapshot Files:
Number of Files: 15
Total Size: 5.5 GB
# 创建带类型的快照
hbase(main):004:0> snapshot ‘fgedu_user’, ‘fgedu_user_20260401_daily’
Took 0.4567 seconds.
# 创建前先Flush
hbase(main):005:0> flush ‘fgedu_order’
hbase(main):006:0> snapshot ‘fgedu_order’, ‘fgedu_order_20260401’
Took 0.5678 seconds.
# 批量创建快照脚本
$ cat > /tmp/create_snapshots.rb << 'EOF'
# create_snapshots.rb
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
tables = ['fgedu_user', 'fgedu_order', 'fgedu_payment', 'fgedu_log']
date = Time.now.strftime('%Y%m%d')
tables.each do |table|
snapshot_name = "#{table}_#{date}_daily"
puts "Creating snapshot: #{snapshot_name}"
snapshot table, snapshot_name
end
puts "All snapshots created successfully"
EOF
hbase(main):007:0> load ‘/tmp/create_snapshots.rb’
Creating snapshot: fgedu_user_20260401_daily
Creating snapshot: fgedu_order_20260401_daily
Creating snapshot: fgedu_payment_20260401_daily
Creating snapshot: fgedu_log_20260401_daily
All snapshots created successfully
3.1.2 快照管理
hbase(main):008:0> list_snapshots
SNAPSHOT TABLE + CREATION TIME
fgedu_order_20260401 fgedu_order (Mon Apr 01 13:00:00 +0800 2026)
fgedu_payment_20260401 fgedu_payment (Mon Apr 01 13:00:00 +0800 2026)
fgedu_user_20260401 fgedu_user (Mon Apr 01 13:00:00 +0800 2026)
fgedu_user_20260401_daily fgedu_user (Mon Apr 01 13:00:00 +0800 2026)
4 row(s)
# 列出指定表的快照
hbase(main):009:0> list_snapshots ‘fgedu_user.*’
SNAPSHOT TABLE + CREATION TIME
fgedu_user_20260401 fgedu_user (Mon Apr 01 13:00:00 +0800 2026)
fgedu_user_20260401_daily fgedu_user (Mon Apr 01 13:00:00 +0800 2026)
2 row(s)
# 删除快照
hbase(main):010:0> delete_snapshot ‘fgedu_user_20260401_daily’
Took 0.1234 seconds.
# 克隆快照为新表
hbase(main):011:0> clone_snapshot ‘fgedu_user_20260401’, ‘fgedu_user_backup’
Took 1.2345 seconds.
# 验证克隆表
hbase(main):012:0> list
TABLE
fgedu_order
fgedu_payment
fgedu_user
fgedu_user_backup
4 row(s)
# 导出快照到HDFS
$ hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot fgedu_user_20260401 \
-copy-to hdfs://192.168.1.70:9000/backup/hbase/snapshots \
-mappers 4 \
-bandwidth 100
SLF4J: Class path contains multiple SLF4J bindings.
…
2026-04-01 13:10:00,123 INFO [main] snapshot.ExportSnapshot: Copy Snapshot fgedu_user_20260401
2026-04-01 13:10:00,234 INFO [main] snapshot.ExportSnapshot: Target filesystem: hdfs://192.168.1.70:9000
2026-04-01 13:10:00,345 INFO [main] snapshot.ExportSnapshot: Starting copy process
…
2026-04-01 13:15:00,123 INFO [main] snapshot.ExportSnapshot: Copy completed: 15 files, 5.5 GB
2026-04-01 13:15:00,234 INFO [main] snapshot.ExportSnapshot: Export snapshot completed successfully
3.2 导出备份实战
3.2.1 Export导出
$ hbase org.apache.hadoop.hbase.mapreduce.Export \
-D hbase.zookeeper.quorum=192.168.1.60,192.168.1.61,192.168.1.62 \
-D mapreduce.job.maps=4 \
fgedu_user \
/backup/hbase/exports/20260401/fgedu_user
SLF4J: Class path contains multiple SLF4J bindings.
…
2026-04-01 13:20:00,123 INFO [main] mapreduce.Export: Exporting table fgedu_user to /backup/hbase/exports/20260401/fgedu_user
2026-04-01 13:20:00,234 INFO [main] mapreduce.Export: Number of maps: 4
…
2026-04-01 13:30:00,123 INFO [main] mapreduce.Export: Export completed successfully
2026-04-01 13:30:00,234 INFO [main] mapreduce.Export: Total records exported: 10000000
# 增量导出(指定时间范围)
$ hbase org.apache.hadoop.hbase.mapreduce.Export \
-D hbase.zookeeper.quorum=192.168.1.60,192.168.1.61,192.168.1.62 \
-D mapreduce.job.maps=4 \
fgedu_user \
/backup/hbase/exports/20260401/fgedu_user_incremental \
1 \
1711929600000 \
1712016000000
# 查看导出数据
$ hdfs dfs -ls /backup/hbase/exports/20260401/fgedu_user
Found 5 items
-rw-r–r– 3 hbase hbase 1073741824 2026-04-01 13:25 /backup/hbase/exports/20260401/fgedu_user/part-m-00000
-rw-r–r– 3 hbase hbase 1073741824 2026-04-01 13:26 /backup/hbase/exports/20260401/fgedu_user/part-m-00001
-rw-r–r– 3 hbase hbase 1073741824 2026-04-01 13:27 /backup/hbase/exports/20260401/fgedu_user/part-m-00002
-rw-r–r– 3 hbase hbase 1073741824 2026-04-01 13:28 /backup/hbase/exports/20260401/fgedu_user/part-m-00003
-rw-r–r– 3 hbase hbase 512 2026-04-01 13:28 /backup/hbase/exports/20260401/fgedu_user/_SUCCESS
# 查看导出数据大小
$ hdfs dfs -du -h /backup/hbase/exports/20260401/fgedu_user
4.0 G 12.0 G /backup/hbase/exports/20260401/fgedu_user
3.2.2 CopyTable复制
$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
–new.name=fgedu_user_copy \
fgedu_user
SLF4J: Class path contains multiple SLF4J bindings.
…
2026-04-01 13:35:00,123 INFO [main] mapreduce.CopyTable: Copying table fgedu_user to fgedu_user_copy
…
2026-04-01 13:45:00,123 INFO [main] mapreduce.CopyTable: Copy completed successfully
# 复制表到远程集群
$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
–peer.adr=192.168.1.70,192.168.1.71,192.168.1.72:/hbase \
–new.name=fgedu_user \
fgedu_user
# 复制指定范围数据
$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
–new.name=fgedu_user_partial \
–startrow=user_00000001 \
–stoprow=user_00010000 \
fgedu_user
# 复制指定时间范围数据
$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
–new.name=fgedu_user_recent \
–starttime=1711929600000 \
–endtime=1712016000000 \
fgedu_user
# 验证复制结果
hbase(main):013:0> count ‘fgedu_user_copy’
Current count: 1000000, row: user_00099999
1000000 row(s)
Took 123.456 seconds.
3.3 数据恢复实战
3.3.1 快照恢复
hbase(main):014:0> disable ‘fgedu_user’
Took 0.5678 seconds.
hbase(main):015:0> restore_snapshot ‘fgedu_user_20260401’
Took 1.2345 seconds.
hbase(main):016:0> enable ‘fgedu_user’
Took 0.7890 seconds.
# 验证恢复结果
hbase(main):017:0> count ‘fgedu_user’
Current count: 1000000, row: user_00099999
1000000 row(s)
Took 123.456 seconds.
# 恢复快照到新表
hbase(main):018:0> clone_snapshot ‘fgedu_user_20260401’, ‘fgedu_user_restored’
Took 1.2345 seconds.
# 验证新表
hbase(main):019:0> count ‘fgedu_user_restored’
Current count: 1000000, row: user_00099999
1000000 row(s)
Took 123.456 seconds.
# 从远程快照恢复
$ hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot fgedu_user_20260401 \
-copy-from hdfs://192.168.1.70:9000/backup/hbase/snapshots \
-copy-to /hbase \
-mappers 4
hbase(main):020:0> list_snapshots ‘fgedu_user.*’
SNAPSHOT TABLE + CREATION TIME
fgedu_user_20260401 fgedu_user (Mon Apr 01 13:00:00 +0800 2026)
1 row(s)
3.3.2 Import导入
$ hbase org.apache.hadoop.hbase.mapreduce.Import \
-D hbase.zookeeper.quorum=192.168.1.60,192.168.1.61,192.168.1.62 \
-D mapreduce.job.maps=4 \
fgedu_user \
/backup/hbase/exports/20260401/fgedu_user
SLF4J: Class path contains multiple SLF4J bindings.
…
2026-04-01 14:00:00,123 INFO [main] mapreduce.Import: Importing data from /backup/hbase/exports/20260401/fgedu_user to table fgedu_user
…
2026-04-01 14:10:00,123 INFO [main] mapreduce.Import: Import completed successfully
2026-04-01 14:10:00,234 INFO [main] mapreduce.Import: Total records imported: 10000000
# 导入数据到新表
hbase(main):021:0> create ‘fgedu_user_import’, ‘info’
Created table fgedu_user_import
$ hbase org.apache.hadoop.hbase.mapreduce.Import \
fgedu_user_import \
/backup/hbase/exports/20260401/fgedu_user
# 验证导入结果
hbase(main):022:0> count ‘fgedu_user_import’
Current count: 1000000, row: user_00099999
1000000 row(s)
Took 123.456 seconds.
# 增量导入
$ hbase org.apache.hadoop.hbase.mapreduce.Import \
-D import.bulk.output=/tmp/bulk_output \
fgedu_user \
/backup/hbase/exports/20260401/fgedu_user_incremental
# Bulk Load导入
$ hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
/tmp/bulk_output \
fgedu_user
Part04-生产案例与实战讲解
4.1 全量备份案例
# 1. 创建备份脚本
$ cat > /bigdata/scripts/hbase_full_backup.sh << 'EOF'
#!/bin/bash
# hbase_full_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/hbase/full/$DATE"
LOG_FILE="/bigdata/logs/hbase/full_backup_$DATE.log"
# 核心表列表
CORE_TABLES="fgedu_user fgedu_order fgedu_payment"
echo "$(date) Starting full backup" >> $LOG_FILE
# 创建备份目录
hdfs dfs -mkdir -p $BACKUP_DIR
for table in $CORE_TABLES; do
echo “$(date) Processing table: $table” >> $LOG_FILE
# Flush表
echo “$(date) Flushing table $table” >> $LOG_FILE
echo “flush ‘$table'” | hbase shell >> $LOG_FILE 2>&1
# 创建快照
snapshot_name=”${table}_${DATE}_full”
echo “$(date) Creating snapshot $snapshot_name” >> $LOG_FILE
echo “snapshot ‘$table’, ‘$snapshot_name'” | hbase shell >> $LOG_FILE 2>&1
# 导出快照
echo “$(date) Exporting snapshot $snapshot_name” >> $LOG_FILE
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot $snapshot_name \
-copy-to $BACKUP_DIR/$table \
-mappers 8 \
-bandwidth 200 \
>> $LOG_FILE 2>&1
# 导出数据
echo “$(date) Exporting table data $table” >> $LOG_FILE
hbase org.apache.hadoop.hbase.mapreduce.Export \
-D mapreduce.job.maps=8 \
$table \
$BACKUP_DIR/${table}_data \
>> $LOG_FILE 2>&1
done
echo “$(date) Full backup completed” >> $LOG_FILE
# 发送通知
echo “Full backup completed at $(date)” | mail -s “HBase Full Backup Report” admin@fgedu.net.cn
EOF
$ chmod +x /bigdata/scripts/hbase_full_backup.sh
# 2. 执行备份
$ /bigdata/scripts/hbase_full_backup.sh
# 3. 验证备份
$ hdfs dfs -ls /backup/hbase/full/20260401
Found 6 items
drwxr-xr-x – hbase hbase 0 2026-04-01 14:00 /backup/hbase/full/20260401/fgedu_user
drwxr-xr-x – hbase hbase 0 2026-04-01 14:10 /backup/hbase/full/20260401/fgedu_user_data
drwxr-xr-x – hbase hbase 0 2026-04-01 14:20 /backup/hbase/full/20260401/fgedu_order
drwxr-xr-x – hbase hbase 0 2026-04-01 14:30 /backup/hbase/full/20260401/fgedu_order_data
drwxr-xr-x – hbase hbase 0 2026-04-01 14:40 /backup/hbase/full/20260401/fgedu_payment
drwxr-xr-x – hbase hbase 0 2026-04-01 14:50 /backup/hbase/full/20260401/fgedu_payment_data
# 4. 查看备份大小
$ hdfs dfs -du -h /backup/hbase/full/20260401
15.0 G 45.0 G /backup/hbase/full/20260401
4.2 增量备份案例
# 1. 创建增量备份脚本
$ cat > /bigdata/scripts/hbase_incremental_backup.sh << 'EOF'
#!/bin/bash
# hbase_incremental_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/hbase/incremental/$DATE"
LOG_FILE="/bigdata/logs/hbase/incremental_backup_$DATE.log"
LAST_BACKUP_TIME=$(cat /bigdata/scripts/last_backup_time.txt 2>/dev/null || echo “0”)
# 获取当前时间戳
CURRENT_TIME=$(date +%s)000
echo “$(date) Starting incremental backup” >> $LOG_FILE
echo “$(date) Last backup time: $LAST_BACKUP_TIME” >> $LOG_FILE
echo “$(date) Current time: $CURRENT_TIME” >> $LOG_FILE
# 创建备份目录
hdfs dfs -mkdir -p $BACKUP_DIR
# 核心表列表
CORE_TABLES=”fgedu_user fgedu_order fgedu_payment”
for table in $CORE_TABLES; do
echo “$(date) Processing table: $table” >> $LOG_FILE
# 创建快照
snapshot_name=”${table}_${DATE}_incr”
echo “$(date) Creating snapshot $snapshot_name” >> $LOG_FILE
echo “snapshot ‘$table’, ‘$snapshot_name'” | hbase shell >> $LOG_FILE 2>&1
# 增量导出
if [ “$LAST_BACKUP_TIME” != “0” ]; then
echo “$(date) Incremental export for $table” >> $LOG_FILE
hbase org.apache.hadoop.hbase.mapreduce.Export \
-D mapreduce.job.maps=4 \
$table \
$BACKUP_DIR/$table \
1 \
$LAST_BACKUP_TIME \
$CURRENT_TIME \
>> $LOG_FILE 2>&1
fi
done
# 更新最后备份时间
echo $CURRENT_TIME > /bigdata/scripts/last_backup_time.txt
echo “$(date) Incremental backup completed” >> $LOG_FILE
EOF
$ chmod +x /bigdata/scripts/hbase_incremental_backup.sh
# 2. 配置定时任务
$ crontab -e
# 每天凌晨2点执行增量备份
0 2 * * * /bigdata/scripts/hbase_incremental_backup.sh
# 每周日凌晨3点执行全量备份
0 3 * * 0 /bigdata/scripts/hbase_full_backup.sh
# 3. 执行增量备份
$ /bigdata/scripts/hbase_incremental_backup.sh
# 4. 验证增量备份
$ hdfs dfs -ls /backup/hbase/incremental/20260402
Found 3 items
drwxr-xr-x – hbase hbase 0 2026-04-02 02:10 /backup/hbase/incremental/20260402/fgedu_user
drwxr-xr-x – hbase hbase 0 2026-04-02 02:20 /backup/hbase/incremental/20260402/fgedu_order
drwxr-xr-x – hbase hbase 0 2026-04-02 02:30 /backup/hbase/incremental/20260402/fgedu_payment
4.3 常见问题处理
4.3.1 快照创建失败
# 排查步骤
# 1. 查看错误日志
$ grep -i “snapshot” /bigdata/logs/hbase/hbase-hbase-master-*.log
# 2. 检查表状态
hbase(main):023:0> describe ‘fgedu_user’
# 3. 检查Region状态
hbase(main):024:0> list_regions ‘fgedu_user’
# 解决方案
# 1. 确保表已启用
hbase(main):025:0> enable ‘fgedu_user’
# 2. 检查是否有正在进行的操作
# Web UI -> Procedures
# 3. 手动Flush后创建快照
hbase(main):026:0> flush ‘fgedu_user’
hbase(main):027:0> snapshot ‘fgedu_user’, ‘fgedu_user_20260402’
4.3.2 恢复数据不一致
# 排查步骤
# 1. 对比数据量
hbase(main):028:0> count ‘fgedu_user’
hbase(main):029:0> count ‘fgedu_user_backup’
# 2. 抽样检查数据
hbase(main):030:0> get ‘fgedu_user’, ‘user_00000001’
hbase(main):031:0> get ‘fgedu_user_backup’, ‘user_00000001’
# 解决方案
# 1. 确保恢复前禁用表
hbase(main):032:0> disable ‘fgedu_user’
# 2. 使用正确的快照
hbase(main):033:0> restore_snapshot ‘fgedu_user_20260401’
# 3. 恢复后执行Major Compaction
hbase(main):034:0> enable ‘fgedu_user’
hbase(main):035:0> major_compact ‘fgedu_user’
Part05-风哥经验总结与分享
5.1 备份最佳实践
HBase备份最佳实践建议:
1. 定期备份核心表
2. 快照+导出双重保障
3. 异地备份容灾
4. 定期恢复演练
5. 监控备份任务
5.2 恢复建议
恢复建议:
- 恢复前先验证备份数据
- 恢复到新表测试
- 恢复后验证数据完整性
- 记录恢复时间
5.3 工具推荐
备份恢复工具:
- HBase Snapshot:快照备份
- Export/Import:数据导出导入
- CopyTable:表复制
- DistCp:HDFS复制
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
