具有自定義時區目錄的 Postgres initdb
如何
initdb
使用自定義時區文件夾執行 Postgres?我嘗試使用
-L
flag 和PGSHAREDIR
env var 來控制 initdb 搜尋 Postgres 共享數據的位置。但是,這些選項似乎無法控制 Postgres 如何找到時區文件夾。# CUSTOM_PG is a directory containing a complete, extracted # installation of Postgres. CUSTOM_PG=/my-custom-pg PGSHAREDIR="$CUSTOM_PG/share/postgresql" \ DYLD_LIBRARY_PATH="$CUSTOM_PG/lib" $CUSTOM_PG/bin/initdb \ --pgdata /tmp/my-data \ --username=joe \ --debug \ -L "$CUSTOM_PG/share/postgresql"
完整上下文:我正在使用 Bazel 執行 Postgres,我想使用 Bazel 管理 Postgres 的所有依賴項。來自 Homebrew 的 Postgres 安裝在 /opt/homebrew/share/postgresql/timezone (不在 Bazel 的控制範圍內)中搜尋時區數據,我不知道如何將時區目錄覆蓋到由 Bazel 管理的目錄.
這是上面 initdb 呼叫的相關日誌:
creating directory /tmp/my-data ... ok creating subdirectories ... ok selecting dynamic shared memory implementation ... posix selecting default max_connections ... 20 selecting default shared_buffers ... 400kB selecting default time zone ... America/Los_Angeles creating configuration files ... ok running bootstrap script ... 2021-11-23 01:56:52.567 [18352] LOG: could not open directory "/opt/homebrew/share/postgresql/timezone": No such file or directory INFO pginit/cluster.go:478 [postgres] invalid value for parameter "log_timezone": "UTC" [18352] LOG: could not open directory "/opt/homebrew/share/postgresql/timezone": No such file or directory [18352] LOG: invalid value for parameter "TimeZone": "UTC" [18352] FATAL: configuration file "/var/folders/sb/f9x1r1p13/T/test-cluster-3607517384/postgresql.conf" contains errors
看起來 initdb 在創建預設配置文件後啟動了一個 Postgres 程序(PID 為 18352)。啟動的過程似乎沒有使用 PGSHAREDATA 來定位時區文件夾。
相關資源:
- pgsql-bugs #4344 initdb -L timezone directory:2008 年關於為時區文件夾設置自定義位置的錯誤。Tom Lane 提到這
-L
可能是錯誤的方法和可能有效的提示PGSHAREDIR
。Peter Eisentraut 證實,這-L
只是為了遺留原因而存在。這是我上面問過的同一個問題。
您不能在
initdb
. 時區文件的位置被編譯到 PostgreSQL 中,只有在配置和建構 PostgreSQL 時才能更改。請參閱文件:
--with-system-tzdata=***DIRECTORY***
PostgreSQL 包括它自己的時區數據庫,它需要日期和時間操作。這個時區數據庫其實是兼容FreeBSD、Linux、Solaris等很多作業系統提供的IANA時區數據庫的,所以重新安裝就顯得多餘了。使用此選項時,將使用系統提供的時區數據庫,
***DIRECTORY***
而不是 PostgreSQL 原始碼分發中包含的時區數據庫。***DIRECTORY***
必須指定為絕對路徑。/usr/share/zoneinfo
可能是某些作業系統上的目錄。請注意,安裝常式不會檢測不匹配或錯誤的時區數據。如果您使用此選項,建議您執行回歸測試以驗證您所指向的時區數據在 PostgreSQL 中是否正常工作。您可以檢查您的 PostgreSQL 是如何建構的
pg_config --configure
如果未使用該選項,PostgreSQL 將使用其自己的時區數據庫,位於 中
SHAREDIR
,您可以使用pg_config --sharedir
的
-L
選項initdb
指定將在何處initdb
查找postgres.bki
、pg_hba.conf.sample
、pg_ident.conf.sample
、postgresql.conf.sample
、snowball_create.sql
、information_schema.sql
、sql_features.txt
、system_constraints.sql
和。system_functions.sql``system_views.sql
您誤讀了 pgsql-bugs 執行緒:在
initdb
. 這也是硬連線。