最近在進行一個 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