Postgresql

pg_restore:錯誤:無法執行查詢:錯誤:無法辨識選項“區域設置”

  • June 26, 2021

當我嘗試將轉儲文件恢復到另一個(本地)PostgreSQL 伺服器(在 Debian GNU/Linux 10.10 上執行)時,出現以下錯誤:

pg_restore: error: could not execute query: ERROR:  option "locale" not recognized

因為它確實有以下行:

CREATE DATABASE "REMOTE_DB" WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE = 'en_GB.UTF-8';

是的,我知道PostgreSQL 12 CREATE DATABASE命令沒有LOCALE選項。

我不明白的是:

  • 我在本地伺服器上使用的 PostgreSQL 本身的版本報告為 12.7
  • pg_dump我在本地伺服器上使用的版本報告為 12.7
  • pg_restore我在本地伺服器上使用的版本報告為 12.7
  • 我使用其創建的轉儲的遠端 PostgreSQL 數據庫pg_dump是版本 12.7,而不是 13

讓我一一驗證:

我的本地伺服器:

$ sudo -u postgres psql -c 'select version();'
                                                    version
------------------------------------------------------------------------------------------------------------------
PostgreSQL 12.7 (Debian 12.7-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit

我的本地pg_dump版本:

$ pg_dump --version
pg_dump (PostgreSQL) 12.7 (Debian 12.7-1.pgdg100+1)

我的本地pg_restore版本:

$ pg_restore --version
pg_restore (PostgreSQL) 12.7 (Debian 12.7-1.pgdg100+1)

讓我們檢查一下遠端數據庫的 PostgreSQL 版本:

$ psql --host=REMOTE_HOST_IP_ADDRESS --dbname=REMOTE_DB --username=DB_USER -c 'select version();'
Password for user DB_USER:
                                                            version
----------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 12.7 (Debian 12.7-1.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
(1 row)

這就是我創建轉儲文件的方式:

$ pg_dump --verbose \
 --create \
 --clean \
 --if-exists \
 --format=custom \
 --compress=5 \
 --host=REMOTE_HOST_IP_ADDRESS --dbname=REMOTE_DB --username=DB_USER \
 --schema=public --table=TABLE_NAME\
 > db.dump

這就是我嘗試在執行 PostgreSQL 12 的本地伺服器上恢復它的方式:

$ sudo -u postgres \
pg_restore --verbose \
 --create \
 --clean \
 --jobs=8 \
 --format=custom \
 --dbname=postgres \
 db.dump

PostgreSQL 13已安裝,但未在此本地伺服器上執行:

$ systemctl status postgresql@13-main.service
● postgresql@13-main.service - PostgreSQL Cluster 13-main
  Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled-runtime; vendor preset: enabled)
  Active: failed (Result: protocol) since Thu 2021-06-24 07:59:24 UTC; 1 day 5h ago
 Process: 562 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 13-main start (code=exited, status=1/FAILURE)

PostgreSQL 12正在執行:

$ systemctl status postgresql@12-main.service
● postgresql@12-main.service - PostgreSQL Cluster 12-main
  Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled-runtime; vendor preset: enabled)
  Active: active (running) since Thu 2021-06-24 07:59:26 UTC; 1 day 5h ago
 Process: 556 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 12-main start (code=exited, status=0/SUCCESS)
Main PID: 595 (postgres)
   Tasks: 9 (limit: 36863)
  Memory: 235.7M
  CGroup: /system.slice/system-postgresql.slice/postgresql@12-main.service
          ├─595 /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf
          ├─678 postgres: 12/main: checkpointer
          ├─679 postgres: 12/main: background writer
          ├─680 postgres: 12/main: walwriter
          ├─681 postgres: 12/main: autovacuum launcher
          ├─682 postgres: 12/main: stats collector
          ├─683 postgres: 12/main: TimescaleDB Background Worker Launcher
          ├─684 postgres: 12/main: logical replication launcher
          └─685 postgres: 12/main: TimescaleDB Background Worker Scheduler

長話短說,我的問題是:

  • 為什麼我LOCALE在生成的轉儲文件中得到這個不受支持的選項pg_dump,而 REMOTE PostgreSQL 版本以及本地pg_dump版本報告為12.7不是 13

我還應該檢查什麼?

我在本地伺服器上使用的 PostgreSQL 本身的版本報告為 12.7

但仍然是 pg_dump 13.xLOCALE使用CREATE DATABASE.

/usr/bin/pg_dump由 Debian/Ubuntu 軟體包安裝的是一個包裝器,它試圖確定它應該與哪個版本的 PostgreSQL 通信,然後它執行內部的實際二進製文件/usr/lib/postgresql/$VERSION/bin/。這意味著在同一主機上支持多個安裝和版本的 PostgreSQL,即使在您的情況下只執行一個。

$ ls -l /usr/bin/pg_dump
lrwxrwxrwx 1 根 2020 年 8 月 14 日 37 日 /usr/bin/pg_dump -> ../share/postgresql-common/pg_wrapper

有關手冊頁,請參見pg_wrapper

合理的解釋

執行時pg_dump --version,它會以某種方式獲取活動集群的版本 (12) 並啟動相應的 pg_dump。

執行時pg_dump --host ...,不知道遠端主機執行的是哪個版本的PostgreSQL,不知何故預設選擇13版本。

解決方案

作為一種解決方法,您可以直接呼叫/usr/lib/postgresql/12/bin/pg_dump而不是pg_dump

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