慕凡(@ryudoawaru)'s blog

目前還沒想到

在 OSX 下升級 Homebrew 安裝的 PostgreSQL(dump 版)

| Comments

前言

繼上一篇的 在 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 上即可>

流程

  1. 更改資料檔目錄

    Homebrew 預設的資料檔目錄在 /usr/local/var/postgres 請把它移到另一個目錄去

  2. 自舊版 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 檔了

  3. 自 dump SQL 檔還原到新版資料庫中

    在上一步的 dump 指令中就可以用 pipe 一步完成了:

    pg_dumpall -c -p 8822 -h /tmp/pg94 | psql postgres

以上

Comments