GBase 8a
适配迁移
文章

GBase 8a 数据导入导出实战:从 gload 到 gclustergfskep 全流程

发表于2026-05-29 10:04:05100次浏览12个评论

数据迁移是 GBase 8a 落地绕不开的环节。生产环境的数据量少则百万级,多则数十亿,普通的 INSERT 单条写入在性能上完全不可接受。GBase 8a 提供了专门的高速批量加载工具 gload,以及对应的导出工具 gunload,掌握这两个工具的使用是 DBA 的基本功。

本文覆盖:

  • gload 的工作原理与参数调优
  • 常见加载失败的原因与处理
  • gunload 导出的几种场景
  • 增量数据与实时同步的替代方案

一、gload 的工作原理

gload 是 GBase 8a 的高速批量加载工具,底层走的是 分布式并行写入:客户端解析 CSV/文本文件后,按数据节点(DataNode)数量切分,直接发送到对应 DN 的数据目录,跳过 SQL 解析层,绕过 Write-Ahead Log(WAL)的部分开销,从而实现比 INSERT 快 10–100 倍的导入速度。

# 典型 gload 命令行
gload -h cn_host -P 5258 -u gbase -p password \
  -d db_name -t table_name \
  -f /data/backup/orders_20260529.csv \
  -F ','

关键参数说明

参数 说明 推荐值
-f 数据文件路径 支持 CSV/TXT
-F 字段分隔符 默认逗号
-t 目标表名
-d 数据库名
--batch-size 批量提交大小 10000–50000
--parallel 并行度 DN 节点数的倍数
--error-dir 错误数据输出目录 必须指定

二、加载前的准备工作

1. 确认目标表结构

加载前必须确认表已存在,且结构与数据文件匹配:

-- 查看目标表结构
DESC t_orders;

-- 确认分布键
SHOW CREATE TABLE t_orders;

分布键影响加载性能:若数据文件按某列排序,而该列恰好是分布键,导入时同节点数据会集中写到同一 DN,可能触发单节点写入热点。生产环境建议提前测试不同分布键下的加载性能。

2. 清理目标表

首次全量加载时,建议先清空目标表:

TRUNCATE TABLE t_orders;

或用 LOAD DATA INFILE 前的 DELETE 配合 VACUUM,但 TRUNCATE 更快(直接清文件)。

3. 数据文件格式要求

GBase 8a 加载对数据文件有严格要求:

  • 编码:UTF-8 或 GBK,需与数据库字符集一致
  • 分隔符:逗号(,)、制表符(\t)、管道符(|)均可,但避免与数据内容冲突
  • 换行符:Unix 风格(\n),Windows 的 \r\n 需预处理
  • 引号处理:若数据含分隔符,需用双引号包裹
# 预处理:统一换行符、去除 Windows BOM
sed -i 's/\r$//' orders.csv
sed -i '1d' orders.csv  # 若有表头

4. 字段映射

若 CSV 列顺序与表字段不一致,用 --fields-terminated-by + --columns 指定映射:

gload -h cn_host -P 5258 -u gbase -p password \
  -d db_name -t t_orders \
  -f /data/orders.csv \
  --columns "order_id,user_id,amount,create_time" \
  --batch-size 20000

三、gload 参数调优

1. 并行度设置

--parallel 控制导入的并发度,理论上设为 DN 节点数的 2–4 倍效果最佳:

# 假设集群有 6 个 DN,设置 12 并行
gload ... --parallel 12

若并行过高,可能打满 CN 或网络;过低则未充分利用集群资源。

2. 批量大小

--batch-size 决定每次提交的行数,影响内存占用和提交频率:

-- 经验值:行越大(KB 级),batch-size 宜小;行较小(几百字节),可加大
-- 示例:每行约 200 字节,batch-size 20000 约 4MB/批
gload ... --batch-size 20000

3. 错误处理策略

生产加载必须指定错误数据目录:

gload ... --error-dir /data/load_errors

加载结束后检查:

