Postgresql

如何在 PostgreSQL 單使用者模式下初始化 PostGIS 數據庫?

  • July 6, 2018

我通過帶有 EPEL 的 CentOS 7 上可用的標準包將 PostgreSQL 9.2.15 與 PostGIS 2.0.7 一起使用。

我有一個伺服器腳本來自動設置 PostGIS 數據庫,首先執行initdb,然後使用postgres --single創建一個帶有 PostGIS 副檔名的新數據庫。這大致是這樣的:

initdb -D ...

postgres --single -D ... postgres <<'EOF'
   CREATE DATABASE mydb;
EOF

postgres --single -D ... mydb <<'EOF'
   CREATE EXTENSION postgis;
EOF

但是,最後一個命令會產生以下奇怪的錯誤消息:

ERROR:  type reclassarg[] does not exist
STATEMENT:  CREATE EXTENSION postgis;

如果我改為執行數據庫伺服器並CREATE EXTENSION postgis通過執行sql,一切正常:

postgres -D ... &

# Wait until service it up and running

psql mydb <<'EOF'
   CREATE EXTENSION postgis;
EOF

但這不適用於數據庫初始化腳本。

那麼如何在 PostgreSQL 單使用者模式下初始化 PostGIS 數據庫呢?

更新:關於該主題的 pgsql-bugs 郵件列表中有 一個執行緒,但這並不能回答我的問題。它只是說明不打算改進 PostgreSQL 的單使用者模式。所以總會缺少 PgSQL 語言特性來執行目前的 PostGIS 擴展創建腳本。但是,大多數其他 PostgreSQL 擴展可以安裝在單使用者模式下就好了。因此,也許有一種方法可以重新制定 PostGIS 創建腳本,這樣它就可以在不需要這些語言功能的情況下實現相同的目標,即使其“更便攜”。

(這個問題最初出現在 StackExchange/GIS 上:https ://gis.stackexchange.com/q/214449/82644 )

以前有人在列表中問過一個非常相似的問題。無論如何,正如執行緒中所說,reclassarg是一種複合類型。

RhodiumToad:Guest78493:在單使用者中,做 CREATE TYPE … AS …; 不創建數組類型

RhodiumToad:Guest78493:它只創建非數組的,但我還不知道為什麼

RhodiumToad:Guest78493:所以現在,任何具有 CREATE TYPE AS 的擴展都不會在單使用者中正確載入

RhodiumToad:Guest78493:可以說,如果它不起作用,它應該出錯而不是悄悄地出錯,所以我認為你有理由稱它為 postgres 錯誤

此外,來自湯姆·萊恩本人!

> > $$ Can’t create postgis extension in single-user mode $$ >

為什麼你會認為這是一件好事?

單使用者模式是一種幾乎沒有記錄的災難恢復輔助工具。它不適用於日常活動。 您希望在單使用者模式下關閉很多行為。

這不起作用的具體原因是heap_create_with_catalog中的這個位:

/*
 * Decide whether to create an array type over the relation's rowtype. We
 * do not create any array types for system catalogs (ie, those made
 * during initdb). We do not create them where the use of a relation as
 * such is an implementation detail: toast tables, sequences and indexes.
 */
if (IsUnderPostmaster && (relkind == RELKIND_RELATION ||
                          relkind == RELKIND_VIEW ||
                          relkind == RELKIND_MATVIEW ||
                          relkind == RELKIND_FOREIGN_TABLE ||
                          relkind == RELKIND_COMPOSITE_TYPE))
    new_array_oid = AssignTypeArrayOid();

我們可能會開發一些其他機制來檢測我們是否在 initdb 序列中,但我不會因為將其視為錯誤而感到興奮。自 90 年代初以來,單使用者模式就沒有被視為標準使用者環境。

如果是您,請在以後更新我們,並在您從馬口中得到消息時自行回答您的問題。

更新。

因此,也許有一種方法可以重新制定 PostGIS 創建腳本,這樣它就可以在不需要這些語言功能的情況下實現相同的目標,即使其“更便攜”。

不,那裡沒有。ST_Reclass需要它。不支持您使用的方法。初始化數據庫目前被視為與初始化數據庫不同的事情CREATE EXTENSION。我不認為 PostgreSQL 打算-single以這種方式使用,當然 PostGIS 也不打算重寫工作程式碼,因此它在 PostgreSQL 不受支持的模式下執行,具有過時的單使用者上下文。

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