崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB

前言

首届YashanDB「迁移体验官」开放后,陆续收到「体验官」们的投稿,小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB》(作者:小草),满满干货,不要错过!

号外!新的征文活动已开启,点击此处或戳一戳下方图片即可跳转活动链接,最高可获千元大奖!

一、背景

我司主要软件生态数据库使用的是Oracle,国产数据库中崖山兼容Oracle做的比较好。在国产化替换进程中崖山无疑是首选,因为替换的研发和运维成本相对较低。为了提前了解国产数据库与Oracle的兼容适配情况,测试并研究生产应用的可能性,特意关注国产化数据库的最新动态。通过测试国产数据库及相关生态工具验证其可行性。本文主要介绍如何通过崖山YMP异构迁移工具将Oracle数据库迁移到YashanDB数据库。

二、YMP简介

2.1概述

崖山迁移平台(YashanDB Migration Platform,YMP)是YashanDB提供的数据库迁移产品,支持异构RDBMS与YashanDB之间进行迁移评估、离线迁移、数据校验的能力。YMP提供可视化服务,用户只需通过简单的界面操作,即可完成从评估到迁移整个流程的执行与监控,实现低门槛、低成本、高效率的异构数据库迁移。

2.2产品功能

2.2.1 迁移评估

  • 提前自动评估元数据迁移代价及可行性

  • 预估数据迁移时间、评估风险及可行性

  • 在线/离线评估,统计并生成评估报告

  • 一站式完成数据库迁移方案设计,支撑自动化迁移

2.2.2 元数据迁移

  • 自动生成DDL语法

  • PL/SQL一键自动转换

  • 支持源库自动抽取或手工导入

  • 提升迁移效率,降低人力投入成本

2.2.3 数据迁移

  • 异构数据库元数据自动迁移,全量/增量

  • 支持传统离线方式,在线直连不停机方式

  • 支持元数据兼容映射

  • 全库/单表/批量/对象级灵活任务管理和调度

  • 并行高速迁移调度

2.2.4 数据校验

  • 支持对象校验/数据校验/全量校检

  • 数据支持统计校验、抽样校验和精确校验

  • 快速准确给出校验结果,确保迁移结果正确性和可靠性

  • 可自动校检/实时校检/随时校检

2.3产品架构

2.4产品规格

2.4.1 数据库版本支持

2.4.2 数据类型支持

三、本次体验环境说明

四、YMP部署

4.1安装前准备

4.1.1 操作系统参数调整

# 查看最大用户线程数 # ulimit -u# 执行如下命令使最大用户线程数临时生效,重启后无效 # ulimit -u 65536# 执行执行如下命令将最大用户线程数写入/etc/security/limits.conf文件,重启后参数永久生效
# echo "
# * soft nproc 65536
# * hard nproc 65536 # " >> /etc/security/limits.conf#使参数立即生效 # sysctl -p

4.1.2 防火墙设置

如下为YMP默认使用端口

我们只需要放行8090管理平台web访问端口即可。

查看防火墙放行情况:

# firewall-cmd --zone=public --list-ports

防火墙放行8090端口:

# 添加(–permanent 永久生效,没有此参数重启后失效) # firewall-cmd --zone=public --add-port=8090/tcp --permanent# 重新载入 # firewall-cmd --reload# 查看 # firewall-cmd --zone=public --query-port=8090/tcp如需删除请使用如下命令:# 删除已添加的端口 # firewall-cmd --zone=public --remove-port=8090/tcp --permanent

4.1.3 创建YMP部署用户

# 新建YMP用户
# useradd -d /home/ymp -m ymp # passwd ymp

4.1.4 JDK环境准备

YMP仅支持在JDK8或JDK11的环境下安装。

# 以JDK安装路径为/usr/tools/jdk8为例 # vi /etc/profile
# 在文件结尾添加如下 #java_8u221
export JAVA_HOME=/usr/local/java/jdk1.8.0_221
export MAVEN_HOME=/usr/local/maven/apache-maven-3.9.6
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib
# 重新载入配置文件 # source /etc/profile
# 安装成功后查看JDK版本信息 # java -version

4.1.5 libaio环境准备

YMP运行需要libaio动态库。

# 查看是否已安装libaio动态库
# rpm -qa | grep libaio# 若未有版本信息打印,安装libaio
# yum install -y libaio

