pg_restore:錯誤:無法執行查詢:錯誤:無法辨識選項“區域設置”
當我嘗試將轉儲文件恢復到另一個(本地)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.7pg_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.x
LOCALE
使用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