GBASE南大通用GBase 8s数据库- 数据迁移(1)

GBASE南大通用技术分享:GBase 8s 数据迁移问题

· 行分隔符

· 列分隔符

· 日期时间格式

· 汉字乱码

  • 数据包含分隔符

默认的行分隔符为\n(Linux)或\r\n(Windows)。对于从Windows系统生成的数据需要在Linux系统导入数据时,可以使用dos2unix工具删除\r。
对于需要导入数据的系统,如果导入程序只支持逐行解析数据并导入,则需要在生成数据时,对数据中的换行符进行转义或删除。对字符进行转义会使数据产生膨胀,在导入数据时,可根据实际情况对目标字段进行加长处理。
对于一些数据库系统,通过定义一些规则来解决数据中包含换行符问题,如GBase 8s使用在换行符前增加一个\表示这行数据未完成,下一行仍然是本行数据的延续,来解决数据中包含换行符的问题。基于特定规则的换行符处理方式,只能在本系统内使用,无法提供数据给第三方系统。
部分厂商采用自定义换行符方法,解决数据中包含\n问题。用户可以指定不可见的二进制字符作为数据的换行符。
 

  • 数据包含分隔列

用户常指定一个字符,做为列数据的分隔符,如逗号或管道符。对于数据中全部为数值字段的数据,这种方式非常有效和高效。
对于迁移的数据包含文本数据时,数据中可能包含任意的单个可见字符,指定单个字符作为列分隔符时,容易出现部分数据无法导入现象。通常迁移工具需要支持转义,将数据中的列分隔符进行转义,以区别数据中的列分隔符和实际的列分隔符。
一些工具支持不可见字符或多个字符一起作为列分隔符。这种方案通常不需要对数据中的字符进行转义处理,适用于不同数据库系统间的数据迁移。
 

  • 数据中的日期时间格式不匹配

  • 汉字乱码

不同的汉字编码格式,是产生乱码的主要原因。

数据截断可能导致部分数据产生乱码。

数据迁移方法

数据迁移工具

  1. unload/load

  2. dbload

  3. dbexport/dbimport

  4. onunload/onload

  5. external table

数据迁移工具对比

1、unload/load

unload语法

unload to 'file_name' [delimiter 'delimiter_string'] 
select <* | columns> from <table_name | synonym_name | view_name>;

file_name:保存数据的文件名,可以为全路径或者相对路径;
delimiter:定义数据列分隔符,为一个或多个字符,默认为'|';
columns:查询的字段列表;

导出单表数据,列分隔符使用【,】。

unload to '../data/unload_01.unl' delimiter ','
select * from t_dept;

导出多表关联数据,列分隔符使用【|】。

unload to '../data/unload_02.unl' 
select a.f_employeeid, a.f_employeename, a.f_deptid, b.f_deptname, a.f_birthdate
from t_employee a, t_dept b
where a.f_deptid = b.f_deptid;

导出单表数据,日期类型数据使用类似18.06.2021的格式,列分隔符使用英文的句号【.】。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

unload to '../data/unload_03.unl' delimiter '.'
select * from t_employee;

导出单表数据,日期类型数据使用类似18.06.2021的格式,列分隔符使用【…】。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

unload to '../data/unload_04.unl' delimiter '....'
select * from t_employee;

导出单表数据,日期类型数据使用类似18.06.2021的格式,列分隔符使用【#…】。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

unload to '../data/unload_05.unl' delimiter '#...'
select * from t_employee;

导出单表数据,日期类型数据使用类似18.06.2021的格式,列分隔符使用【…#】。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

unload to '../data/unload_06.unl' delimiter '...#'
select * from t_employee;

导出单表数据,日期类型数据使用类似 Wed Dec 25 1985 的格式,列分隔符使用【.*.】。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%a %b %e %iY"

unload to '../data/unload_07.unl' delimiter '.*.'
select * from t_employee;

导出单表数据,日期类型数据使用类似 星期三 十二月 25 1985 的格式,列分隔符使用【…】。

-- export CLIENT_LOCALE=zh_CN.UTF8
-- export GL_DATE="%A %B %e %iY"

unload to '../data/unload_08.unl' delimiter '...'
select * from t_employee;

GBase 8s最多支持4个字符做为列分隔符,超过4个时分报错。

unload to '../data/unload_09.unl' delimiter '#...#'
select * from t_employee;

load语法

load from 'file_name' [delimiter 'delimiter_string']
insert into table_name | synonym_name| view_name [(columns)];

file_name:导入的数据文件,可以为全路径或者相对路径文件名;
delimiter:定义数据列分隔符,为一个或多个字符,默认为'|';
columns:导入表的字段列表,默认为数据库表的字段的顺序;

加载单表数据,列分隔符为【,】。

load from '../data/unload_01.unl' delimiter ','
insert into t_dept_01;

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_dept_01;

尝试加载通过多表关联导出的数据。

对于数据文件和表定义不同的文件,通常无法使用load方式导出。需要采用其它技术,实现数据入库。

-- export CLIENT_LOCALE=zh_CN.UTF8
-- export GL_DATE="%iY %m月 %d日"

load from '../data/unload_02.unl' delimiter '|' 
insert into t_employee_02(f_employeeid, f_deptid, f_birthdate) values(f01, f02, f03, f05);

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_employee_02;

加载单表数据,观察列分隔符与数据中字符冲突时的转义处理。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

load from '../data/unload_03.unl' delimiter '.'
insert into t_employee_03;

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_employee_03;

加载单表数据,观察列分隔符与数据中字符冲突时的转义处理。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

load from '../data/unload_04.unl' delimiter '....'
insert into t_employee_04;

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_employee_04;

加载单表数据,观察列分隔符与数据中字符冲突时的转义处理

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

load from '../data/unload_05.unl' delimiter '#...'
insert into t_employee_05;

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_employee_05;

加载单表数据,观察列分隔符与数据中字符冲突时的转义处理。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%d.%m.%iY"

load from '../data/unload_06.unl' delimiter '...#'
insert into t_employee_06;

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_employee_06;

加载单表数据,熟悉日期字段数据的格式控制。

-- export CLIENT_LOCALE=en_US.UTF8
-- export GL_DATE="%a %b %e %iY"

load from '../data/unload_07.unl' delimiter '.*.'
insert into t_employee_07;

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_employee_07;

加载单表数据,熟悉日期字段数据的格式控制。

-- export CLIENT_LOCALE=zh_CN.UTF8
-- export GL_DATE="%A %B %e %iY"

load from '../data/unload_08.unl' delimiter '...'
insert into t_employee_08;

!echo "******************************************"
!echo "# Query the table to validate load result."
!echo "******************************************"
select * from t_employee_08;

2、dbload

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值