4.1.6 OCI环境准备

如需要使用Oracle到YashanDB的数据迁移功能,需进行OCI环境安装。

准备OCI环境需从Oracle官网下载OCI客户端并依据官网所列步骤进行安装。

(https://www.oracle.com/cn/database/technologies/instant-client/linux-x86-64-downloads.html)

YMP现仅支持OCI Version 19.19.0.0.0及以上版本。建议下载和安装的版本信息如下:

  • x86平台使用:instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip

  • arm平台使用:instantclient-basic-linux.arm64-19.10.0.0.0dbru-2.zip

上传安装包至YMP用户/home/ymp/路径。

# 修改安装包所属用户及用户组为ymp用户 # chown ymp:ymp instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip# 从root用户切换至ymp用户 # su - ymp# 切换至安装路径 $ cd /home/ymp# 解压OCI安装包 $ unzip instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip

4.1.7 YashanDB环境准备

使用默认内置库时,本步骤可省略。(推荐使用内置库,比较省事)

使用外部内置库时:

  • 如需一个全新的YashanDB单机环境,参考YashanDB官网文档进行安装部署。

  • 如为一个已有的YashanDB单机环境,则需由DBA在该环境中执行如下脚本:

–创建一个ymp用户(以YMP_DEFAULT为例)并为其授权
create user YMP_DEFAULT IDENTIFIED BY ymppw602 DEFAULT TABLESPACE users;
GRANT ALL PRIVILEGES TO YMP_DEFAULT; GRANT DBA TO YMP_DEFAULT;

4.1.8 软件包准备

下载YMP及YashanDB安装包。

yashan-migrate-platform-v23.2.1.0-linux-x86-64.zip

yashandb-personal-23.2.1.100-linux-x86_64.tar.gz

上传安装包至YMP用户/home/ymp/路径。

#修改安装包所属用户及用户组为ymp用户 
# chown ymp:ymp yashandb-personal-23.2.1.100-linux-x86_64.tar.gz
# chown ymp:ymp yashan-migrate-platform-v23.2.1.0-linux-x86-64.zip

4.1.9 客户端浏览器

YMP支持浏览器Google Chrome、Microsoft Edge和Firefox,建议使用当前较新的版本。

4.2安装

4.2.1 解压安装包

# 从root用户切换至ymp用户 # su - ymp# 切换至YMP安装目录
$ cd /home/ymp/ $ unzip yashan-migrate-platform-v23.2.1.0-linux-x86-64.zip

4.2.2 安装参数调整

依据实际需要对默认内置库安装及YMP启动参数进行调整。

$ vi /home/ymp/yashan-migrate-platform/conf/db.properties默认内置库安装配置文件# db.propertiesYASDB_PASSWORD=3uplbtbnyZ5XFRtpg5F5JQ== # 默认内置库sys用户默认密码密文 YYASDB_PASSWORD=ymppw602.YASDB_PORT=8091
YASDB_CHARACTER_SET=UTF8 ## character_set optional: UTF8, ASCII, ISO88591, GBKYMP默认配置 $ vi /home/ymp/yashan-migrate-platform/conf/application.properties# YMP服务端口 server.port=8090# 用户登录后空闲过期时间,单位秒(s),默认15分钟
shiro.session.timeout=900
# YMP使用的最大堆内存,单位: GB
ymp_memory=4
# YMP使用的堆外内存,单位: GB ymp_direct_memory=2#YMP业务数据库=====
# YMP业务数据库连接信息
spring.datasource.url=jdbc:yasdb://127.0.0.1:1688/yashandb
spring.datasource.username=YMP_DEFAULT
spring.datasource.password=ymppw602
spring.datasource.largePoolSize=64M
spring.datasource.cursorPoolSize=64M
# 默认内置库表类型,默认HEAP,可选HEAP,TAC,LSC
spring.datasource.defaultTableType=HEAP
spring.datasource.openCursors=3000
spring.datasource.sharePoolSize=2G
spring.datasource.dateFormat=yyyy-mm-dd hh24:mi:ss spring.datasource.ddlLockTimeout=2#评估=====# YMP的最大并行任务数
task.parallel.max-num=500
# 预计数据迁移速度,KB/s。修改会影响评估结果预计迁移时间的大小
commons.dataMigrateSpeed=51200
# 预计对象迁移速度,number/s。修改会影响评估结果预计迁移时间的大小
commons.objMigrateSpeed=200
# 评估任务单个会话获取DDL的数量,如果Oracle性能较差,则需要降低该值
assessment.ddlCount=50
# 评估任务最多同时拥有的会话数,如果Oracle性能较差,则需要降低该值
assessment.maxThreadCount=20
# 内置库表类型是否为LSC,默认为false
isLscTable=false
# 拦截的Oracle数据源db/schema黑名单
schemaBlackList.oracle=ANONYMOUS,APEX_030200,APEX_PUBLIC_USER,APPQOSSYS,BI,CTXSYS,DBSNMP,DIP,EXFSYS,FLOWS_FILES,HR,IX,MDDATA,MDSYS,MGMT_VIEW,OE,OLAPSYS,ORACLE_OCM,ORDDATA,ORDPLUGINS,ORDSYS,OUTLN,OWBSYS,OWBSYS_AUDIT,PM,SCOTT,SH,SI_INFORMTN_SCHEMA,SPATIAL_CSW_ADMIN_USR,SPATIAL_WFS_ADMIN_USR,SYS,SYSMAN,SYSTEM,WMSYS,XDB,XS$NULL
# 拦截的MySQL数据源db/schema黑名单
schemaBlackList.mysql=information_schema,mysql,performance_schema,sys
# 拦截的dm数据源db/schema黑名单 schemaBlackList.dm=SYS,SYSDBA,SYSSSO,SYSAUDITOR,CTISYS#迁移=====# 元数据迁移过程中源端、目标端查询视图连接数。在元数据迁移过程中会有分批量的查询的动作, 需要开启多个查询连接并行查询。该参数配置元数据迁移的源端、目标端查询的并行线程数,决定了对数据库的查询最大连接数,不设置默认20
migration.parallel.query=20
# 元数据迁移过程中目标端执行创建连接数。在元数据迁移过程中会并行把对象在目标端的执行,以提升迁移效率。该参数配置元数据迁移的目标端DDL执行的并行线程数,决定了连接数据库的执行最大连接数,不设置默认20。migration.parallel.query和migration.parallel.execute的连接总和,是最终迁移过程中所有的目标端数据库连接数。
migration.parallel.execute=20
# 创建索引是否使用并行参数,true/TRUE:使用,false/FALSE:不使用
migration.parallel.createIndexUseParallel=true
# 索引创建的并行度,需要考虑migration.parallel.execute。例:migration.parallel.execute:10,migration.parallel.index: 5,表示,同时10个连接在并行建索引,每个索引的并行度是5(CREATE INDEX XXX PARALLEL 5)。不填默认CPU核数。
migration.parallel.index=5
# 数据迁移前是否将表设为nologging,默认为false
setNoLogging=false
# 导出oracle时使用的导出方式,支持 [dts, jdbc] 两种方式
export.oracle.tool=dts
# 导出时每个csv文件的行数
export.csv.exportRowsEveryFile=2000000
# 迁移成功时候是否删除csv文件
export.csv.isRemoveCsvFileInSuccess=true
# csv文件存储路径包含对schema和table的拼接,schema名或table名中包含以上字符时,将会被替换,以避免被操作系统识别错误导致迁移失败;不过这可能会使某些表(比如AA$与AA.)在替换后使用的csv文件存储路径相同,导致迁移失败(No such file or directory),可以通过重新迁移失败表来解决
export.csv.path.replacement.from=\ /’."*$
/dev/sda4 926G 36G 891G 4% /
# YMP服务端口 server.port=8090# 用户登录后空闲过期时间,单位秒(s),默认15分钟
shiro.session.timeout=900
# YMP使用的最大堆内存,单位: GB
ymp_memory=4
# YMP使用的堆外内存,单位: GB ymp_direct_memory=2#YMP业务数据库=====
# YMP业务数据库连接信息
spring.datasource.url=jdbc:yasdb://172.16.60.219:1688/yashandb
spring.datasource.username=YMP_DEFAULT
spring.datasource.password=ymppw602
spring.datasource.largePoolSize=64M
spring.datasource.cursorPoolSize=64M
# 默认内置库表类型,默认HEAP,可选HEAP,TAC,LSC
spring.datasource.defaultTableType=HEAP
spring.datasource.openCursors=3000
spring.datasource.sharePoolSize=2G
spring.datasource.dateFormat=yyyy-mm-dd hh24:mi:ss spring.datasource.ddlLockTimeout=2#评估=====# YMP的最大并行任务数
task.parallel.max-num=500
# 预计数据迁移速度,KB/s。修改会影响评估结果预计迁移时间的大小
commons.dataMigrateSpeed=51200
# 预计对象迁移速度,number/s。修改会影响评估结果预计迁移时间的大小
commons.objMigrateSpeed=200
# 评估任务单个会话获取DDL的数量,如果Oracle性能较差,则需要降低该值
assessment.ddlCount=50
# 评估任务最多同时拥有的会话数,如果Oracle性能较差,则需要降低该值
assessment.maxThreadCount=20
# 内置库表类型是否为LSC,默认为false
isLscTable=false
# 拦截的Oracle数据源db/schema黑名单
# 拦截的MySQL数据源db/schema黑名单
schemaBlackList.mysql=information_schema,mysql,performance_schema,sys
# 拦截的dm数据源db/schema黑名单 schemaBlackList.dm=SYS,SYSDBA,SYSSSO,SYSAUDITOR,CTISYS#迁移=====# 元数据迁移过程中源端、目标端查询视图连接数。在元数据迁移过程中会有分批量的查询的动作, 需要开启多个查询连接并行查询。该参数配置元数据迁移的源端、目标端查询的并行线程数,决定了对数据库的查询最大连接数,不设置默认20
migration.parallel.query=20
# 元数据迁移过程中目标端执行创建连接数。在元数据迁移过程中会并行把对象在目标端的执行,以提升迁移效率。该参数配置元数据迁移的目标端DDL执行的并行线程数,决定了连接数据库的执行最大连接数,不设置默认20。migration.parallel.query和migration.parallel.execute的连接总和,是最终迁移过程中所有的目标端数据库连接数。
migration.parallel.execute=20
# 创建索引是否使用并行参数,true/TRUE:使用,false/FALSE:不使用
migration.parallel.createIndexUseParallel=true
# 索引创建的并行度,需要考虑migration.parallel.execute。例:migration.parallel.execute:10,migration.parallel.index: 5,表示,同时10个连接在并行建索引,每个索引的并行度是5(CREATE INDEX XXX PARALLEL 5)。不填默认CPU核数。
migration.parallel.index=5
# 数据迁移前是否将表设为nologging,默认为false
setNoLogging=false
# 导出oracle时使用的导出方式,支持 [dts, jdbc] 两种方式
export.oracle.tool=dts
# 导出时每个csv文件的行数
export.csv.exportRowsEveryFile=2000000
# 迁移成功时候是否删除csv文件
export.csv.isRemoveCsvFileInSuccess=true
# csv文件存储路径包含对schema和table的拼接,schema名或table名中包含以上字符时,将会被替换,以避免被操作系统识别错误导致迁移失败;不过这可能会使某些表(比如AA$与AA.)在替换后使用的csv文件存储路径相同,导致迁移失败(No such file or directory),可以通过重新迁移失败表来解决
export.csv.path.replacement.from=\ /’."*$
# 发生csv文件存储路径字符替换时(详见export.csv.path.replacement.from),指定替换的目标字符或字符串
export.csv.path.replacement.to=_
# 导出时大表拆分的个数
export.table.splitCount=5
# 导出时触发大表拆分的行数
export.table.splitConditionCount=10000000
# 导出时触发大表拆分的表大小(G)
export.table.splitConditionSize=5
# 导出时带lob字段大表拆分的个数
export.lobTable.splitCount=5
# 导出时触发带lob字段大表拆分的行数
export.lobTable.splitConditionCount=1000000
# 导出时触发带lob字段大表拆分的表大小(G)
export.lobTable.splitConditionSize=5
# 使用jdbc导出时每个csv文件的最大行数
export.jdbc.thresholdForSplittingFileLines=5000000
# 使用jdbc导出时每个csv文件的最大大小(M)
export.jdbc.thresholdForSplittingFileSize=3072
# #yasldr More References: http://doc.yashandb.com/yashandb/22.2/zh/%E5%B7%A5%E5%85%B7%E6%89%8B%E5%86%8C/yasldr/yasldr%E4%BD%BF%E7%94%A8%E6%8C%87%E5%AF%BC.html
# yasldr导入时的并行度
import.degree_of_parallelism=16
# yasldr导入时每批次的CSV数据行数
import.batch_size=2048
# yasldr导入方式,包括BASIC方式和BATCH方式
import.mode=BATCH
import.SENDERS=7 import.CSV_CHUNK_SIZE=128#校验=====# 校验任务限制每个数据源支持的最大连接数
checkTask.datasource.max-connection=500
# 校验任务获取连接超时时间,单位:ms
checkTask.datasource.connection-timeout=10000
# 校验任务获取的连接池中维持的最小连接数
checkTask.datasource.minimum-idle=0
# 校验任务的最大并行任务数
checkTask.task.parallel.max-num=20
# 校验任务的子任务的最大并行任务数,即一个任务多少个表在同时校验
checkTask.subTask.parallel.max-num=200
# 校验任务的全量校验对FLOAT数据类型的校验精度
checkTask.checkFloatPrecision=6
# 校验任务的数据类型映射有一边是char数据类型就移除数据右侧空格进行对比 checkTask.isRemoveCharBlank=true

4.2.3 执行安装

我这里采用的是安装默认内置库和OCI客户端并启动YMP

更改内置库SYS用户默认密码(可选)

进入安装目录执行更改密码命令,以yasdb_123为例:

$ cd /home/ymp/yashan-migrate-platform/ $ sh bin/ymp.sh password --sys yasdb_123# 进入安装目录执行安装命令
$ cd /home/ymp/yashan-migrate-platform/ $ sh bin/ymp.sh install --db /home/ymp/yashandb-personal-23.2.1.100-linux-x86_64.tar.gz --path /home/ymp/instantclient_19_19

4.2.4 查看运行状态

$ cd /home/ymp/yashan-migrate-platform/ [ymp@localhost yashan-migrate-platform]$ sh bin/ymp.sh statusYMP is running, pid is 240743.
Built-in database is used, pid is 240616. [ymp@localhost yashan-migrate-platform]$

4.2.5 查看版本

[ymp@localhost yashan-migrate-platform]$ sh bin/ymp.sh -v
Yashan-migrate-platform version: Release v23.2.1.0
YashanDB SQL Personal Edition Release 23.2.1.100 x86_64
YashanDB Loader Personal Edition Release 23.2.1.100 x86_64 2d13f1d [ymp@localhost yashan-migrate-platform]$

4.2.6 访问YMP

访问方式:http://IP:PORT/,PORT默认8090,初始账户名和密码是(admin/admin)。首次登录会提示修改密码。

4.3卸载

$ cd /home/ymp/yashan-migrate-platform/ $ sh bin/ymp.sh uninstall# 使用uninstall功能时可携带-f参数,强制清理环境 $ sh bin/ymp.sh uninstall -f# 验证
$ ps -ef | grep yas ymp 20840 6322 0 10:02 pts/14 00:00:00 grep --color=auto yas
  • 卸载YMP时,会删除默认内置库(自定义内置库不受影响)并清空db和yashan_client文件夹,若想替换数据库版本,请在卸载后重新部署。

  • 强制清理功能会使用kill -9强制清理当前用户下YMP启动的所有进程,并删除内置库及yasldr文件夹下所有内容,请谨慎使用,建议在专用的YMP用户下使用。

  • 最后还需要手动删除~/.bashrc中与YashanDB有关的环境变量。

4.4启动与停止

4.4.1 启动YMP

默认内置库启动YMP:

 $ cd /home/ymp/yashan-migrate-platform/$ sh bin/ymp.sh start

自定义内置库启动YMP:

 $ cd /home/ymp/yashan-migrate-platform/$ sh bin/ymp.sh startnodb

4.4.2 停止YMP

默认内置库停止YMP:

 $ cd /home/ymp/yashan-migrate-platform/$ sh bin/ymp.sh stop

自定义内置库停止YMP:

 $ cd /home/ymp/yashan-migrate-platform/$ sh bin/ymp.sh stopnodb

4.4.3 重启YMP

默认内置库重启YMP:

 $ cd /home/ymp/yashan-migrate-platform/$ sh bin/ymp.sh restart

自定义内置库重启YMP:

 $ cd /home/ymp/yashan-migrate-platform/$ sh bin/ymp.sh restartnodb

Caution:

在任务运行过程中停止或重启YMP会造成当前阶段任务运行失败,需重新开始当前阶段任务。

五、数据迁移

5.1创建数据源

5.1.1 创建Oracle数据库数据源并测试

5.1.2 创建YashanDB数据库数据源并测试

5.2创建迁移任务

5.3评估迁移

评估完成结果如下:

5.4迁移配置

评估迁移完毕后点击下一步迁移配置:

评估兼容非百分百的话需要在对象浏览里将所有不兼容数据进行过滤,选择忽略,然后点击重新刷新报告。

迁移对象可以根据实际情况进行选择。

点击下一步开始数据迁移。

5.5开始迁移

迁移完毕后结果如下:

可以发现有一部分数据没有迁移成功。

5.6一致性校验

六、遇到的问题与解决过程

6.1遇到的问题

安装过程中使用了外置库,然后外置库和目标业务库是同一套数据,导致各种冲突现象,具体如下:

1.评估缓慢,不完全兼容的情况下忽略不兼容对象,刷下兼容报告时会报如下错误。

2.目标库数据源老提示账户锁定,反复解锁,反复锁定。

3.过段时间提示用户名或密码无效,新创建用户后进行了dba授权,过一会会被系统自动删除。

6.2解决过程

1.将YMP单独部署在一台服务器上,使用默认内置库。

2.修改默认内置库为外置库,外置库不能和目标迁移数据库是一个实例。

在此特别感谢崖山官方的李梦莹大拿,凌晨0:30帮我把问题解决了


小崖有话说🤩
历时一个月的【迁移体验官】活动已圆满收官~小伙伴们提到的大部分问题已得到了修复,最新的版本崖山迁移平台YMP已挂网。(下载链接👉https://download.yashandb.com/download)
此外,新的征文活动已开启,可点击此处进行跳转,欢迎小伙伴们体验后继续提出宝贵的反馈和建议~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue前端项目实战案例】之Vue仿饿了么App

本文将介绍一款仿“饿了么”商家页面的App。该案例是基于 Vue2.0 Vue Router webpack ES6 等技术栈实现的一款外卖类App,适合初学者进行学习。 项目源码下载链接在文章末尾 1 项目概述 该项目是一款仿“饿了么”商家页面的外卖类App,主要有以下功能…

51单片机嵌入式开发:17、STC89C52的嵌入式 遥控器 控制步进电机 转速 和 转向 操作并 printf打印信息

51单片机嵌入式开发 STC89C52的嵌入式 遥控器 控制步进电机 转速 和 转向 操作并 printf打印信息 51单片机嵌入式开发STC89C52的嵌入式 遥控器 控制步进电机 转速 和 转向 操作并 printf打印信息1 概述2 硬件电路2.1 遥控器2.2 红外接收器电路2.3 STC89C52单片机电路2.4 数码管…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置4.编写测试类Entity层Mapper接口MapperXML文件测试类 5.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是: 2.3.…

IDEA Maven使用HTTP代理,解决Could not transfer artifact org.xxx问题

文章目录 一、前言二、遇到问题三、分析问题四、HTTP代理五、重新编译验证 一、前言 遇到这个问题,有两种解决办法 IDEA Maven使用HTTP代理,解决Could not transfer artifact org.xxx问题IDEA Maven使用国内镜像,解决Could not transfer arti…

C语言分支语句之if的一些用法

目录 引言C语言结构 1. if 语句1.1 if1.2 else 2. 分支中包含多条语句3. 多重选择 else if4. 嵌套if5. 悬空else / else与if配对问题 引言 C语言作为一种非常常用的编程语言,具有灵活强大的循环和分支结构。循环结构允许我们重复执行一段代码,而分支结构…

【网络爬虫技术】(1·绪论)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀网络爬虫开发技术入门_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …

本地部署Graphhopper路径规划服务(graphhopper.sh启动版)

文章目录 文章参考源码获取一、配置Java环境变量二、配置Maven环境变量三、构建graphhopper步骤1. 下载数据2. 配置graphhopper配置文件config-example.yml3. 在项目中启动命令行执行./graphhopper.sh build3.1|、遇到的问题3.1.1、pom.xml中front-maven-plugin-无法下载npm6.1…

跨境电商独立站:Shopify/Wordpress/店匠选哪个?

在面对不断增加的平台运营压力时,不少跨境电商的商家逐渐将注意力转向建立自己的独立站。据《中国跨境出口电商发展报告(2022)》所示,中国拥有的独立站数量在2022年已接近20万个,这表明独立站已成为卖家拓展海外市场的…

昇思25天学习打卡营第11天|xiaoyushao

今天分享ResNet50迁移学习。 在实际应用场景中,由于训练数据集不足,所以很少有人会从头开始训练整个网络。普遍的做法是,在一个非常大的基础数据集上训练得到一个预训练模型,然后使用该模型来初始化网络的权重参数或作为固定特征提…

苦学Opencv的第十一天:图像的形态学操作

Python OpenCV从入门到精通学习日记:图像的形态学操作 前言 图像形态学是图像处理中的一个重要分支,主要关注图像中物体的形状和结构。通过形态学操作,我们可以对图像进行有效的分析和处理,例如图像的腐蚀与膨胀、开运算与闭运算…

大模型学习笔记十四:Agent模型微调

文章目录 一、大模型需要Agent技术的原因二、Prompt Engineering可以实现Agent吗?(1)ReAct原理展示和代码(2)ModelScope(3)AutoGPT(4)ToolLLaMA 三、既然AutoGPT可以满足…

利用OSMnx求路网最短路径并可视化(二)

书接上回,为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化,我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图,并特别高亮显示计算出的最短路径。 多起终点最短路路径并计算距离和时间 完整代码#运行环境 P…

C++——QT:保姆级教程,从下载到安装到用QT写出第一个程序

登录官网,在官网选择合适的qt版本进行下载 这里选择5.12.9版本 点击exe文件下载,因为服务器在国外,国内不支持,所以可以从我的网盘下载 链接: https://pan.baidu.com/s/1XMILFS1uHTenH3mH_VlPLw 提取码: 1567 --来自百度网盘超级…

Linux--网络基础

目录 1.计算机网络背景 2. 初识协议 2.1概念 2.2 协议分层 2.3OSI 七层模型 2.4TCP/IP 五层(或四层)模型 3.再识协议 3.1为什么要有 TCP/IP 协议? 3.2什么是 TCP/IP 协议? 3.3TCP/IP 协议与操作系统的关系(宏观上, 怎么实现的) 3.…

一键解锁:科研服务器性能匹配秘籍,选择性能精准匹配科研任务和计算需求的服务器

一键解锁:科研服务器性能匹配秘籍 HPC科研工作站服务器集群细分领域迷途小书童 专注于HPC科研服务器细分领域kyfwq001 🎯在当今科技飞速发展的时代,科研工作对计算资源的需求日益增长😜。选择性能精准匹配科研任务和计算需求的服…

HarmonyOS和OpenHarmony区别联系

前言 相信我们在刚开始接触鸿蒙开发的时候经常看到HarmonyOS和OpenHarmony频繁的出现在文章和文档之中,那么这两个名词分别是什么意思,他们之间又有什么联系呢?本文将通过现有的文章和网站内容并与Google的AOSP和Android做对比,带…

助力樱桃智能自动化采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建果园种植采摘场景下樱桃成熟度智能检测识别系统

随着科技的飞速发展,人工智能(AI)技术已经渗透到我们生活的方方面面,从智能家居到自动驾驶,再到医疗健康,其影响力无处不在。然而,当我们把目光转向中国的农业领域时,一个令人惊讶的…

python-NLP:2词性标注与命名实体识别

文章目录 词性标注命名实体识别时间命名实体(规则方法)CRF 命名实体识别方法 词性标注 词性是词汇基本的语法属性,通常也称为词类。词性标注是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程。例如,表示…

【React】详解“最新”和“最热”切换与排序

文章目录 一、基本概念和初始化二、切换与排序功能的实现1. 函数定义和参数2. 设置活动 Tab3. 定义新列表变量4. 根据排序类型处理列表4.1 按时间降序排序4.2 按点赞数降序排序 5. 更新评论列表 三、渲染导航 Tab 和评论列表1. map 方法2. key 属性3. className 动态赋值4. onC…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别:Hash为默认模式,url中包含一个#符号的哈希部分。优势:兼容性好,不需要后端服务器的特殊配置。缺点:不够美观,搜索引擎优化较差。History模式使用的浏览器的His…