当前位置: 首页 > news >正文

4.GIS迁移步骤+注意事项+部署常见问题

一、GIS迁移步骤

​ 金仓数据库支持的源库有Oracle和Postgresql。

​ 下面介绍ArcGIS或GeoScene的数据迁移步骤。

1、迁移准备

​ 本次使用Linux X86平台,需要准备Kingbase-Server-Linux-x86_67.tar和postgis_libs.tar包

1.1 在 Kingbase 数据库上操作:

tar -xvf kingbase-server-linux-x86_64.tar# 若数据库目录(lib、bin、extension)下已有 postgis 相关的包, 则不需要再拷贝
cp /home/kingbase/20220105/lib/postgis_libs/* /home/kingbase/20220105/lib/
cp /home/kingbase/20220105/postgis-3.1.2/bin/* /home/kingbase/20220105/bin/
cp /home/kingbase/20220105/postgis-3.1.2/lib/* /home/kingbase/20220105/lib/
cp /home/kingbase/20220105/postgis-3.1.2/share/extension/* /home/kingbase/20220105/share/extension/
./initdb -U system -D data;
vim kingbase.conf
./sys_ctl -D data start
./ksql -Usystem -p54321 test
create user sde superuser;
create schema sde;
alter schema sde owner to sde;
alter user sde password '123456';
create user rds_superuser superuser ;
alter user rds_superuser password '123456';
create database kingbase;
create extension postgis;
create extension postgis_raster;
create extension postgis_sfcgal;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
set exclude_reserved_words = 'level';
create extension postgis_topology;
create extension address_standardizer;
create extension address_standardizer_data_us;
select oid, proname, proargtypes, proisstrict from sys_proc where proname ilike '%addgeometrycolumn%';
## update sys_proc set proisstrict = false where oid = 上一条 sql 的 oid
update sys_proc set proisstrict = false where oid = 16705;

1.2 完成医以上步骤后,执行测试

./pgsql2shp -f /home/gpadmin/kes/v9/Server/test2.shp -u system -p 54321 test "select * from test.sde.dltb2

1.3 打开ArcMap软件,建库

1.4 在ArcMap软件,启动Kingbase地理信息数据库(不可省略)

2、kdts配置迁移任务

本次实验源库使用Oracle 11g,KDTS的SHELL版本为例来完成迁移任务。

  • 编辑applicatiom.yml文件,将Active:Oracle

  • 编辑conf/kdts-oracle.yml文件,编写源库,并编辑要迁移的表(point、line、polygont):

    sources:
    - dbType: oracle
    dbVersion: 11g
    url: jdbc:oracle:thin:@ip:port/dbName
    driver-class-name: oracle.jdbc.oracleDriver
    username: SDE
    password: password
    schemas: SDE
    talbe-includes: POINT,LINE,POLYGONT
    

    温馨提示:Oracle需要用SDE用户否则权限不足。

  • 编辑目标库信息

    target:
    dbType: KINGBASE
    dbVersion: V9
    url: jdbc:kingbase8://ip:port/dbName
    driver-class-name: com.kingbase8.Driver
    username: SDE
    password: password
    schemas: SDE
    
  • 编辑数据类型映射文件,将Oracle的numeric(38,0)类型映射为Kingbase的int类型。

  • 编辑conf/mapping_rule/data_type/oracle_to_kingbase.json 文件,增加以下内容:

    {"sourceType": {"name": "NUMBER","precisionMin": 0,"precisionMax": 38,"scaleMin": 0,"scaleMax": 0},"targetType": {"name": "int"}
    }
    

3、执行迁移任务

./bin/startup.sh

4、迁移后注册数据

这两个平台的数据迁移后,需要注册才能正常使用。

4.1 迁移后,将…/SDE/AcrpyRegisterScript/目录下acrpyRegisterWithGeodatabase.py文件拷贝到ArcGIS所在的机器上,放到如:”c:/python27/ArcGIS10.0” 目录下

4.2 查看ArcMap 的 kingbase 数据库连接信息,并拷贝。

4.3 编辑 acrpyRegisterWithGeodatabase.py 文件,将上一步复制的内容粘贴到以下位置,保存文件。

4.4 执行 acrpyRegisterWithGeodatabase.py 脚本,将表注册到 ArcGIS 地理信息库

4.5 执行完成后使用 ArcMap 软件进行验证,能否正常显示图层信息。

二、注意事项

1、BS版

  • 源端数据库类型为 MySQL5.1 版本时,数据库版本选择 5.5
  • KingbaseES 数据库采用 Unix Domain Socket 方式进行连接时,必须确保数据库服务与迁移工具程序在同一台Linux 服务器上

2、SHELL版

2.1 迁移顺序

	由于对象之间存在依赖关系,可按“1、序列;2、表结构、表数据、主键约束、索引、唯一性约束;3、外键约束;4、检查约束、视图、函数、存储过程、包;5、同义词;6、触发器;7、注释”这样的顺序进行迁移。

2.2 大表拆分

​ 迁移工具按表中的数据行数和大对象大小对表进行了排序,并对达到拆分阈值的大表进行了拆分(拆分操作仅读取表数据记录标识,不影响数据),然后按分块并行读取,这些操作依赖于数据库统计信息并需要对拆分操作进行授权,如果条件允许,可在迁移前对源数据库做数据统计分析和拆分授权。

  • 该机制仅针对 Oracle 和达梦数据库,其它数据库需手动拆分。
  • 对表的排序和拆分不影响迁移的结果,只影响效率。

2.3 并行计算

#SQL Server
SQL Server 2016 或更高版本支持设置 Max Degree of Parallellism(最大并行度配置),可使用如下命令来查
看:exec sp_configure;温馨提示: 建议该参数的值设置为 0(由数据库自动管理)或一个大于 0 的值(由数据库专家给定)。#DM8可开启并行查询来提高查询效率,详见数据库的 PARALLEL_POLICY、PARALLEL_THRD_NUM 、MAX_PARALLEL_DEGREE 等配置参数。保证数据库的 DBMS_STATS.GATHER_SCHEMA_STATS 可用,若报错” 错误的包或类名或当前环境不支持 [DBMS_STATS]”,说明该包未启用。可以通过达梦管理工具--> 工具包-->SYSTEM PACKAGE--> 右键--> 点击启用,开启服务。

2.4 集群异步模式

​ 目标库为集群模式时可将主从库的同步模式调整为异步,在主库数据迁移完成后等待从库追平后再恢复为同步模式。

2.5 大对急数据(LOB,Large Object)

​ 如果要迁移的表中有大对象数据字段(BLOB、BFILE、CLOB、NCLOB 等)时,应先评估大对象数据的大

小,如果单行数据的大小达到 100M 以上,为了避免内存溢出 (Out Of Memory) 导致迁移失败,应控制 Java 虚拟机内存的合理使用:

  • 条件允许可增大内存,详见:bin/startup.sh 和 startup.bat 中 JAVA_OPT 里的“-Xms 和-Xms”参数项

  • 控制大对象表的读/写并发度,确保读入内存的大对象数据在合理的范围,相关的参数有:conf/kdts-xxx.yml

# 源数据库含大对象数据表的游标读取记录数(同上,只是此参数针对有大对象字段的表)
table-with-large-object-fetch-size: 5
# 源数据库含大大对象数据表的游标读取记录数(同上,只是此参数针对大对象字段长度超过 1G 的表)
table-with-big-large-object-fetch-size: 5
# 大表拆分阈值行数(当表的行数超过此值时,将对表进行拆分,每块的记录数为此值和表总记录数除以“拆分最大块数”中的
最大值)
large-table-split-threshold-rows: 5000000
# 大表拆分阈值大小(单位为 M)(当表的数据大小(普通字段 + 大对象字段)超过此值时,将对表进行拆分)
large-table-split-threshold-size: 5000
# 大表拆分最大块数(每张表的最大拆分块数,应不超过总的读线程数)
large-table-split-max-chunk-num: 5

conf/kb-thread-config.xml

<!-- 大对象数据(Clob 和 Blob)写线程池 -->
<pool name="writeLargeObject">
<corePoolSize>5</corePoolSize><!-- 可根据源库表中大对象数据来设置,如果单条数据较大,可适当降低线程数,以避免
内存不足 -->
<maxPoolSize>5</maxPoolSize><!-- 和 corePoolSize 一致 -->
<keepAliveTime>300</keepAliveTime><!-- 保持不变 -->
<workQueueSize>5</workQueueSize><!-- 和 maxPoolSize 一致 -->
</pool>

应满足:(table-with-large-object-fetch-size + large-table-split-max-chunk-num + writeLargeObject.maxPoolSize+ writeLargeObject.workQueueSize)× 每行大数据大小 <= Java 虚拟机内存 ×0.9

2.6 网络抖动
2.7 无日志表

​ 无日志表不记录日志,可大大提高数据写入的效率,在需要时可设置以无日志表的方式进行迁移。

# 连接字符串,其中“ApplicationName=kingbase_transfer”指示数据库服务器使用无日志表
url: jdbc:kingbase8://1.2.3.4:54321/test?ApplicationName=kingbase_transfer #V8R3 和 V9 使用
# 是否使用无日志表
unlogged-table: true
# 是否将无日志表重改为有日志表
relogged-table: true
# 是否执行检查点
issue-checkpoint: true

2.8 国际化

  • kdts-plus/bin/startup.sh(删除行首的 # 可去掉注释)

    JAVA_OPT="${JAVA_OPT} -Duser.country=CN -Duser.language=zh"
    
  • kdts-plus/bin/startup.bat(删除行首的 rem 可去掉注释)

    rem set "JAVA_OPT=%JAVA_OPT% -Duser.country=CN -Duser.language=zh"
    

三、部署常见问题

#加载数据库驱动失败
– 错误特征:ERROR11028 --- [nio-8080-exec-3] com.kingbase.kdts.b.b : 加载数据库驱动 ORACLE 11g oracle.jdbc.OracleDriver 失败!java.lang.reflect.InaccessibleObjectException: Unable to make protected voidjava.net.URLClassLoader.addURL(java.net.URL) accessible: module java.base does not ”
opens java.net” to unnamed module @6e0dec4a– 造成原因:从错误的提示可以分析是 java.base 包没有开放到任意模块下,而模块又通过反射使用了一些包内的属性值,这样的操作是不被允许的。这种情况一般在使用高于 Java 8 版本的 JDK 时会出现,大多情况是 OpenJDK 出现,原因是在 Java 9 及之后的版本对源码进行了模块化重构,public 不再意味着完全开放,而是使用了 export 的机制来更细粒度地控制可见性。– 解决方案:
添加 JVM 参数:--add-opens java.base/java.net=ALL-UNNAMED

相关文章:

  • 欧拉定理:若 gcd(a,n)=1,则 a^φ(n)≡1(mod n)。
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月27日第90弹
  • 算力革命:RoCE实测推理时延比InfiniBand低30%的底层逻辑
  • [BUG记录]0X10 会话切换服务响应NRC 0x10
  • 2025年5月6日 飞猪Java一面
  • LittleFS 小型文件系统(一)
  • 实验四 ——序列检测器和序列发生器
  • CSS 中的transform详解
  • 树莓派超全系列教程文档--(50)如何查找树莓派的IP地址
  • 创建型模式之Abstract Factory(抽象工厂)
  • 基于AI的智能农业病虫害识别系统实战指南
  • 【笔记】解决ImportError: cannot import name ‘interp‘ from ‘scipy‘报错
  • 制作一款打飞机游戏59:子弹生成
  • Java Stream API 终止操作的详细解析
  • Python filter()函数详解:数据筛选的精密过滤器
  • 3.20 工程计价数字化与智能化
  • 【Redis】常用的数据类型 + 单线程模型
  • 改进yolo11模型学习
  • AI大模型学习三十、ubuntu安装comfyui
  • 让学习回归到技术上来(技术 !=== 死记硬背)
  • 重庆企业做网站/怎么做公司网页
  • 什么游戏可以赚钱真实可靠/家居seo整站优化方案
  • 凡科建站小程序制作/域名是什么意思
  • 房地产公司网站建设方案/竞价培训
  • 阳江市建设路龙源学校网站/如何创建自己的网址
  • 一个网站怎么做软件好用/谷歌app下载 安卓