一、GIS迁移步骤
金仓数据库支持的源库有Oracle和Postgresql。
下面介绍ArcGIS或GeoScene的数据迁移步骤。
1、迁移准备
本次使用Linux X86平台,需要准备Kingbase-Server-Linux-x86_67.tar和postgis_libs.tar包
1.1 在 Kingbase 数据库上操作:
tar-xvfkingbase-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-Usystem-Ddata;vimkingbase.conf ./sys_ctl-Ddata start ./ksql-Usystem-p54321testcreate 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;setexclude_reserved_words='level';create extension postgis_topology;create extension address_standardizer;create extension address_standardizer_data_us;selectoid, proname, proargtypes, proisstrict from sys_proc where proname ilike'%addgeometrycolumn%';## update sys_proc set proisstrict = false where oid = 上一条 sql 的 oidupdate sys_procsetproisstrict=falsewhere oid=16705;1.2 完成医以上步骤后,执行测试
./pgsql2shp-f/home/gpadmin/kes/v9/Server/test2.shp-usystem-p54321test"select * from test.sde.dltb21.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.sh4、迁移后注册数据
这两个平台的数据迁移后,需要注册才能正常使用。
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 ServerSQL Server2016或更高版本支持设置 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:5conf/kb-thread-config.xml
<!-- 大对象数据(Clob 和 Blob)写线程池 --><poolname="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:true2.8 国际化
kdts-plus/bin/startup.sh(删除行首的 # 可去掉注释)
JAVA_OPT="${JAVA_OPT}-Duser.country=CN -Duser.language=zh"kdts-plus/bin/startup.bat(删除行首的 rem 可去掉注释)
remset"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 tomakeprotected void java.net.URLClassLoader.addURL(java.net.URL)accessible: module java.base does not ” opens java.net” to unnamed module @6e0dec4a – 造成原因: 从错误的提示可以分析是 java.base 包没有开放到任意模块下,而模块又通过反射使用了一些包内的属性值,这样的操作是不被允许的。这种情况一般在使用高于 Java8版本的 JDK 时会出现,大多情况是 OpenJDK 出现,原因是在 Java9及之后的版本对源码进行了模块化重构,public 不再意味着完全开放,而是使用了export的机制来更细粒度地控制可见性。 – 解决方案: 添加 JVM 参数:--add-opens java.base/java.net=ALL-UNNAMED