1. 首页 > Hadoop教程 > 正文

大数据教程FG078-HBase备份恢复实战

本文档风哥主要介绍HBase备份恢复实战,包括快照备份、导出备份、数据恢复等内容,风哥教程参考HBase官方文档Backup and Restore、Snapshots等内容,适合大数据开发运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 备份恢复概述

HBase备份恢复是保障数据安全的重要手段,可以在数据丢失或损坏时快速恢复数据。学习交流加群风哥微信: itpux-com

HBase备份恢复方式:

  • 快照备份:轻量级、快速、元数据级别
  • Export导出:数据级别、可跨集群
  • CopyTable:表级别复制
  • DistCp:HDFS级别复制
# HBase备份方式对比

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 hbase.snapshot.enabled
true
hbase.snapshot.master.timeout.millis
300000
hbase.snapshot.region.timeout
300000

# 快照命名规范

格式:表名_日期_类型

示例:
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. 演练报告 - 恢复时间 - 数据完整性 - 问题和改进

生产环境建议:生产环境建议建立完善的备份恢复体系,定期执行备份和恢复演练。核心表建议每天快照+每周导出,确保RPO和RTO满足业务要求。学习交流加群风哥QQ113257174

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

风哥提示:快照恢复速度快,适合误操作恢复。导出恢复适合跨集群恢复和灾难恢复。建议根据恢复场景选择合适的恢复方式。更多学习教程公众号风哥教程itpux_com

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 恢复建议

恢复建议:

HBase恢复建议:

  • 恢复前先验证备份数据
  • 恢复到新表测试
  • 恢复后验证数据完整性
  • 记录恢复时间

5.3 工具推荐

备份恢复工具:

  • HBase Snapshot:快照备份
  • Export/Import:数据导出导入
  • CopyTable:表复制
  • DistCp:HDFS复制
风哥提示:备份恢复是数据安全的最后防线。建议建立完善的备份恢复体系,定期演练,确保关键时刻能够快速恢复数据。from bigdata视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息