我正在尽力将空间数据库从Oracle迁移到Postgresql,但失败了。
我尝试了许多不同的途径,正如您从上一个问题在这里看到的那样,没有一个起作用。有人可以告诉我这样做的一种相对轻松的方式,因为我对此一无所知。
我曾尝试使用第三方软件(例如SwisSQL),但失败并出现许多错误。我试过创建充满insert语句的文件,然后创建一个C#程序来解析这些文件,并用相关的postgis替换oracle空间类型,但由于这些文件的绝对大小,最基本的替换由于内存不足异常而失败。其中一些表中有超过200万条记录,因此您可以想象每个文件包含插入的文件的大小。
我为此迫切需要解决方案,因为它严重阻碍了该项目的进展。我需要Postgresql中的数据,因为我正在编写需要与数据库无关的软件,这意味着必须对每个数据库上的真实数据进行测试。
任何想法都会张开双臂受到欢迎。如果不是从空间角度考虑的话,它会简单得多,并且很可能到现在为止。
编辑:
这里是Toad为Oracle生产的用于说明数据复杂性的插入示例。
Insert into CLUSTER_1000M
(CLUSTER_ID, CELL_GEOM, CELL_CENTROID)
Values
(4410925,
"MDSYS"."SDO_GEOMETRY"(2003,81989,NULL,
"MDSYS"."SDO_ELEM_INFO_ARRAY"(1,1003,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
"MDSYS"."SDO_ORDINATE_ARRAY"(80000,103280,81000,104280,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)),
"MDSYS"."SDO_GEOMETRY"(2001,81989,
"MDSYS"."SDO_POINT_TYPE"(80500,103780,NULL),NULL,NULL));
[有两种流行的选择:开源ogr2ogr
或Safe Software的商业产品。
这是我要采用的ogr2ogr
解决方案。
首先,您需要正确的工具:GDAL/OGR。如果您使用的是Unix,请使用正确的库进行编译以获得Oracle支持(默认情况下未启用)。但是我假设您使用的是Windows。获取开源地理空间工具的最简单方法是使用OSGeo4W。要启用Oracle对GDAL / OGR的支持,还需要使用“高级安装”模式在setup.exe中选择gdal-oracle10g
软件包。有关Oracle软件包的更多信息位于this page,请注意,您还需要提供非免费的OCI.DLL
。工作时,您应该看到驱动程序名称显示为ogr2ogr --formats
。
您从OSGeo4W Shell获得的基本命令应类似于:
ogr2ogr -f "PostgreSQL" PG:"host=localhost user=someuser dbname=somedb password=password port=5432" OCI:someuser/password layername
这里有关于GDAL / OGR的更多信息:
接受的解决方案对我不起作用。
使用OSGeo4W安装GDAL / OGR,并在“高级安装”模式下选择gdal-oracle10g。
然后执行此命令:
ogr2ogr
-a_srs {{SRS}}
-overwrite -f
"PostgreSQL"
-nln {{POSTGIS SCHEMA}}.{{POSTGIS TABLE}}
PG:"
host='{{POSTGIS HOST}}'
port='{{POSTGIS PORT}}'
user='{{POSTGIS USER}}'
password='{{POSTGIS PASSWORD}}'
dbname='{{POSTGIS DATABASE}}'"
OCI:"{{ORACLE USER}}/{{ORACLE PASSWORD}}
@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = {{ORACLE HOST}})
(PORT = {{ORACLE PORT}})))
(CONNECT_DATA = (SID = {{ORACLE SID}})))
:{{ORACLE SCHEMA}}.{{ORACLE TABLE}}"
用您的值替换{{}}项!
您需要为每个表执行此操作。有一个电子表格可以为您生成这些命令:
http://gis-expert.com/wp/2018/09/12/how-to-migrate-spatial-data-from-oracle-to-postgis/