GBase 8s
适配迁移
文章

【转载“GBase 8s数据库”公众号】GBase 8s 数据导入导出:五大工具与实战避坑指南

发表于2026-08-25 13:28:52223次浏览1个评论

在数据库运维中,导入导出是最基础也最频繁的操作之一。它看似简单,实则暗藏格式契约、环境变量、数据边界等多重陷阱。GBase 8s 提供了五种各具特色的导入导出工具,覆盖从单表 SQL 操作到整库二进制克隆的全场景需求。本文将围绕工具特性、格式陷阱与选型逻辑,梳理一套紧凑实用的操作指南。


一、导入导出的本质:不是搬运,是格式契约

导入导出的核心挑战,不在于"把数据搬过去",而在于​让源端与目标端对数据的边界、格式、编码达成一致的契约​。GBase 8s 的工具体系可以从三个维度快速定位:

维度 分类 影响
数据格式 文本格式 / 二进制格式 文本通用可审,二进制高效但受硬件与版本严格约束
数据范围 单表 / 多表 / 整库 范围决定工具层级:SQL 语句、命令行工具或系统级工具
数据用途 自用 / 提供给第三方 第三方交换必须文本化、标准化;内部流转可选用专用格式

二、五大工具:使用方式速查 + 核心能力

工具 运行方式 格式 范围 用途
unload/load SQL 文本 单表 自用/第三方
dbload 命令行 文本 多表 自用
dbexport/dbimport 命令行 文本 整库 自用
onunload/onload 命令行 二进制 库/表 自用
external table SQL 文本 单表 自用/第三方

1. unload / load:SQL 级首选

-- 导出:自定义逗号分隔符,导出t_dept表数据
unload to '../data/t_dept.unl' delimiter ',' select * from t_dept;

-- 导入:分隔符必须与导出时严格一致
load from '../data/t_dept.unl' delimiter ',' insert into t_dept_bak;

​核心能力​:SQL 级轻量导入导出,支持自定义分隔符、GL_DATE 日期格式控制、多表关联查询直接导出。

2. dbload:批量加载的"控制中枢"

通过 .ctl 控制文件编排多表加载流程,支持字段映射、错误阈值、提交频率等精细化控制。

-- .ctl文件定义多表批量加载
file '/data/dept.unl' delimiter ',' 2;
insert into t_dept;

file '/data/employee.unl' delimiter '|' 5;
insert into t_emp(f_id, f_name, f_dept, f_birth) values(f01, f02, f03, f05);
-- dbload导入,跳过第一条数据,逐条提交,容错10行,加载时加排他锁
dbload -d db1 -c aa.ctl -e 10 -n 1 -i 1 -k

​关键参数​:-e(最大容错行数)、-n(每 N 行提交一次)、-i(跳过前 N 行)、-r/-k(加载时是否加排他锁)。

3. dbexport / dbimport:整库逻辑克隆

dbexport mydb -o .          # 导出mydb到当前目录
dbimport mydb -d datadbs1 -i .  # 导入mydb,并存储到datadbs1

​核心能力​:整库逻辑备份与恢复,导出内容包括表结构、索引、约束等。

4. onunload / onload:二进制极速通道

onunload -t /home/gbasedbt/mydb.archive mydb               # 卸载整库(二进制)
onunload -t /home/gbasedbt/t_user.archive mydb:t_user        # 卸载单表
onload -t /home/gbasedbt/mydb.archive -d datadbs1 mydb     # 加载整库
onload -t /home/gbasedbt/t_user.archive -d datadbs1 mydb:t_user    # 加载单表

​核心能力​:直接卸载数据页,速度极快。 ​硬性限制​:对数据库版本、服务器架构、数据库模式均有要求。生产环境使用频率较低。

5. external table:不落地透明查询

create external table t_ext(
    f_id int, f_name varchar(50), f_birth date
)
using(
    datafiles ('disk:/data/employee.unl'),
    format 'delimited',
    delimiter '.'
);

select * from t_ext;  -- 直接查询文件,数据无需入库

​核心能力​:数据始终存于操作系统文件,不占用 dbspace;适合临时探查与轻度集成。


三、四大格式陷阱:数据"脏"在细节里

无论使用哪种工具,以下四类格式问题都是导入导出失败的高频根因。

1. 换行符藏在字段里

默认行分隔符为 \n,当文本字段本身包含换行符(如地址、备注)时,逐行解析的工具会误判行边界。

​GBase 8s 的处理方式​:在换行符前加反斜杠 \ 表示本行未结束。

2. 逗号分隔符的"甜蜜陷阱"

逗号、管道符等常见分隔符在文本数据中极易与真实内容冲突。GBase 8s 的 unload 支持最多 4 个字符的组合分隔符(如 ....、#...、*.*),能大幅降低冲突概率。超过 4 个字符将直接报错。

3. 日期格式的"罗生门"

GBase 8s 通过 GL_DATE 环境变量控制日期输入输出格式。常用格式化符如下:

格式化符 含义
%d 天(01-31)
%m 月(01-12)
%iY 四位年(0000-9999)
%iy 两位年(00-99)
%H 小时(00-24)
%M 分钟(00-59)
%S 秒(00-59)
%a / %A 星期短格式 / 完整格式
%b / %B 月份短格式 / 完整格式

示例:GL_DATE="%d.%m.%iY" 输出 18.06.2021。源端与目标端的 GL_DATE 必须保持一致,否则解析必然出错。

4. 乱码的"最后一刻"

乱码通常源于​编码格式不一致​(如 UTF-8 与 GBK 混用)或​目标字段长度不足导致的数据截断​。导入导出前需统一检查源数据编码、CLIENT_LOCALE 设置及目标表字段宽度。


四、选型决策:3 秒锁定工具

你的场景 选它 为什么
单表导出 unload 文本通用,分隔符/日期格式完全可控
一次加载 10 张表 dbload .ctl 控制文件支持多表编排与字段映射
整库迁移到测试环境 dbexport 逻辑级导出,跨硬件/跨版本兼容
同机型极速恢复 onunload 二进制物理搬运,速度最快
只想看看文件里有什么 external table CREATE 后直接 SELECT,零成本不入库

五、三条铁律:让导入导出稳如磐石

  1. 先验证再批量 用小样本跑通全流程,确认分隔符、日期格式、编码无异常后再执行全量操作。
  2. 分隔符宁复杂不冲突 优先使用 2~4 个字符的组合分隔符,从源头规避内容与格式的冲突。
  3. 环境变量显式声明 GL_DATE、CLIENT_LOCALE 等变量必须在脚本中显式设置并记录,杜绝"环境依赖型"故障。

写在最后

导入导出从来不是简单的文件搬运,而是一场对格式边界、工具特性与环境一致性的系统性把控。理解五大工具的定位差异,避开四类格式陷阱,才能让数据在系统之间安全、准确地流动。

评论

登录后才可以发表评论
A_bear发表于 1个月前
简单的文件搬运