Postgresql

具有自定義時區目錄的 Postgres initdb

  • November 23, 2021

如何initdb使用自定義時區文件夾執行 Postgres?

我嘗試使用-Lflag 和PGSHAREDIRenv 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.bkipg_hba.conf.samplepg_ident.conf.samplepostgresql.conf.samplesnowball_create.sqlinformation_schema.sqlsql_features.txtsystem_constraints.sql和。system_functions.sql``system_views.sql

您誤讀了 pgsql-bugs 執行緒:在initdb. 這也是硬連線。

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