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