自制数据库迁移工具-C版-07-HappySunshineV1.6-(支持PG、达梦、Gbase8a)

目录

一、环境信息

二、简述

三、架构图

1、在线迁移

2、离线抽取

四、升级点

五、支持点

1、支持功能

2、离线抽取支持类型

(1)数字类型

(2)货币类型

(3)字符类型

(4)特殊字符类型

(5)二进制数据类型

(6)日期/时间类型

(7)布尔数据类型

(8)枚举类型

(9)几何类型

(10)网络地址类型

(11)位串类型

(12)文本搜索类型

(13)UUID类型

(14)XML类型

(15)JSON类型

(16)数组类型

(17)组合类型

(18)范围类型

[(19) 域类型](#(19) 域类型)

[(20) 对象标识符类型](#(20) 对象标识符类型)

[(21) pg_lsn 类型](#(21) pg_lsn 类型)

六、后续计划支持功能

七、安装包下载地址

八、参数介绍

1、离线抽取

2、在线迁移

九、安装步骤

1、用户创建

2、安装包解压

3、环境变量配置

4、环境变量生效

5、动态库链接检验

(1)HsManager

(2)G8aExecutor

(3)Pg2G8aExecutor

(4)Pg2DmExecutor

(5)HsPgUnload

6、操作系统限制修改

(1)/etc/security/limits.conf

(2)验证

7、在线迁移配置文件MigrationConfig.txt

[(1)Gbase8a -> Gbase8a](#(1)Gbase8a -> Gbase8a)

[(2)PG -> Gbase8a](#(2)PG -> Gbase8a)

[(3)PG -> Dm](#(3)PG -> Dm)

十、在线迁移性能对比测试

1、性能测试对比表格

2、测试表结构

(1)Gbase8a

(2)DM

(3)PG

3、测试数据样式

4、HappySunshine测试截图

[(1)PostgreSql -> Dm](#(1)PostgreSql -> Dm)

[(2)PostgreSql -> Gbase8a](#(2)PostgreSql -> Gbase8a)

[(3)Gbase8a-> Gbase8a](#(3)Gbase8a-> Gbase8a)

5、Kettle测试截图

[(1)PG -> Dm](#(1)PG -> Dm)

[(2)PG -> Gbase8a](#(2)PG -> Gbase8a)

[(3)Gbase8a-> Gbase8a](#(3)Gbase8a-> Gbase8a)

十一、离线抽取功能介绍

1、单库级抽取示例

2、模式级抽取示例

3、表级抽取示例

4、数据加载示例

十二、许可证

十三、需求&Bug


最新版本工具文档链接:HappySunshine

一、环境信息

|-----------------|------------------------------------------------------------------------------------------------------------------------------|
| 名称 | 值 |
| CPU | Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz |
| 操作系统 | CentOS Linux release 7.9.2009 (Core) |
| 内存 | 5G |
| 逻辑核数 | 6 |
| HappySunshine版本 | V1.6 |
| Kettle版本 | pdi-ce-9.5.0.1-261 |
| Gbase8a版本 | 8.6.2-R43.34.27468a27 |
| Pg版本 | PostgreSQL 14.5 |
| DM版本 | 1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Version: 12 5 Gsu level(5) cnt: 0 |

二、简述

HappySunshine数据库迁移工具是由C语言编写的多进程多线程程序,支持多种数据库之间的高效数据同步、数据离线抽取等,安装简便、简单配置即可使用,功能还在逐步完善中(其实是还在陆续补充新知识),有什么好的建议,大家可以在评论或私信告知。

三、架构图

1、在线迁移

画图水平感觉还不错,给自己点个赞。

HappySunshine数据库迁移工具由一个管理者进程和N个执行者进程组成,每个执行进程由一个生产者线程和N个消费者线程组成。

1、管理者进程启动。

2、管理者进程读取配置文件参数。

3、管理者进程创建共享内存。

4、管理者进程拉起N个执行者进程。

5、管理者进程通过共享存储中的任务队列,将需要迁移的表放入队列中。

6、执行者进程创建线程池。

7、执行者进程开辟一个生产者线程,N个消费者线程。

8、生产者线程从共享存储中的任务队列拿取任务,查询需要迁移表的条数,来决定迁移方式:LOAD或INSERT。如果进程数大于1,任务中包含的表有一个整型主键,会自动拆分数据为N份(进程数)。

9、如果是LOAD,由生产者线程单独完成。

10、如果是INSERT,将读取的数据行指针打包,发给线程池中的任务队列。

11、消费者线程从线程池中的任务队列拿取任务。

12、消费者线程将任务包解开,将数据清洗,并放入自己的缓冲区中,清洗完再把INSERT命令发给Gbase8a。

13、消费者线程执行任务失败,将任务状态置为错误,待生产者线程发现任务失败后,终止任务下发给线程池队列,重新到共享存储中的任务队列拿取任务。

14、消费者线程执行任务成功,就继续执行。

15、管理者进程将任务发送完成之后,将任务结束标记放入共享存储中的任务队列中。

16、生产者线程从共享存储中的任务队列中拿到任务结束标记后。等待屏障,也就是等待消费者线程完成所拿到的任务。

17、执行者进程等待所有的消费者、生产者结束后,回收线程池资源,释放自身所占用资源,结束退出。

18、管理者进程等待所有执行者进程结束后,回收进程资源,释放自身所占用资源,结束退出。

2、离线抽取

PG数据离线抽取功能是一个单进程单线程的程序,解析流程如上。

四、升级点

|----|------------------|-----------------------------------------------------------------------|
| 序号 | 名称 | 备注 |
| 1 | 日志模块优化 | 加入线程特定数据技术,避免了写日志时,频繁的申请和释放内存,减少了用户空间中的页面错误(page-faults:u),提升了工具整体性能。 |
| 2 | 十六进制转字符优化 | 在线迁移,十六进制数据在没有以0x开头时,会转换出错。 加入了十六进制数据检查合规性的逻辑。 |
| 3 | PG数据离线抽取表级 | PG14.5版本,表级,PG数据库闭库情况下,抽取底层数据文件数据落地为COPY文本。 |
| 4 | PG数据离线抽取模式级 | PG14.5版本,模式级,PG数据库闭库情况下,抽取底层数据文件数据落地为COPY文本。 |
| 5 | PG数据离线抽取单库级 | PG14.5版本,单库级,PG数据库闭库情况下,抽取底层数据文件数据落地为COPY文本。 |
| 6 | PG 47种数据类型支持离线抽取 | |
| 7 | 添加License | |

五、支持点

1、支持功能

|----|------|------------------|----------------------------------------------|
| 序号 | 模块 | 功能 | 备注 |
| 1 | 在线迁移 | Gbase8a到8a数据迁移 | INSERT、LOAD方式迁移,表定义及其他暂不支持。 |
| 2 | 在线迁移 | PG到Gbase8a数据迁移 | INSERT方式迁移,表定义及其他暂不支持。 |
| 3 | 在线迁移 | PG到DM数据迁移 | INSERT方式迁移,表定义及其他暂不支持。 |
| 4 | 在线迁移 | 多线程并发加载单表数据 | |
| 5 | 在线迁移 | 多进程并发加载单表数据 | 源端库为PG,迁移表包含单一整型主键,进程数设置大于1时,支持此项。 |
| 6 | 离线抽取 | PG数据离线抽取表级 | PG14.5版本,表级,PG数据库闭库情况下,抽取底层数据文件数据落地为COPY文本。 |
| 7 | 离线抽取 | PG数据离线抽取模式级 | PG14.5版本,模式级,PG数据库闭库情况下,抽取底层数据文件数据落地为COPY文本。 |
| 8 | 离线抽取 | PG数据离线抽取单库级 | PG14.5版本,单库级,PG数据库闭库情况下,抽取底层数据文件数据落地为COPY文本。 |
| 9 | 离线抽取 | PG 47种数据类型支持离线抽取 | 具体类型见下文的支持列表。 |

2、离线抽取支持类型

(1)数字类型

名字 是否支持
smallint
integer
bigint
decimal
numeric
real
double precision
smallserial
serial
bigserial

(2)货币类型

名字 是否支持
money

(3)字符类型

名字 是否支持
character varying(n), varchar(n)
character(n), char(n)
text

(4)特殊字符类型

名字 是否支持
"char"
name

(5)二进制数据类型

名字 是否支持
bytea

(6)日期/时间类型

名字 是否支持
timestamp [ (p) ] [ without time zone ]
timestamp [ (p) ] with time zone
date
time [ (p) ] [ without time zone ]
time [ (p) ] with time zone
interval [ fields ] [ (p) ]

(7)布尔数据类型

名字 是否支持
boolean

**(8)**枚举类型

名字 是否支持
enum

(9)几何类型

名字 是否支持
point
line
lseg
box
path(封闭路径
path(开放路径
polygon
circle

(10)网络地址类型

名字 是否支持
cidr
inet
macaddr
macaddr8

**(11)**位串类型

名字 是否支持
bit
bit varying

(12)文本搜索类型

| 名字 | 是否支持 |
| tsvector | |

tsquery

(13)UUID类型

| 名字 | 是否支持 |

UUID

(14)XML类型

| 名字 | 是否支持 |

XML

(15)JSON类型

| 名字 | 是否支持 |
| JSON | √ |
| JSONB | √ |

JSONPATH

(16)数组类型

内部实现支持N维,只验证了以下基础类型,其他基础类型也是支持的,只是未测试。

| 名字 | 是否支持 |
| INT[] | √ |

VARCHAR[]

(17)组合类型

| 名字 | 是否支持 |

(18)范围类型

| 名字 | 是否支持 |

(19) 域类型

| 名字 | 是否支持 |

(20) 对象标识符类型

| 名字 | 是否支持 |
| OID | √ |

XID

(21) pg_lsn 类型

| 名字 | 是否支持 |

pg_lsn

六、后续计划支持功能

展望是挺多的,奈何时间不多呀。

|----|--------------|----|
| 序号 | 功能 | 备注 |
| 1 | 支持PG单表并行离线抽取 | |
| 2 | 支持Oracle数据迁移 | |
| 3 | 支持达梦快速装载 | |
| 4 | 支持信号处理 | |
| 5 | 支持DM 切分数据 | |
| 6 | 支持PG 切分数据 | |
| 7 | 支持目的端为PG | |

七、安装包下载地址

GITHUB-HappySunshine-release版下载地址

八、参数介绍

1、离线抽取

|----|---------|------------------------------|
| 序号 | 参数介绍 | 举例 |
| 1 | PG数据库目录 | /opt/Pg14-5/Data/base/13892/ |
| 2 | 数据落地目录 | /home/czg/TestPgData/ |
| 3 | PG数据块大小 | 8192 |
| 4 | 模式名 | 指定模式名,'*'代表所有模式。 |
| 5 | 表名 | 指定表名,'*'代表所有表。 |

2、在线迁移

|----|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 参数 | 备注 |
| 1 | [Tool] | Tool标签头,下面只能写Tool相关参数。 |
| 2 | ProcessNums | 程序迁移时开的进程数。 |
| 3 | Level | 迁移级别。 1:表级迁移,SpecifiedTab生效。 2:库级迁移,MigrationDb、BlackList生效。 |
| 4 | OsInfo | Gbase8a -> Gbase8a LOAD使用。 工具所在操作系统IP;操作系统用户;操作系统用户密码; 长度同下方的数据库IP;数据库用户名;数据库用户密码; |
| 5 | OneBatchNums | MigrationType为0、1、2的情况下,支持此参数,一个批次插入的数据条数。(INSERT方式) |
| 6 | SwitchNums | MigrationType为0的情况下,支持此参数,此数以上使用LOAD,以下使用INSERT。 |
| 7 | MigrationType | 迁移类型,支持0、1、2。 0 : Gbase8a -> Gbase8a 1 : PostgreSql -> Gbase8a 2 : PostgreSql -> Dm |
| 8 | [Source] | Source标签头,下面只能写Source相关参数。 |
| 9 | ConnInfo | 样例:'IP;数据库用户名;数据库用户密码;数据库名;数据库端口号;数据连接字符集;' 1、单个IP长度限制19,数据库IP地址。 2、单个用户名长度限制19,数据库用户名。 3、单个用户名密码长度限制29,数据库密码。 4、单个数据库名长度限制29,数据库名。 5、数据库端口。 6、长度限制9,数据库连接字符集,支持utf8和gbk,如果是达梦连接,需填写数字,对照表如下: (1)UTF8 1 (2)GBK 2 (3)BIG5 3 (4)ISO_8859_9 4 (5)EUC_JP 5 (6)EUC_KR 6 (7)KOI8R 7 (8)ISO_8859_1 8 (9)SQL_ASCII 9 (10)GB18030 10 (11)ISO_8859_11 11 |
| 10 | MigrationDb | 库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。 MigrationType为1的情况下,此为PG的模式名。 |
| 11 | BlackList | 库级迁移参数,支持128个表,黑名单,表名,长度限制参考Db。和MigrationDb一起使用可以。 |
| 12 | SpecifiedTab | (1)MigrationType为0的情况下,表级迁移参数,格式:'源端查询字段;源端库名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;' (2)MigrationType为1的情况下,表级迁移参数,格式:'源端查询字段;源端模式名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;' (3)如果没有特定条件,可以不写,但必须有分隔符,举例如下: ';czg;testtab;;;zxj;NewTab;' 这样相当于testtab迁移到NewTab,没有任何特殊条件。 这个可以有多个标签,想迁移多少张表就写几个标签。 |
| 13 | [Target] | Target标签头,下面只能写Target相关参数。 |
| 14 | ConnInfo | 参考Source的。 |
| 15 | MigrationDb | 参考Source的。 |

九、安装步骤

大家也可以参考Readme.txt内容。

1、用户创建

大家也可以不创建,这是为了不影响其他用户,还有安全性考虑。

bash 复制代码
[root@czg0 ~]# groupadd lzl -g 2024
[root@czg0 ~]# useradd  lzl -g 2024 -u 2024
[root@czg0 ~]# passwd   lzl

2、安装包解压

bash 复制代码
[lzl@czg0 ~]$ unzip HappySunshine_V1.5_X86_Centos7.9_Release_日期.zip

3、环境变量配置

bash 复制代码
[root@czg0 ~]# cat /home/lzl/.bashrc 
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

export HAPPY_SUNSHINE_HOME=/home/lzl/HappySunshine
export LD_LIBRARY_PATH=$HAPPY_SUNSHINE_HOME/Libs:$LD_LIBRARY_PATH

4、环境变量生效

bash 复制代码
[lzl@czg0 ~]$ source /home/lzl/.bashrc 

5、动态库链接检验

(1)HsManager

bash 复制代码
[lzl@czg0 ~]$ ldd HappySunshine/Exec/HsManager 
        linux-vdso.so.1 =>  (0x00007ffc3a9fa000)
        libPublic.so => /home/lzl/HappySunshine/Libs/libPublic.so (0x00007f094f383000)
        libLog.so => /home/lzl/HappySunshine/Libs/libLog.so (0x00007f094f17e000)
        libSqQueue.so => /home/lzl/HappySunshine/Libs/libSqQueue.so (0x00007f094ef78000)
        libPthread.so => /home/lzl/HappySunshine/Libs/libPthread.so (0x00007f094ed6b000)
        libFileOperate.so => /home/lzl/HappySunshine/Libs/libFileOperate.so (0x00007f094eb65000)
        libDataConvertion.so => /home/lzl/HappySunshine/Libs/libDataConvertion.so (0x00007f094e960000)
        libProcess.so => /home/lzl/HappySunshine/Libs/libProcess.so (0x00007f094e757000)
        libGbase8aDb.so => /home/lzl/HappySunshine/Libs/libGbase8aDb.so (0x00007f094e550000)
        libgbase.so.16 => /home/lzl/HappySunshine/Libs/libgbase.so.16 (0x00007f094e090000)
        libHashTable.so => /home/lzl/HappySunshine/Libs/libHashTable.so (0x00007f094de8c000)
        libPgDb.so => /home/lzl/HappySunshine/Libs/libPgDb.so (0x00007f094dc83000)
        libpq.so.5 => /home/lzl/HappySunshine/Libs/libpq.so.5 (0x00007f094da2d000)
        libHsPublic.so => /home/lzl/HappySunshine/Libs/libHsPublic.so (0x00007f094d82a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f094d45c000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f094d240000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f094d03c000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f094cd3a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f094f586000)

(2)G8aExecutor

bash 复制代码
[lzl@czg0 ~]$ ldd HappySunshine/Exec/G8aExecutor 
        linux-vdso.so.1 =>  (0x00007ffecf9fd000)
        libPublic.so => /home/lzl/HappySunshine/Libs/libPublic.so (0x00007faca38b8000)
        libLog.so => /home/lzl/HappySunshine/Libs/libLog.so (0x00007faca36b3000)
        libSqQueue.so => /home/lzl/HappySunshine/Libs/libSqQueue.so (0x00007faca34ad000)
        libPthread.so => /home/lzl/HappySunshine/Libs/libPthread.so (0x00007faca32a0000)
        libFileOperate.so => /home/lzl/HappySunshine/Libs/libFileOperate.so (0x00007faca309a000)
        libDataConvertion.so => /home/lzl/HappySunshine/Libs/libDataConvertion.so (0x00007faca2e95000)
        libProcess.so => /home/lzl/HappySunshine/Libs/libProcess.so (0x00007faca2c8c000)
        libGbase8aDb.so => /home/lzl/HappySunshine/Libs/libGbase8aDb.so (0x00007faca2a85000)
        libgbase.so.16 => /home/lzl/HappySunshine/Libs/libgbase.so.16 (0x00007faca25c5000)
        libMyPool.so => /home/lzl/HappySunshine/Libs/libMyPool.so (0x00007faca23c2000)
        libHashTable.so => /home/lzl/HappySunshine/Libs/libHashTable.so (0x00007faca21be000)
        libHsPublic.so => /home/lzl/HappySunshine/Libs/libHsPublic.so (0x00007faca1fbb000)
        libc.so.6 => /lib64/libc.so.6 (0x00007faca1bed000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007faca19d1000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007faca17cd000)
        libm.so.6 => /lib64/libm.so.6 (0x00007faca14cb000)
        /lib64/ld-linux-x86-64.so.2 (0x00007faca3abb000)

(3)Pg2G8aExecutor

bash 复制代码
[lzl@czg0 ~]$ ldd HappySunshine/Exec/Pg2G8aExecutor 
        linux-vdso.so.1 =>  (0x00007ffdea9d0000)
        libPublic.so => /home/lzl/HappySunshine/Libs/libPublic.so (0x00007f2c7a38f000)
        libLog.so => /home/lzl/HappySunshine/Libs/libLog.so (0x00007f2c7a18a000)
        libSqQueue.so => /home/lzl/HappySunshine/Libs/libSqQueue.so (0x00007f2c79f84000)
        libPthread.so => /home/lzl/HappySunshine/Libs/libPthread.so (0x00007f2c79d77000)
        libFileOperate.so => /home/lzl/HappySunshine/Libs/libFileOperate.so (0x00007f2c79b71000)
        libDataConvertion.so => /home/lzl/HappySunshine/Libs/libDataConvertion.so (0x00007f2c7996c000)
        libProcess.so => /home/lzl/HappySunshine/Libs/libProcess.so (0x00007f2c79763000)
        libGbase8aDb.so => /home/lzl/HappySunshine/Libs/libGbase8aDb.so (0x00007f2c7955c000)
        libgbase.so.16 => /home/lzl/HappySunshine/Libs/libgbase.so.16 (0x00007f2c7909c000)
        libMyPool.so => /home/lzl/HappySunshine/Libs/libMyPool.so (0x00007f2c78e99000)
        libPgDb.so => /home/lzl/HappySunshine/Libs/libPgDb.so (0x00007f2c78c90000)
        libpq.so.5 => /home/lzl/HappySunshine/Libs/libpq.so.5 (0x00007f2c78a3a000)
        libHashTable.so => /home/lzl/HappySunshine/Libs/libHashTable.so (0x00007f2c78836000)
        libHsPublic.so => /home/lzl/HappySunshine/Libs/libHsPublic.so (0x00007f2c78633000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f2c78265000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2c78049000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f2c77e45000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f2c77b43000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2c7a592000)

(4)Pg2DmExecutor

bash 复制代码
[lzl@czg0 ~]$ ldd HappySunshine/Exec/Pg2DmExecutor 
        linux-vdso.so.1 =>  (0x00007ffd4eb65000)
        libPublic.so => /home/lzl/HappySunshine/Libs/libPublic.so (0x00007f81c49f0000)
        libLog.so => /home/lzl/HappySunshine/Libs/libLog.so (0x00007f81c47eb000)
        libSqQueue.so => /home/lzl/HappySunshine/Libs/libSqQueue.so (0x00007f81c45e5000)
        libPthread.so => /home/lzl/HappySunshine/Libs/libPthread.so (0x00007f81c43d8000)
        libFileOperate.so => /home/lzl/HappySunshine/Libs/libFileOperate.so (0x00007f81c41d2000)
        libDataConvertion.so => /home/lzl/HappySunshine/Libs/libDataConvertion.so (0x00007f81c3fcd000)
        libProcess.so => /home/lzl/HappySunshine/Libs/libProcess.so (0x00007f81c3dc4000)
        libMyPool.so => /home/lzl/HappySunshine/Libs/libMyPool.so (0x00007f81c3bc1000)
        libLinkList.so => /home/lzl/HappySunshine/Libs/libLinkList.so (0x00007f81c39bd000)
        libPgDb.so => /home/lzl/HappySunshine/Libs/libPgDb.so (0x00007f81c37b4000)
        libpq.so.5 => /home/lzl/HappySunshine/Libs/libpq.so.5 (0x00007f81c355e000)
        libDmDb.so => /home/lzl/HappySunshine/Libs/libDmDb.so (0x00007f81c333f000)
        libdmdpi.so => /home/lzl/HappySunshine/Libs/libdmdpi.so (0x00007f81c2485000)
        libdmcpt.so => /home/lzl/HappySunshine/Libs/libdmcpt.so (0x00007f81c2252000)
        libdmlogmnr_client.so => /home/lzl/HappySunshine/Libs/libdmlogmnr_client.so (0x00007f81c0595000)
        libHashTable.so => /home/lzl/HappySunshine/Libs/libHashTable.so (0x00007f81c0391000)
        libHsPublic.so => /home/lzl/HappySunshine/Libs/libHsPublic.so (0x00007f81c018e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f81bfdc0000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f81bfabe000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f81bf8a2000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f81bf69a000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f81bf496000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f81bf18e000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f81bef78000)
        libdmcfg.so => /home/lzl/HappySunshine/Libs/libdmcfg.so (0x00007f81beb1a000)
        libdmclientlex.so => /home/lzl/HappySunshine/Libs/libdmclientlex.so (0x00007f81be8e5000)
        libdmcomm.so => /home/lzl/HappySunshine/Libs/libdmcomm.so (0x00007f81be6b2000)
        libdmcvt.so => /home/lzl/HappySunshine/Libs/libdmcvt.so (0x00007f81bdf34000)
        libdmcpr.so => /home/lzl/HappySunshine/Libs/libdmcpr.so (0x00007f81bdd30000)
        libdmelog.so => /home/lzl/HappySunshine/Libs/libdmelog.so (0x00007f81bdac1000)
        libdmmsg.so => /home/lzl/HappySunshine/Libs/libdmmsg.so (0x00007f81bd8b1000)
        libdmcalc.so => /home/lzl/HappySunshine/Libs/libdmcalc.so (0x00007f81bd618000)
        libdmcyt.so => /home/lzl/HappySunshine/Libs/libdmcyt.so (0x00007f81bd3f3000)
        libdmos.so => /home/lzl/HappySunshine/Libs/libdmos.so (0x00007f81bd1be000)
        libdmutl.so => /home/lzl/HappySunshine/Libs/libdmutl.so (0x00007f81bcfa3000)
        libdmmem.so => /home/lzl/HappySunshine/Libs/libdmmem.so (0x00007f81bcd90000)
        libdmbtr.so => /home/lzl/HappySunshine/Libs/libdmbtr.so (0x00007f81bcb5c000)
        libdmtrx.so => /home/lzl/HappySunshine/Libs/libdmtrx.so (0x00007f81bc7b5000)
        libdmstrt.so => /home/lzl/HappySunshine/Libs/libdmstrt.so (0x00007f81bc5a6000)
        libdmknl.so => /home/lzl/HappySunshine/Libs/libdmknl.so (0x00007f81bc343000)
        libdmstg.so => /home/lzl/HappySunshine/Libs/libdmstg.so (0x00007f81bc0f4000)
        libdmblb.so => /home/lzl/HappySunshine/Libs/libdmblb.so (0x00007f81bbeb8000)
        libdmnsort.so => /home/lzl/HappySunshine/Libs/libdmnsort.so (0x00007f81bbb9b000)
        libdmllog.so => /home/lzl/HappySunshine/Libs/libdmllog.so (0x00007f81bb974000)
        libdmrs.so => /home/lzl/HappySunshine/Libs/libdmrs.so (0x00007f81bb76f000)
        libdmsys.so => /home/lzl/HappySunshine/Libs/libdmsys.so (0x00007f81bb568000)
        libdmrarch.so => /home/lzl/HappySunshine/Libs/libdmrarch.so (0x00007f81bb313000)
        libdmtrv.so => /home/lzl/HappySunshine/Libs/libdmtrv.so (0x00007f81bb0d9000)
        libdmtimer.so => /home/lzl/HappySunshine/Libs/libdmtimer.so (0x00007f81baed3000)
        libdmmout.so => /home/lzl/HappySunshine/Libs/libdmmout.so (0x00007f81babfe000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f81c4bf3000)
        libdmdcrm.so => /home/lzl/HappySunshine/Libs/libdmdcrm.so (0x00007f81ba9f1000)
        libdmshm.so => /home/lzl/HappySunshine/Libs/libdmshm.so (0x00007f81ba7ec000)
        libdmshmm.so => /home/lzl/HappySunshine/Libs/libdmshmm.so (0x00007f81ba5e6000)
        libdmckpt.so => /home/lzl/HappySunshine/Libs/libdmckpt.so (0x00007f81ba3ca000)
        libdmfil.so => /home/lzl/HappySunshine/Libs/libdmfil.so (0x00007f81ba1a5000)
        libdmdta.so => /home/lzl/HappySunshine/Libs/libdmdta.so (0x00007f81b9eb8000)
        libdmrlog.so => /home/lzl/HappySunshine/Libs/libdmrlog.so (0x00007f81b9bf8000)
        libdmmal.so => /home/lzl/HappySunshine/Libs/libdmmal.so (0x00007f81b99b8000)
        libdmuthr.so => /home/lzl/HappySunshine/Libs/libdmuthr.so (0x00007f81b97a5000)
        libdmtlog.so => /home/lzl/HappySunshine/Libs/libdmtlog.so (0x00007f81b959b000)
        libdmdct.so => /home/lzl/HappySunshine/Libs/libdmdct.so (0x00007f81b8edb000)
        libdmregex.so => /home/lzl/HappySunshine/Libs/libdmregex.so (0x00007f81b8cd4000)
        libdmtbl.so => /home/lzl/HappySunshine/Libs/libdmtbl.so (0x00007f81b8ace000)
        libdmhfs.so => /home/lzl/HappySunshine/Libs/libdmhfs.so (0x00007f81b8835000)
        libdmlic.so => /home/lzl/HappySunshine/Libs/libdmlic.so (0x00007f81b8629000)
        libdmlnk.so => /home/lzl/HappySunshine/Libs/libdmlnk.so (0x00007f81b83f8000)
        libdmredo.so => /home/lzl/HappySunshine/Libs/libdmredo.so (0x00007f81b8143000)
        libdmrtree.so => /home/lzl/HappySunshine/Libs/libdmrtree.so (0x00007f81b7f31000)
        libdmenet.so => /home/lzl/HappySunshine/Libs/libdmenet.so (0x00007f81b7d0b000)
        libdmxmal.so => /home/lzl/HappySunshine/Libs/libdmxmal.so (0x00007f81b7af1000)
        libdmsbtree.so => /home/lzl/HappySunshine/Libs/libdmsbtree.so (0x00007f81b78ed000)
        libdmbcast.so => /home/lzl/HappySunshine/Libs/libdmbcast.so (0x00007f81b766f000)
        libdmscp.so => /home/lzl/HappySunshine/Libs/libdmscp.so (0x00007f81b7457000)
        libdmjson.so => /home/lzl/HappySunshine/Libs/libdmjson.so (0x00007f81b722e000)
        libdmspatial.so => /home/lzl/HappySunshine/Libs/libdmspatial.so (0x00007f81b6f55000)
        libdmvtdskm.so => /home/lzl/HappySunshine/Libs/libdmvtdskm.so (0x00007f81b6d44000)
        libdmdcr.so => /home/lzl/HappySunshine/Libs/libdmdcr.so (0x00007f81b6b3c000)
        libdmasmapi.so => /home/lzl/HappySunshine/Libs/libdmasmapi.so (0x00007f81b6915000)
        libdmasmapim.so => /home/lzl/HappySunshine/Libs/libdmasmapim.so (0x00007f81b66c0000)
        libdmdfi.so => /home/lzl/HappySunshine/Libs/libdmdfi.so (0x00007f81b64aa000)
        libdmvtdsk.so => /home/lzl/HappySunshine/Libs/libdmvtdsk.so (0x00007f81b62a3000)
        libdmasm.so => /home/lzl/HappySunshine/Libs/libdmasm.so (0x00007f81b6074000)
        libdmasmm.so => /home/lzl/HappySunshine/Libs/libdmasmm.so (0x00007f81b5db8000)
        libdmdfs.so => /home/lzl/HappySunshine/Libs/libdmdfs.so (0x00007f81b5b92000)

(5)HsPgUnload

bash 复制代码
[root@dw01:/opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/PgReadData/Exec]# ldd HsPgUnload 
        linux-vdso.so.1 =>  (0x00007ffd0114b000)
        libPublic.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libPublic.so (0x00007f6ca9f69000)
        libLog.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libLog.so (0x00007f6ca9d63000)
        libPthread.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libPthread.so (0x00007f6ca9b58000)
        libPgReadData.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libPgReadData.so (0x00007f6ca9921000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6ca9705000)
        libDataConvertion.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libDataConvertion.so (0x00007f6ca9500000)
        libFileOperate.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libFileOperate.so (0x00007f6ca92f7000)
        libHashTable.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libHashTable.so (0x00007f6ca90f0000)
        libTree.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libTree.so (0x00007f6ca8edf000)
        libLinkList.so => /opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/Cmake/Libs/libLinkList.so (0x00007f6ca8cd4000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f6ca8906000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6caa16c000)

如果有动态库没有找到,就要看看环境变量是否配置正确或是否生效。

如果是安装包中缺少动态库,可以留言告知。

6、操作系统限制修改

(1)/etc/security/limits.conf

添加如下内容

bash 复制代码
lzl soft nofile 1048576
lzl hard nofile 1048576
lzl soft nproc  131072
lzl hard nproc  131072
lzl soft stack  1048576
lzl hard stack  1048576
lzl soft core   unlimited
lzl hard core   unlimited

(2)验证

记得重登操作系统用户,再执行如下命令

bash 复制代码
[lzl@czg0 ~]$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15593
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1048576
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 1048576
cpu time               (seconds, -t) unlimited
max user processes              (-u) 131072
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

7、在线迁移配置文件MigrationConfig.txt

具体的内容我都在配置文件中写好,大家按照规则来就行。

(1)Gbase8a -> Gbase8a

bash 复制代码
//*代表不可以空
//单引号包围参数,分号分割参数项
//每行开头不可以有空格,不然会跳过此参数检查。
//SpecifiedTab参数可以有多个。
 
[Tool]                                                           //工具信息。

ProcessNums   : '1;'                                             //*程序迁移时开的进程数。

Level         : '1;'                                             //*迁移级别。
                                                                 //2:库级迁移,BlackList生效。
                                                                 //1:表级迁移,SpecifiedTab生效。
OsInfo        : '192.168.142.12;gbase;gbase;'                    //*Gbase8a -> Gbase8a LOAD使用。工具所在操作系统IP;操作系统用户;操作系统用户密码;长度同下方的数据库IP;数据库用户名;数据库用户密码;

OneBatchNums  : '50000;'                                         //*MigrationType为0、1、2的情况下,支持此参数,一个批次插入的数据条数。(INSERT方式)

SwitchNums    : '3000000;'                                       //*MigrationType为0的情况下,支持此参数,此数以上使用LOAD,以下使用INSERT。

MigrationType : '0;'                                             //*迁移类型,支持0、1、2。
                                                                 //0 : Gbase8a     -> Gbase8a
                                                                 //1 : PostgreSql  -> Gbase8a
                                                                 //2 : PostgreSql  -> Dm
                          
[Source]                                                         //源端信息。

ConnInfo      : '192.168.142.12;root;;czg;5258;utf8;'            //'IP;数据库用户名;数据库用户密码;数据库名;数据库端口号;数据连接字符集;'
                                                                 //*单个IP长度限制19,数据库IP地址。
                                                                 //*单个用户名长度限制12,数据库用户名。
                                                                 //*单个用户名密码长度限制29,数据库密码。
                                                                 //*单个数据库名长度限制29,数据库名。
                                                                 //*数据库端口。
                                                                 //*长度限制9,数据库连接字符集,支持utf8和gbk,如果是达梦连接,需填写数字,对照表如下:
                                                                 //(1)UTF8                            1
                                                                 //(2)GBK                             2
                                                                 //(3)BIG5                            3
                                                                 //(4)ISO_8859_9                      4
                                                                 //(5)EUC_JP                          5
                                                                 //(6)EUC_KR                          6
                                                                 //(7)KOI8R                           7
                                                                 //(8)ISO_8859_1                      8
                                                                 //(9)SQL_ASCII                       9
                                                                 //(10)GB18030                        10
                                                                 //(11)ISO_8859_11                    11

MigrationDb   : 'public;'                                        //库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。
                                                                 //MigrationType为1的情况下,此为PG的模式名。

BlackList     : ''                                               //库级迁移参数,支持50个表,黑名单,表名,长度限制参考Db。和MigrationDb一起使用可以。        

#SpecifiedTab  : 'a,b,c;czg;testtab;;x,y,z;zxj;NewTab;'            
                                                                 //MigrationType为0的情况下,表级迁移参数,格式:'源端查询字段;源端库名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'
                                                                 //MigrationType为1的情况下,表级迁移参数,格式:'源端查询字段;源端模式名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'
                                                                 //如果没有特定条件,可以不写,但必须有分隔符,举例如下:
                                                                 //';czg;testtab;;;zxj;NewTab;'
                                                                 //这样相当于testtab迁移到NewTab,没有任何特殊条件。
                                                                 //这个可以有多个标签,想迁移多少张表就写几个标签。
#SpecifiedTab  : ';czg;testtab_copy;;;zxj;testtab_copy;'
#SpecifiedTab  : ';czg;czg;;;zxj;czg;'

#SpecifiedTab  : ';public;testtab;;;zxj;testtab;'
#SpecifiedTab  : ';public;students;;;zxj;students;'
#SpecifiedTab  : ';public;haha;;;zxj;haha;'

SpecifiedTab  : ';public;testtab;;;zxj;testtab;'

[Target]                                                         //目的端信息。

ConnInfo      : '192.168.142.12;czg;qwer1234;zxj;5258;utf8;'

MigrationDb   : 'zxj;'                                           //库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。

(2)PG -> Gbase8a

bash 复制代码
//*代表不可以空
//单引号包围参数,分号分割参数项
//每行开头不可以有空格,不然会跳过此参数检查。
//SpecifiedTab参数可以有多个。
 
[Tool]                                                           //工具信息。

ProcessNums   : '1;'                                             //*程序迁移时开的进程数。

Level         : '1;'                                             //*迁移级别。
                                                                 //2:库级迁移,BlackList生效。
                                                                 //1:表级迁移,SpecifiedTab生效。
OsInfo        : '192.168.142.12;gbase;gbase;'                    //*Gbase8a -> Gbase8a LOAD使用。工具所在操作系统IP;操作系统用户;操作系统用户密码;长度同下方的数据库IP;数据库用户名;数据库用户密码;

OneBatchNums  : '50000;'                                         //*MigrationType为0、1、2的情况下,支持此参数,一个批次插入的数据条数。(INSERT方式)

SwitchNums    : '3000000;'                                       //*MigrationType为0的情况下,支持此参数,此数以上使用LOAD,以下使用INSERT。

MigrationType : '1;'                                             //*迁移类型,支持0、1、2。
                                                                 //0 : Gbase8a     -> Gbase8a
                                                                 //1 : PostgreSql  -> Gbase8a
                                                                 //2 : PostgreSql  -> Dm
                          
[Source]                                                         //源端信息。

ConnInfo      : '192.168.142.12;postgres;postgres;czg;5432;utf8;' //'IP;数据库用户名;数据库用户密码;数据库名;数据库端口号;数据连接字符集;'
                                                                 //*单个IP长度限制19,数据库IP地址。
                                                                 //*单个用户名长度限制12,数据库用户名。
                                                                 //*单个用户名密码长度限制29,数据库密码。
                                                                 //*单个数据库名长度限制29,数据库名。
                                                                 //*数据库端口。
                                                                 //*长度限制9,数据库连接字符集,支持utf8和gbk,如果是达梦连接,需填写数字,对照表如下:
                                                                 //(1)UTF8                            1
                                                                 //(2)GBK                             2
                                                                 //(3)BIG5                            3
                                                                 //(4)ISO_8859_9                      4
                                                                 //(5)EUC_JP                          5
                                                                 //(6)EUC_KR                          6
                                                                 //(7)KOI8R                           7
                                                                 //(8)ISO_8859_1                      8
                                                                 //(9)SQL_ASCII                       9
                                                                 //(10)GB18030                        10
                                                                 //(11)ISO_8859_11                    11

MigrationDb   : 'public;'                                        //库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。
                                                                 //MigrationType为1的情况下,此为PG的模式名。

BlackList     : ''                                               //库级迁移参数,支持50个表,黑名单,表名,长度限制参考Db。和MigrationDb一起使用可以。        

#SpecifiedTab  : 'a,b,c;czg;testtab;;x,y,z;zxj;NewTab;'            
                                                                 //MigrationType为0的情况下,表级迁移参数,格式:'源端查询字段;源端库名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'
                                                                 //MigrationType为1的情况下,表级迁移参数,格式:'源端查询字段;源端模式名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'
                                                                 //如果没有特定条件,可以不写,但必须有分隔符,举例如下:
                                                                 //';czg;testtab;;;zxj;NewTab;'
                                                                 //这样相当于testtab迁移到NewTab,没有任何特殊条件。
                                                                 //这个可以有多个标签,想迁移多少张表就写几个标签。
#SpecifiedTab  : ';czg;testtab_copy;;;zxj;testtab_copy;'
#SpecifiedTab  : ';czg;czg;;;zxj;czg;'

#SpecifiedTab  : ';public;testtab;;;zxj;testtab;'
#SpecifiedTab  : ';public;students;;;zxj;students;'
#SpecifiedTab  : ';public;haha;;;zxj;haha;'

SpecifiedTab  : ';public;testtab;;;zxj;testtab;'

[Target]                                                         //目的端信息。

ConnInfo      : '192.168.142.12;czg;qwer1234;zxj;5258;utf8;'

MigrationDb   : 'zxj;'                                           //库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。

(3)PG -> Dm

bash 复制代码
//*代表不可以空
//单引号包围参数,分号分割参数项
//每行开头不可以有空格,不然会跳过此参数检查。
//SpecifiedTab参数可以有多个。
 
[Tool]                                                           //工具信息。

ProcessNums   : '1;'                                             //*程序迁移时开的进程数。

Level         : '1;'                                             //*迁移级别。
                                                                 //2:库级迁移,BlackList生效。
                                                                 //1:表级迁移,SpecifiedTab生效。
OsInfo        : '192.168.142.12;gbase;gbase;'                    //*Gbase8a -> Gbase8a LOAD使用。工具所在操作系统IP;操作系统用户;操作系统用户密码;长度同下方的数据库IP;数据库用户名;数据库用户密码;

OneBatchNums  : '50000;'                                         //*MigrationType为0、1、2的情况下,支持此参数,一个批次插入的数据条数。(INSERT方式)

SwitchNums    : '3000000;'                                       //*MigrationType为0的情况下,支持此参数,此数以上使用LOAD,以下使用INSERT。

MigrationType : '2;'                                             //*迁移类型,支持0、1、2。
                                                                 //0 : Gbase8a     -> Gbase8a
                                                                 //1 : PostgreSql  -> Gbase8a
                                                                 //2 : PostgreSql  -> Dm
                          
[Source]                                                         //源端信息。

ConnInfo      : '192.168.142.12;postgres;postgres;czg;5432;utf8;' //'IP;数据库用户名;数据库用户密码;数据库名;数据库端口号;数据连接字符集;'
                                                                 //*单个IP长度限制19,数据库IP地址。
                                                                 //*单个用户名长度限制12,数据库用户名。
                                                                 //*单个用户名密码长度限制29,数据库密码。
                                                                 //*单个数据库名长度限制29,数据库名。
                                                                 //*数据库端口。
                                                                 //*长度限制9,数据库连接字符集,支持utf8和gbk,如果是达梦连接,需填写数字,对照表如下:
                                                                 //(1)UTF8                            1
                                                                 //(2)GBK                             2
                                                                 //(3)BIG5                            3
                                                                 //(4)ISO_8859_9                      4
                                                                 //(5)EUC_JP                          5
                                                                 //(6)EUC_KR                          6
                                                                 //(7)KOI8R                           7
                                                                 //(8)ISO_8859_1                      8
                                                                 //(9)SQL_ASCII                       9
                                                                 //(10)GB18030                        10
                                                                 //(11)ISO_8859_11                    11

MigrationDb   : 'public;'                                        //库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。
                                                                 //MigrationType为1的情况下,此为PG的模式名。

BlackList     : ''                                               //库级迁移参数,支持50个表,黑名单,表名,长度限制参考Db。和MigrationDb一起使用可以。        

#SpecifiedTab  : 'a,b,c;czg;testtab;;x,y,z;zxj;NewTab;'            
                                                                 //MigrationType为0的情况下,表级迁移参数,格式:'源端查询字段;源端库名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'
                                                                 //MigrationType为1的情况下,表级迁移参数,格式:'源端查询字段;源端模式名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'
                                                                 //如果没有特定条件,可以不写,但必须有分隔符,举例如下:
                                                                 //';czg;testtab;;;zxj;NewTab;'
                                                                 //这样相当于testtab迁移到NewTab,没有任何特殊条件。
                                                                 //这个可以有多个标签,想迁移多少张表就写几个标签。
#SpecifiedTab  : ';czg;testtab_copy;;;zxj;testtab_copy;'
#SpecifiedTab  : ';czg;czg;;;zxj;czg;'

#SpecifiedTab  : ';public;testtab;;;zxj;testtab;'
#SpecifiedTab  : ';public;students;;;zxj;students;'
#SpecifiedTab  : ';public;haha;;;zxj;haha;'

SpecifiedTab  : ';public;testtab;;;zxj;testtab;'

[Target]                                                         //目的端信息。

ConnInfo      : '192.168.142.12;SYSDBA;SYSDBA;;5238;1;'

MigrationDb   : 'zxj;'                                           //库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。

十、在线迁移性能对比测试

和开源ETL工具Kettle进行对比测试。

由于本人测试条件有限(所有的数据库和工具都部署在一个虚机里),如果大家有条件可以在性能更好的环境下测试,迁移效率肯定会比下面的结果更好。

1、性能测试对比表格

|------------------|---------------------------|------------------------|-------------------|
| 工具名\迁移项(单位:行/秒) | Gbase8a -> Gbase8a | PostgreSql -> Gbase8a | PostgreSql -> Dm |
| HappySunshine | 43690(INSERT) 98304(LOAD) | 43690 | 78643 |
| Kettle | 3215 | 2964 | 20837 |

2、测试表结构

(1)Gbase8a

sql 复制代码
gbase> DESC ZXJ.TESTTAB;
+-------+---------------+------+-----+-------------------+-----------------------------+
| Field | Type          | Null | Key | Default           | Extra                       |
+-------+---------------+------+-----+-------------------+-----------------------------+
| a     | int(11)       | YES  |     | NULL              |                             |
| b     | double        | YES  |     | NULL              |                             |
| c     | varchar(100)  | YES  | MUL | NULL              |                             |
| d     | text          | YES  |     | NULL              |                             |
| e     | blob          | YES  |     | NULL              |                             |
| f     | longblob      | YES  |     | NULL              |                             |
| g     | date          | YES  |     | NULL              |                             |
| h     | timestamp     | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| i     | decimal(10,2) | YES  |     | NULL              |                             |
+-------+---------------+------+-----+-------------------+-----------------------------+
9 rows in set (Elapsed: 00:00:00.00)

(2)DM

sql 复制代码
SQL> DESC ZXJ.TESTTAB;

行号     NAME TYPE$        NULLABLE
---------- ---- ------------ --------
1          A    INTEGER      Y
2          B    DOUBLE       Y
3          C    VARCHAR(100) Y
4          D    TEXT         Y
5          E    BLOB         Y
6          F    BLOB         Y
7          G    DATE         Y
8          H    DATETIME(6)  Y
9          I    DEC(10, 2)   Y

9 rows got

(3)PG

sql 复制代码
czg=# \d public.testtab
                                      Table "public.testtab"
 Column |            Type             | Collation | Nullable |              Default               
--------+-----------------------------+-----------+----------+------------------------------------
 a      | integer                     |           | not null | nextval('testtab_a_seq'::regclass)
 b      | double precision            |           |          | 
 c      | character varying(100)      |           |          | 
 d      | text                        |           |          | 
 e      | bytea                       |           |          | 
 f      | bytea                       |           |          | 
 g      | date                        |           |          | 
 h      | timestamp without time zone |           |          | 
 i      | numeric(10,2)               |           |          | 
Indexes:
    "testtab_pkey" PRIMARY KEY, btree (a)

3、测试数据样式

sql 复制代码
czg=# SELECT * FROM PUBLIC.TESTTAB LIMIT 10;
    a    |  b  |      c      |    d     |       e        |             f              |     g      |          h          |    i    
---------+-----+-------------+----------+----------------+----------------------------+------------+---------------------+---------
 2399798 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |        
 2399799 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |    0.00
 2399800 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |    8.80
 2399801 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |   -8.80
 2399802 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |  348.80
 2399803 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 | -348.80
 2399804 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |        
 2399805 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |    0.00
 2399806 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |    8.80
 2399807 | 2.1 | LXG'ZXJ|CLX | HAHHAHAH | \x414141414141 | \x424242424242424242424242 | 2024-08-19 | 2024-08-19 00:00:00 |   -8.80
(10 rows)

4、HappySunshine测试截图

(1)PostgreSql -> Dm

(2)PostgreSql -> Gbase8a

(3)Gbase8a-> Gbase8a

INSERT

LOAD

5、Kettle测试截图

(1)PG -> Dm

测试步骤大家可以参考之前写的博客《Kettle-学习-03-PostgreSql迁移至达梦DM

(2)PG -> Gbase8a

测试步骤大家可以参考之前写的博客《Kettle-学习-02-PostgreSql迁移至Gbase8a

(3)Gbase8a-> Gbase8a

测试步骤大家可以参考之前写的博客《Kettle-学习-01-Gbase8a迁移至Gbase8a

十一、离线抽取功能介绍

1、单库级抽取示例

bash 复制代码
[root@dw01:/opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/PgReadData/Exec]# ./HsPgUnload /opt/Pg14-5/Data/base/13892/ /home/czg/TestPgData/ 8192 '*' '*'
2026-05-17 14:04:52.051262-P[54440]-T[54440]-[Info ]-main               : OK, DataDir : '/opt/Pg14-5/Data/base/13892/', UloadDir : '/home/czg/TestPgData/', PageSize : 8192, Sch : '*', Tab : '*'.
2026-05-17 14:04:52.052235-P[54440]-T[54440]-[Info ]-HsLicCheck         : OK, Ver : 'HappySunshineV1.6', Flag : 'Free', BaseTime : '2026-05-17', ExpireTime : '2027-05-17'.
2026-05-17 14:04:52.052351-P[54440]-T[54440]-[Info ]-PgGlbEnvInit       : OK, WritePages : 2, WriteBlockSize : 8192, PgSchMark : BT, PgClassMark : BT, PgAttrMark : BT, PgEnumMark : BT.
2026-05-17 14:04:52.081777-P[54440]-T[54440]-[Info ]-PgFileNodeMap      : OK, FilePath : '/opt/Pg14-5/Data/base/13892/pg_filenode.map', num_mappings : 17, PgClassOid : 72582, PgAttrOid : 72217.
2026-05-17 14:04:52.084274-P[54440]-T[54440]-[Info ]-PgClassDecode      : OK, Sch : pg_catalog     , Tab : pg_class            , Time :     0.000 (s.ms).
2026-05-17 14:04:52.084389-P[54440]-T[54440]-[Info ]-PgSchDecode        : OK, Sch : pg_catalog     , Tab : pg_namespace        , Time :     0.000 (s.ms).
2026-05-17 14:04:52.086564-P[54440]-T[54440]-[Info ]-PgAttrDecode       : OK, Sch : pg_catalog     , Tab : pg_attribute        , Time :     0.002 (s.ms).
2026-05-17 14:04:52.086826-P[54440]-T[54440]-[Info ]-PgEnumDecode       : OK, Sch : pg_catalog     , Tab : pg_enum             , Time :     0.000 (s.ms).
2026-05-17 14:04:52.086903-P[54440]-T[54440]-[Info ]-CllPrint           : 
[ ('public' ,'czg' ),('public' ,'lzl' ),('public' ,'moon' ),('public' ,'sun' ),('public' ,'xxx' ) ]
[ ('public' ,'zxj' ),('sun' ,'sun' ) ]
2026-05-17 14:04:52.109993-P[54440]-T[54440]-[Info ]-PgTabDecode        : OK, Sch : sun            , Tab : sun                 , Time :     0.023 (s.ms).
2026-05-17 14:04:52.110816-P[54440]-T[54440]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : zxj                 , Time :     0.000 (s.ms).
2026-05-17 14:04:53.525834-P[54440]-T[54440]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : xxx                 , Time :     1.414 (s.ms).
2026-05-17 14:04:53.595122-P[54440]-T[54440]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : sun                 , Time :     0.069 (s.ms).
2026-05-17 14:04:53.611284-P[54440]-T[54440]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : moon                , Time :     0.016 (s.ms).
2026-05-17 14:04:53.611441-P[54440]-T[54440]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : lzl                 , Time :     0.000 (s.ms).
2026-05-17 14:04:53.612363-P[54440]-T[54440]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : czg                 , Time :     0.000 (s.ms).
2026-05-17 14:04:53.628183-P[54440]-T[54440]-[Info ]-main               : OK, Task completed, Time :     1.576 (s.ms).

2、模式级抽取示例

bash 复制代码
[root@dw01:/opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/PgReadData/Exec]# ./HsPgUnload /opt/Pg14-5/Data/base/13892/ /home/czg/TestPgData/ 8192 'public' '*'
2026-05-17 14:10:42.046029-P[54788]-T[54788]-[Info ]-main               : OK, DataDir : '/opt/Pg14-5/Data/base/13892/', UloadDir : '/home/czg/TestPgData/', PageSize : 8192, Sch : 'public', Tab : '*'.
2026-05-17 14:10:42.046908-P[54788]-T[54788]-[Info ]-HsLicCheck         : OK, Ver : 'HappySunshineV1.6', Flag : 'Free', BaseTime : '2026-05-17', ExpireTime : '2027-05-17'.
2026-05-17 14:10:42.047100-P[54788]-T[54788]-[Info ]-PgGlbEnvInit       : OK, WritePages : 2, WriteBlockSize : 8192, PgSchMark : BT, PgClassMark : BT, PgAttrMark : BT, PgEnumMark : BT.
2026-05-17 14:10:42.072514-P[54788]-T[54788]-[Info ]-PgFileNodeMap      : OK, FilePath : '/opt/Pg14-5/Data/base/13892/pg_filenode.map', num_mappings : 17, PgClassOid : 72582, PgAttrOid : 72217.
2026-05-17 14:10:42.075413-P[54788]-T[54788]-[Info ]-PgClassDecode      : OK, Sch : pg_catalog     , Tab : pg_class            , Time :     0.000 (s.ms).
2026-05-17 14:10:42.075532-P[54788]-T[54788]-[Info ]-PgSchDecode        : OK, Sch : pg_catalog     , Tab : pg_namespace        , Time :     0.000 (s.ms).
2026-05-17 14:10:42.077850-P[54788]-T[54788]-[Info ]-PgAttrDecode       : OK, Sch : pg_catalog     , Tab : pg_attribute        , Time :     0.002 (s.ms).
2026-05-17 14:10:42.078068-P[54788]-T[54788]-[Info ]-PgEnumDecode       : OK, Sch : pg_catalog     , Tab : pg_enum             , Time :     0.000 (s.ms).
2026-05-17 14:10:42.078114-P[54788]-T[54788]-[Info ]-CllPrint           : 
[ ('public' ,'czg' ),('public' ,'lzl' ),('public' ,'moon' ),('public' ,'sun' ),('public' ,'xxx' ) ]
[ ('public' ,'zxj' ) ]
2026-05-17 14:10:42.078216-P[54788]-T[54788]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : zxj                 , Time :     0.000 (s.ms).
2026-05-17 14:10:43.491535-P[54788]-T[54788]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : xxx                 , Time :     1.413 (s.ms).
2026-05-17 14:10:43.555579-P[54788]-T[54788]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : sun                 , Time :     0.063 (s.ms).
2026-05-17 14:10:43.574203-P[54788]-T[54788]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : moon                , Time :     0.018 (s.ms).
2026-05-17 14:10:43.574326-P[54788]-T[54788]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : lzl                 , Time :     0.000 (s.ms).
2026-05-17 14:10:43.575292-P[54788]-T[54788]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : czg                 , Time :     0.000 (s.ms).
2026-05-17 14:10:43.585996-P[54788]-T[54788]-[Info ]-main               : OK, Task completed, Time :     1.540 (s.ms).

3、表级抽取示例

bash 复制代码
[root@dw01:/opt/Developer/ComputerLanguageStudy/C/DataStructureTestSrc/PublicFunction/PgReadData/Exec]# ./HsPgUnload /opt/Pg14-5/Data/base/13892/ /home/czg/TestPgData/ 8192 'public' 'sun'
2026-05-17 14:11:39.153808-P[54844]-T[54844]-[Info ]-main               : OK, DataDir : '/opt/Pg14-5/Data/base/13892/', UloadDir : '/home/czg/TestPgData/', PageSize : 8192, Sch : 'public', Tab : 'sun'.
2026-05-17 14:11:39.154480-P[54844]-T[54844]-[Info ]-HsLicCheck         : OK, Ver : 'HappySunshineV1.6', Flag : 'Free', BaseTime : '2026-05-17', ExpireTime : '2027-05-17'.
2026-05-17 14:11:39.154556-P[54844]-T[54844]-[Info ]-PgGlbEnvInit       : OK, WritePages : 2, WriteBlockSize : 8192, PgSchMark : BT, PgClassMark : BT, PgAttrMark : BT, PgEnumMark : BT.
2026-05-17 14:11:39.177704-P[54844]-T[54844]-[Info ]-PgFileNodeMap      : OK, FilePath : '/opt/Pg14-5/Data/base/13892/pg_filenode.map', num_mappings : 17, PgClassOid : 72582, PgAttrOid : 72217.
2026-05-17 14:11:39.179965-P[54844]-T[54844]-[Info ]-PgClassDecode      : OK, Sch : pg_catalog     , Tab : pg_class            , Time :     0.000 (s.ms).
2026-05-17 14:11:39.180069-P[54844]-T[54844]-[Info ]-PgSchDecode        : OK, Sch : pg_catalog     , Tab : pg_namespace        , Time :     0.000 (s.ms).
2026-05-17 14:11:39.182070-P[54844]-T[54844]-[Info ]-PgAttrDecode       : OK, Sch : pg_catalog     , Tab : pg_attribute        , Time :     0.001 (s.ms).
2026-05-17 14:11:39.182285-P[54844]-T[54844]-[Info ]-PgEnumDecode       : OK, Sch : pg_catalog     , Tab : pg_enum             , Time :     0.000 (s.ms).
2026-05-17 14:11:39.182338-P[54844]-T[54844]-[Info ]-CllPrint           : 
[ ('public' ,'sun' ) ]
2026-05-17 14:11:39.200323-P[54844]-T[54844]-[Info ]-PgTabDecode        : OK, Sch : public         , Tab : sun                 , Time :     0.017 (s.ms).
2026-05-17 14:11:39.215802-P[54844]-T[54844]-[Info ]-main               : OK, Task completed, Time :     0.062 (s.ms).

4、数据加载示例

sql 复制代码
COPY MOON FROM '/home/czg/TestPgData/public_sun.txt' WITH (FORMAT CSV,DELIMITER '|',NULL '',QUOTE '"',ESCAPE '\');

十二、许可证

|------|--------------------------------------|
| 版本 | 限制 |
| Free | 1、单表数据文件大小小于100MB。 2、免费使用一年,续期请联系作者。 |
| Pro | 无限制,需相应许可请联系作者。 |

十三、需求&Bug

需提供如下内容:

|----|-----------------|-------|
| 序号 | 名称 | 必要性 |
| 1 | 操作系统版本 | 必要 |
| 2 | CPU型号 | 必要 |
| 3 | HappySunshine版本 | 必要 |
| 4 | 数据库版本 | 必要 |
| 5 | 问题 | 需求 | 必要 |
| 6 | Bug复现方法 | Bug必要 |
| 7 | 报错截图 | Bug必要 |
| 8 | core文件 | Bug必要 |

相关推荐
Bechamz11 小时前
大数据开发学习Day34
java·大数据·学习
不吃土豆的马铃薯11 小时前
5.SGI STL 二级空间配置器 _S_chunk_alloc核心函数解析
开发语言·c++·vscode·c·内存池
剑神一笑11 小时前
深入理解 Linux gzip 压缩:从 DEFLATE 算法到实战优化
linux·运维·php
学掌门11 小时前
JavaScript:为什么命名参数比位置参数更好
开发语言·javascript·ecmascript
JoneBB11 小时前
ABAP上传EXCEL模板并将内表内容存到两个sheet中
java·前端·数据库
痕忆丶11 小时前
openharmony北向开发基础之OpenHarmony签名机制详解
linux·harmonyos
码界筑梦坊11 小时前
124-基于Python的航空旅客满意度数据可视化分析系统
开发语言·python·信息可视化·数据分析·flask·毕业设计
XMYX-011 小时前
31 - Go url 解析:从字符串到结构化请求的完整路径
开发语言·golang
hhb_61811 小时前
PHP开发实战:高频难点解析与优化方案
开发语言·php