前言
繼上一篇的 在 Mac / Homebrew 下升級 PostgreSQL 從 9.3 到 9.4 之後,最近由於更換筆電 / 不想用 TimeMachine 加上剛好 PostgreSQL 9.5 發佈的關係,必需重新用 Homebrew 安裝 PostgreSQL 9.5,本來使用了前篇所介紹的方式來移轉舊版 PostgreSQL 9.4 的資料檔,但是很神奇地發現在所有 Rails App 的 DB 中的 schema_migration 表的資料通通遺失了,所以就必需要使用另一種方式來升級。
升級的方式
一般來說有以下兩種
從資料檔案 (raw data file) 轉移
不像 MySQL,PostgreSQL 每個版本的 raw data file 都是不相容的(註:MySQL 也要看 Storage Engine),所以當升級新版的時候是不能直接套用的,PostgreSQL 也提供了 pg_upgrade 指令來幫助升級,這也是前一篇的主題。
使用 SQL 檔案轉移
使用 pg_dump 或 pg_dumpall 等工具將舊 DB Dump 成 SQL 指令的格式,再輸入到新 DB 上即可>
流程
更改資料檔目錄
Homebrew 預設的資料檔目錄在
/usr/local/var/postgres
請把它移到另一個目錄去自舊版 PostgreSQL Dump SQL 檔案
如果還沒有升級新版前,就直接執行
pg_dumpall -c -f 目的檔案名
即可,選項 -c 是在 dump 檔中附加移除既存 DB 的指令,可視個人需求決定要不要加。
要是已經升級新版的話,由於 PostgreSQL 套件的發佈者都很貼心的把所有檔案照版本排列,所以可以用以下的指令開啟一個暫時的 PostgreSQL Daemon
/usr/local/Cellar/postgresql/9.4.1/bin/postmaster -D /usr/local/var/postgres94/ -k /tmp/pg94/ -p 8822
選項中 -D 是指定資料檔目錄,-k 是 socket file 的目錄,-p 是 port,要注意這兩者都不能和執行中的新版本重疊,這樣就順利開啟了服務,然後再執行
pg_dumpall -c -p 8822 -h /tmp/pg94
就可以取得 dump SQL 檔了自 dump SQL 檔還原到新版資料庫中
在上一步的 dump 指令中就可以用 pipe 一步完成了:
pg_dumpall -c -p 8822 -h /tmp/pg94 | psql postgres
以上