GBase 8a
备份恢复
文章
精选
GBase 8a 备份与恢复实战指南:gbackup 全量 + 增量备份详解
发表于2026-03-24 09:45:3925次浏览4个评论
一、为什么备份策略对 GBase 8a 尤为重要?
GBase 8a 是面向海量数据分析的 MPP 分布式数据库,数据分散存储在多个节点上。一旦出现以下情况,没有可靠备份就是灾难:
- 硬件故障导致节点数据损坏;
- 误操作
DROP TABLE或DELETE删除关键数据; - 集群升级失败需要回滚;
- 机房断电导致数据文件损坏。
与单机数据库不同,MPP 集群的备份需要协调全部节点同步,不能只备份单个节点的数据文件,否则恢复出来的数据是不一致的。
本文围绕 GBase 8a 官方工具 gbackup 展开,结合 mysqldump 的补充使用场景,提供一套完整的备份策略参考。
二、备份工具选型:gbackup vs mysqldump
| 对比项 | gbackup | mysqldump |
|---|---|---|
| 备份类型 | 物理备份 | 逻辑备份 |
| 速度 | 快(直接拷贝数据文件) | 慢(生成 SQL 语句) |
| 恢复速度 | 快 | 慢(需逐条执行 SQL) |
| 备份粒度 | 整库/集群 | 库、表级别 |
| 压缩支持 | 支持 | 支持 |
| 跨平台迁移 | 较弱 | 强(标准 SQL) |
| 适合场景 | 全量灾备、大数据量 | 少量表迁移、跨平台导数 |
结论:生产环境以 gbackup 为主,mysqldump 作为精细粒度的补充工具。
三、gbackup 全量备份
3.1 备份前准备
确认以下环境条件:
# 1. 确认所有节点正常运行
gcadmin showall
# 2. 确认备份目录存在且有足够空间(建议至少是数据量的 1.5 倍)
df -h /backup/gbase
# 3. 确认各节点备份目录已挂载(NFS 或本地均可)
ls -l /backup/gbase/
3.2 执行全量备份
# 基本全量备份命令
gbackup \
--backup-dir=/backup/gbase/full_20240601 \
--backup-type=full \
--user=gbase \
--password=your_password \
--host=coordinator_ip \
--port=5258
# 带压缩的全量备份(节省存储空间)
gbackup \
--backup-dir=/backup/gbase/full_20240601 \
--backup-type=full \
--compress \
--user=gbase \
--password=your_password \
--host=coordinator_ip \
--port=5258
参数说明:
| 参数 | 说明 |
|---|---|
--backup-dir | 备份文件存放路径,建议以日期命名 |
--backup-type | 备份类型:full(全量)/ incremental(增量) |
--compress | 开启压缩,节省 30%~50% 存储空间 |
--host | 连接的 CoordNode IP |
--port | 默认端口 5258 |
3.3 验证备份是否成功
# 查看备份目录内容
ls -lh /backup/gbase/full_20240601/
# 查看备份日志
cat /backup/gbase/full_20240601/backup.log | tail -20
# 关键字:出现 "backup completed successfully" 表示成功
四、gbackup 增量备份
增量备份只备份上次全量或增量备份之后变更的数据,速度更快、占用空间更少,适合配合全量备份做每日增量。
4.1 增量备份命令
# 基于上次全量备份做增量备份
gbackup \
--backup-dir=/backup/gbase/incr_20240602 \
--backup-type=incremental \
--incremental-basedir=/backup/gbase/full_20240601 \
--user=gbase \
--password=your_password \
--host=coordinator_ip \
--port=5258
--incremental-basedir 指向上一次备份的目录(可以是全量或上一次增量)。
4.2 推荐备份节奏
周日 → 全量备份(full)
周一 → 增量备份(基于周日全量)
周二 → 增量备份(基于周一增量)
周三 → 增量备份(基于周二增量)
...
周六 → 增量备份(基于周五增量)
下周日 → 新一轮全量备份
这样最坏情况下只丢失 1 天数据,且存储空间消耗远小于每天全量。
五、数据恢复:从备份中还原
5.1 全量恢复
# 停止数据库服务(恢复前必须停库)
gcadmin stop
# 执行全量恢复
grestore \
--backup-dir=/backup/gbase/full_20240601 \
--user=gbase \
--password=your_password \
--host=coordinator_ip \
--port=5258
# 恢复完成后启动数据库
gcadmin start
⚠️ 注意:恢复操作会覆盖现有数据,执行前务必确认目标环境,切勿在生产库上误执行恢复命令。
5.2 全量 + 增量组合恢复
如果需要恢复到某个增量备份时间点,需要先恢复全量,再依次应用增量:
# 第一步:恢复全量备份
grestore \
--backup-dir=/backup/gbase/full_20240601 \
--apply-log-only \
--user=gbase --password=your_password
# 第二步:应用增量备份(周一)
grestore \
--backup-dir=/backup/gbase/incr_20240602 \
--apply-log-only \
--incremental-dir=/backup/gbase/incr_20240602
# 第三步:应用增量备份(周二),最后一个不加 --apply-log-only
grestore \
--backup-dir=/backup/gbase/full_20240601 \
--incremental-dir=/backup/gbase/incr_20240603
# 第四步:启动数据库
gcadmin start
--apply-log-only 的作用是在应用日志后不做最终 rollback,保留未提交事务,以便后续增量继续叠加。最后一个增量应用时去掉此参数,让恢复过程做最终的事务 rollback,得到一致性状态。
六、mysqldump 补充使用场景
对于个别表的导出、跨平台迁移,mysqldump 更灵活:
# 导出单个数据库
mysqldump -h coordinator_ip -P 5258 -u gbase -p \
--databases sales_db > /backup/sales_db_20240601.sql
# 导出单张表
mysqldump -h coordinator_ip -P 5258 -u gbase -p \
sales_db orders > /backup/orders_20240601.sql
# 带压缩的导出
mysqldump -h coordinator_ip -P 5258 -u gbase -p \
sales_db | gzip > /backup/sales_db_20240601.sql.gz
导入恢复:
# 普通导入
mysql -h coordinator_ip -P 5258 -u gbase -p sales_db < /backup/orders_20240601.sql
# 压缩包直接导入
gunzip < /backup/sales_db_20240601.sql.gz | mysql -h coordinator_ip -P 5258 -u gbase -p
七、备份自动化:crontab 定时任务
将备份命令写入脚本,通过 crontab 定时执行:
# /usr/local/scripts/gbase_backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_BASE=/backup/gbase
COORD_IP=192.168.1.10
GBASE_USER=gbase
GBASE_PASS=your_password
# 每周日执行全量,其他天执行增量
DAY_OF_WEEK=$(date +%u)
if [ "$DAY_OF_WEEK" -eq 7 ]; then
# 全量备份
BACKUP_DIR=$BACKUP_BASE/full_$DATE
gbackup --backup-dir=$BACKUP_DIR --backup-type=full \
--compress --user=$GBASE_USER --password=$GBASE_PASS \
--host=$COORD_IP --port=5258
echo "Full backup completed: $BACKUP_DIR" >> /var/log/gbase_backup.log
else
# 增量备份(找最近一次全量目录)
LAST_FULL=$(ls -dt $BACKUP_BASE/full_* | head -1)
BACKUP_DIR=$BACKUP_BASE/incr_$DATE
gbackup --backup-dir=$BACKUP_DIR --backup-type=incremental \
--incremental-basedir=$LAST_FULL \
--compress --user=$GBASE_USER --password=$GBASE_PASS \
--host=$COORD_IP --port=5258
echo "Incremental backup completed: $BACKUP_DIR" >> /var/log/gbase_backup.log
fi
# 删除 30 天前的备份
find $BACKUP_BASE -maxdepth 1 -mtime +30 -exec rm -rf {} \;
# 添加到 crontab(每天凌晨 2 点执行)
crontab -e
0 2 * * * /bin/bash /usr/local/scripts/gbase_backup.sh
八、备份检查清单
养成定期验证备份有效性的习惯,备份文件存在 ≠ 备份可用:
□ 备份日志最后一行是否显示 "completed successfully"?
□ 备份文件大小是否与上次接近(异常缩小可能意味着备份不完整)?
□ 每月至少做一次恢复演练,验证备份文件可以正常还原?
□ 备份文件是否异地存储(同机房备份无法应对机房级故障)?
□ 备份保留周期是否符合业务合规要求(金融、医疗一般要求 3~6 个月)?
九、总结
| 场景 | 推荐方案 |
|---|---|
| 生产全量灾备 | gbackup 全量 + 周期增量 |
| 单表/单库迁移 | mysqldump |
| 跨版本升级保险 | 升级前先做一次 gbackup 全量 |
| 误删数据恢复 | gbackup 恢复到最近备份点 + binlog 补齐 |
| 自动化运维 | crontab + 备份脚本 + 异地同步 |
备份不是目的,能恢复才是目的。建议每季度做一次完整的恢复演练,确保关键时刻备份真的能用。
评论
登录后才可以发表评论
热门帖子
- 12025-12-01浏览数:182111
- 22023-05-09浏览数:24381
- 42023-09-25浏览数:17598
- 52020-05-11浏览数:16623