# 查看错误记录
cat /data/load_errors/*.error | head -20

# 常见错误类型
# 1. 列数不匹配:CSV 列数与表字段数不一致
# 2. 数据截断:字段长度超限
# 3. 格式错误:日期/数字格式不对

4. 加载性能监控

加载过程中可在另一个终端监控:

-- 查看当前加载进度(通过系统表)
SELECT * FROM企业管理.load_progress;

-- 监控 DN 写入量
SELECT node_id, SUM(rows_loaded) 
FROM企业管理.load_history 
GROUP BY node_id;

四、常见加载失败与处理

问题 1:字符集不匹配

错误表现Invalid UTF-8 sequence 或加载后中文乱码

处理

# 确认文件编码
file -i orders.csv

# 若为 GBK 编码,需指定
gload ... --charset GBK

# 或转换编码
iconv -f GBK -t UTF-8 orders_gbk.csv > orders_utf8.csv

问题 2:分布键数据倾斜

错误表现:加载成功但查询性能异常,单 DN CPU 持续偏高

处理:检查数据分布:

SELECT node_id, COUNT(*) 
FROM t_orders 
GROUP BY node_id 
ORDER BY COUNT(*) DESC;

若分布不均,查看分布键是否有热点值(如大量 user_id = 0),考虑更换分布键或重新分布:

ALTER TABLE t_orders REDISTRIBUTE BY HASH(user_id);

问题 3:主键/唯一键冲突

错误表现Duplicate key error--error-dir 产生大量错误记录

处理方案

  1. 加载前清空表(首次全量)
  2. 增量加载用 REPLACE
gload ... --mode REPLACE  -- 或用 LOAD MODE 配置
  1. 加载后清理重复
DELETE FROM t_orders a
WHERE EXISTS (
  SELECT 1 FROM t_orders b
  WHERE a.id = b.id AND a.ctid < b.ctid
);

问题 4:数据文件含表头

错误表现:第一条数据变成了 NULL 或类型错误

处理:删除表头或用 --ignore-lines 跳过:

gload ... --ignore-lines 1

五、gunload 导出

与 gload 对应,gunload 用于高速导出:

# 导出全表
gunload -h cn_host -P 5258 -u gbase -p password \
  -d db_name -t t_orders \
  -f /data/export/orders_$(date +%Y%m%d).csv

# 导出带条件
gunload -h cn_host -P 5258 -u gbase -p password \
  -d db_name -t t_orders \
  -f /data/export/orders_2026.csv \
  --query "SELECT * FROM t_orders WHERE create_time >= '2026-01-01'"

gunload 限制

  • 导出文件落在 CN 节点本地,需 scp 或 NFS 共享收集
  • 不支持直接导出到远程 S3/OSS(需额外脚本)

六、大数据量分片导出

单表数十亿行时,全量导出会话时间过长或占用大量 CN 磁盘。建议按时间或 ID 分片导出:

#!/bin/bash
# 分片导出脚本示例
START_ID=0
BATCH=50000000
DATE=$(date +%Y%m%d)

for ((i=0; i<10; i++)); do
  START=$((i * BATCH))
  gunload ... \
    --query "SELECT * FROM t_orders WHERE id >= $START AND id < $((START + BATCH))" \
    -f /data/export/orders_${DATE}_part${i}.csv &
done
wait
echo "导出完成:/data/export/orders_${DATE}_part*.csv"

七、增量数据同步方案

gload/gunload 是批量工具,不适合实时增量同步。生产环境增量数据同步方案:

方案 适用场景 延迟
CDC + Kafka 异构数据库同步 秒级
Binlog 订阅 同构 MySQL 迁入 秒级
定时增量 LOAD 数据量可控、允许分钟级 分钟级
DBLink/FDW 跨库查询,非同步 实时

若业务允许分钟级延迟,建议用 定时增量 LOAD

#!/bin/bash
# 每 5 分钟增量加载一次
while true; do
  MAX_ID=$(mysql -h gbase -u gbase -p -N -e "SELECT MAX(id) FROM t_orders")
  gload ... --query "SELECT * FROM src_db.t_orders WHERE id > $MAX_ID"
  sleep 300
done

八、总结

gload 是 GBase 8a 批量加载的核心工具,掌握以下要点:

  • 加载前:确认表结构、清理目标表、预处理文件格式(编码/换行/分隔符)
  • 参数调优:并行度设为 DN 数 2–4 倍,batch-size 根据行大小调整 1–5 万
  • 错误处理:必须指定 --error-dir,加载后检查错误记录
  • 分布键:加载后检查数据分布,倾斜需 REDISTRIBUTE
  • 大表导出:用 gunload + 分片脚本,避免单会话超时

生产环境首次全量加载建议在业务低峰期执行,并提前测试加载性能作为基线。

评论

登录后才可以发表评论
用户头像
GBase用户28017发表于 3个月前
优秀
GBase用户50900发表于 3个月前
00:16:12 好文章,支持一下!
GBase用户51966发表于 3个月前
00:16:15 好文章,支持一下!
GBase用户51510发表于 3个月前
00:17:28 内容详实,值得收藏。
塔山发表于 3个月前
00:17:29 总结得很到位,学习。
GBase用户51511发表于 3个月前
00:17:31 分析得很透彻,学习了。
佛洛伊得发表于 3个月前
00:17:35 干货满满,感谢楼主分享。
一个老汉发表于 3个月前
00:17:39 写得真不错,赞一个!
GBase用户21143发表于 3个月前
多谢分享
GBase用户21143发表于 3个月前
挺好的
用户头像
阳光总在风雨后发表于 3个月前
gclustergfskep 是什么,文中没有介绍,希望能加上
GBase用户53884发表于 9天前
gload在怎么安装啊?目前系统中没有找到glaod的命令程序啊!