PostgreSQL 備份與還原

最近在進行一個 postgreSQL 的主機轉移作業, 由於主機的版本有升級, 決定採取導出後導入的方式進行, 在這邊紀錄一下 PostgreSQL備份與還原的過程, 以及過程中遇到的問題

環境

  • DB_SERVER_1
    OS: Debian 8
    DB: PostgreSQL 9.3.5

  • DB_SERVER_2
    OS: Debian 8
    DB: PostgreSQL 9.5.5

步驟

備份(導出)

指令:

pg_dump [-h 主機] [-p 資料庫Port] [-U 使用者名稱] [資料庫名稱] [-f 檔案名稱]

範例:
Host: db01.postgresql
Port: 5502
User: pqadmin
DB: website

pg_dump-h db01.postgresql -p 5502 -U pqadmin website -f website-2016-11-07.sql

系統接著會問密碼(輸入不會顯示在畫面上), 再輸入完後我們就會得到一個 website-2016-11-07.sql 的導出結果

還原(導入)

指令 psql

psql [-h 主機] [-p 資料庫Port] [-f 檔案名稱] [資料庫名稱] [使用者名稱]

注意參數格式, psql 與 pg_dump 參數格式不同

範例:
Host: db02.postgresql
Port: 5990
User: pqadmin
DB: website

psql -h db02.postgresql -p 5990 -f website-2016-11-07.sql website pqadmin

接著一樣輸入使用者密碼系統就會開始導入

遭遇問題

1. pg_dump: aborting because of server version mismatch

問題原因

pg_dump 的版本低於目標Server的版本, --ignore-version 這個參數在新版已經無法使用

解決辦法

安裝正確版本的 postgresql, pg_dump 便會是相對應版本

2. pg_dump 版本不符

問題原因

安裝了正確版本的 postgresql 後, pg_dump 的版本依然是舊的, 主要的問題在安裝新版 postgresql 的方法大多都是使用官方 repo, 官方repo 與 apt, yum package 的安裝位置不同, 導致 pg_dump 會一直抓到 apt, yum 安裝的版本而不是新的版本

解決辦法

可以在 /usr/lib/postgresql/{version}/bin/找到對應版本的 psql 與 pg_dump