遷移 PostGIS 的問題
我需要將 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
升級成功。