将数据库从 PostgreSQL 8.3.8 + PostGIS 1.3.5 更新至 PostgreSQL 10.1 + PostGIS 2.4

将数据库从 PostgreSQL 8.3.8 + PostGIS 1.3.5 更新至 PostgreSQL 10.1 + PostGIS 2.4

我继承了一台旧服务器(Ubuntu 12.04.5),其数据库运行在 PostgreSQL 8.3.8 上,并安装了 PostGIS 1.3.5 扩展。这台服务器将被一台新服务器(4.14.12-1-ARCH)取代,我使用 docker 来分离不同的 PostgreSQL 实例。第一次测试运行我使用了mdillon/postgis:最新图像以创建新设置。这应该会导致 PostgreSQL 10.1 + PostGIS 2.4。

当我尝试在新服务器上恢复旧数据库的转储时,出现很多如下错误:

...
pg_restore: creating FUNCTION "public.st_box2d_in(cstring)"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 626; 1255 1052513 FUNCTION st_box2d_in(cstring) postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  could not access file "/usr/lib/postgresql/8.3/lib/liblwgeom": No such file or directory
    Command was: CREATE FUNCTION st_box2d_in(cstring) RETURNS box2d
    LANGUAGE c IMMUTABLE STRICT
    AS '/usr/lib/postgresql/8.3/lib/liblwgeom', 'BOX2DFLOAT4_in';
pg_restore: creating FUNCTION "public.st_box2d_out(box2d)"
pg_restore: [archiver (db)] Error from TOC entry 628; 1255 1052515 FUNCTION st_box2d_out(box2d) postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  could not access file "/usr/lib/postgresql/8.3/lib/liblwgeom": No such file or directory
    Command was: CREATE FUNCTION st_box2d_out(box2d) RETURNS cstring
    LANGUAGE c IMMUTABLE STRICT
    AS '/usr/lib/postgresql/8.3/lib/liblwgeom', 'BOX2DFLOAT4_out';
pg_restore: creating TYPE "public.box2d"
pg_restore: [archiver (db)] Error from TOC entry 2331; 1247 1052511 TYPE box2d postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  function st_box2d_in(cstring) does not exist
    Command was: CREATE TYPE box2d (
    INTERNALLENGTH = 16,
    INPUT = st_box2d_in,
    OUTPUT = st_box2d_out,
    ALIGNMENT = int4,
    STORAGE = plain
);
...

旧数据库需要一些库,而新版 Postgres-Postgis 不再提供这些库。处理这个问题的最佳方法是什么?

由于我使用的是 docker,我可能只需创建一个包含旧软件的容器并使其保持运行而无需接触数据库。数据库仅在内部使用:这里没有安全问题。另一方面,我想使用新的 Postgres-Postgis 版本来为未来做好更好的准备。但实际上有可能对数据库及其功能进行更新吗?

处理这个问题的最好方法是什么?

相关内容