當我需要安裝兩個 PostgreSQL 伺服器時,如何解決 pg_dump 的「伺服器版本不符」問題?

當我需要安裝兩個 PostgreSQL 伺服器時,如何解決 pg_dump 的「伺服器版本不符」問題?

我在我的電腦上安裝了兩個 PostgreSQL 伺服器。一個是9.1,另一個是9.3。我需要安裝兩台伺服器。

然而,當我運行 pg_dump 時,我收到版本不匹配錯誤:

server version: 9.3.6; pg_dump version: 9.1.15
pg_dump: aborting because of server version mismatch

我該如何解決? (無法卸載任何版本 - 我先安裝了 9.1,幾個月後安裝了 9.3 - 我需要兩個都安裝資料庫伺服器)。

答案1

長話短說:如果兩個 PostgreSQL 實例都由 Ubuntu 軟體包管理(理應如此),只需使用該--cluster選項選擇要備份的 PostgreSQL 實例,它將自動選擇對應版本的 pg_dump:

pg_dump --cluster 9.1/main [other pg_dump options]

或者

pg_dump --cluster 9.3/main [other pg_dump options]

main只是一個預設值,運行pg_lsclusters即可在該列中查看您的實際名稱Cluster

它是如何工作的:由 Ubuntu 軟體包安裝,/usr/bin/pg_dump實際上是一個到 的軟鏈接/usr/share/postgresql-common/pg_wrapper,其目的正是選擇正確的實例並運行相應的二進製文件。--cluster不存在於普通的 PostgreSQL 命令中,它是 Debian/Ubuntu 的補充,旨在解決這個多版本/多路徑問題。

psql這對於、createdb、等來說也是一樣createuser/usr/binpg_wrapper

人 pg_wrapper了解更多。

答案2

您可以使用:

sudo find / -name pg_dump

pg_dump在我的例子中找到您的版本:/usr/pgsql-9.6/bin/pg_dump

所以接下來我們可以做:

sudo ln -sfn /usr/pgsql-9.6/bin/pg_dump /usr/bin/pg_dump

為了更新到我們所需要的

答案3

如果您正在執行 docker,則可以執行任何版本的 pg_dump,而無需管理多個安裝。這將/path/to/dump/to/myfilename.dump使用 postgres 12.5寫入一個檔案:

docker run --rm --network=host -v "/path/to/dump/to:/tmp/dump" \
  postgres:12.5 pg_dump -Fc -v --dbname="my_db_bame" -f "/tmp/dump/myfilename.dump"
  • --rm命令完成後刪除容器
  • --network=host將容器連接到主機本地網絡
  • -v ...將您的主機目錄 ( /path/to/dump/to) 安裝到容器內的暫存目錄

您只需確保掛載到 ( /tmp/dump) 的目錄與 pg_dump 正在寫入的目錄相同。

然後你可以將 12.5 改為你想要的任何版本。

相關內容