如何在 PostgreSQL 單使用者模式下初始化 PostGIS 數據庫?
我通過帶有 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 不受支持的模式下執行,具有過時的單使用者上下文。