GBase 8a
备份恢复
文章
精选

GBase 8a 备份与恢复实战指南:gbackup 全量 + 增量备份详解

发表于2026-03-24 09:45:3925次浏览4个评论

一、为什么备份策略对 GBase 8a 尤为重要?

GBase 8a 是面向海量数据分析的 MPP 分布式数据库,数据分散存储在多个节点上。一旦出现以下情况,没有可靠备份就是灾难:

  • 硬件故障导致节点数据损坏;
  • 误操作 DROP TABLEDELETE 删除关键数据;
  • 集群升级失败需要回滚;
  • 机房断电导致数据文件损坏。

与单机数据库不同,MPP 集群的备份需要协调全部节点同步,不能只备份单个节点的数据文件,否则恢复出来的数据是不一致的。

本文围绕 GBase 8a 官方工具 gbackup 展开,结合 mysqldump 的补充使用场景,提供一套完整的备份策略参考。


二、备份工具选型:gbackup vs mysqldump

对比项gbackupmysqldump
备份类型物理备份逻辑备份
速度快(直接拷贝数据文件)慢(生成 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 + 备份脚本 + 异地同步

备份不是目的,能恢复才是目的。建议每季度做一次完整的恢复演练,确保关键时刻备份真的能用。


评论

登录后才可以发表评论
用户头像
柒柒天晴发表于 1个月前
学习了
用户头像
山佳发表于 1个月前
学习了
GBase用户47954发表于 28天前
感谢作者的精彩分享!
流泪猫猫头发表于 3小时前
学习了。