Migration

遷移 PostGIS 的問題

  • June 19, 2019

我需要將 Postgres 9.3 + PostGIS 2.1 遷移到 Postgres 10。我使用的是 CentOS 7.X

使用 pg_upgrade 應該很簡單,但問題是 PostGIS。Postgres 9.3 有 PostGIS 2.1,而 Postgres 10 有 PostGis 2.4.4。所以我為 Postgres 9.3 編譯了 PostGIS 2.4 並安裝了它。然後對於每個數據庫,我做了:

ALTER EXTENSION postgis UPDATE;

通過這種方式,我已經遷移到 PostGIS 2.4。

但是當我執行時pg_upgrade,我收到此錯誤:

無法訪問文件«$libdir/postgis-2.1»:該文件或目錄不存在。

如果我這樣做:

cd /usr/pgsql-10/lib/
ln -s postgis-2.4.so postgis-2.1.so

它也不起作用,因為如果我再跑pg_ugrade一次:

pg_restore: creating FUNCTION "public.geomfromewkb("bytea")"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 547; 1255 90291 FUNCTION geomfromewkb("bytea") ema
pg_restore: [archiver (db)] could not execute query: ERROR:  could not find function "LWGEOMFromWKB" in file "/usr/pgsql-10/lib/postgis-2.1.so"<br>
    Command was: CREATE FUNCTION "public"."geomfromewkb"("bytea") RETURNS "public"."geometry"
     LANGUAGE "c" IMMUTABLE STRICT
     AS '$libdir/postgis-2.1', 'LWGEOMFromWKB';

為什麼 Postgres 9.3 在遷移到 2.4 後會引用 PostGIS 2.1?

我看到的另一個選項是為 Postgres 10 編譯 PosGIS 2.1。

更新 1

在閱讀了這篇技巧之後,我已經完成了我已經完成的每個數據庫:

psql mydb -c 'ALTER EXTENSION postgis UPDATE;' psql mydb -c 'ALTER EXTENSION postgis_topology UPDATE;' psql mydb -f /usr/pgsql-9.3/share/contrib/postgis-2.1/uninstall_legacy.sql psql mydb -f /usr/pgsql-9.3/share/contrib/postgis-2.4/legacy.sql 結果相同。

SELECT probin, COUNT(*) FROM pg_catalog.pg_proc WHERE probin LIKE '%/postgis%' GROUP BY probin ORDER BY probin;

返回:

      probin        | count 
---------------------+-------
$libdir/postgis-2.1 |   373

更新 2

指南解釋了 PostGIS 遷移的內部結構。

顯然,PostGIS 告訴它遷移擴展,但不應用遷移腳本來更改過程。

問題是我忘記遷移模板數據庫。之後pg_upgrade升級成功。

引用自:https://dba.stackexchange.com/questions/218959