Skip to content

Commit 26e882f

Browse files
authored
Merge pull request #1799 from coderdojo-japan/add-postgresql-upgrade-guide
PostgreSQL アップグレードガイドを追加
2 parents c381616 + ce0506e commit 26e882f

File tree

1 file changed

+278
-0
lines changed

1 file changed

+278
-0
lines changed

doc/how_to_upgrade_postgresql.md

Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
# PostgreSQL アップグレードガイド
2+
3+
**対象読者**: 本番環境(Heroku)へのアクセス権限がある管理者向けのドキュメントです。
4+
5+
---
6+
7+
## TL;DR(急いでいる方向け)
8+
9+
```bash
10+
# 1. バージョン確認(管理者のみ: 本番環境確認)
11+
heroku pg:info --app <app-name> | grep "PG Version" # 本番: 例 17.6
12+
psql --version # ローカル: 例 16.9
13+
14+
# 2. アップグレード(クリーンインストール)
15+
brew services stop postgresql@<古いバージョン>
16+
brew uninstall postgresql@<古いバージョン>
17+
brew install postgresql@<新しいバージョン>
18+
brew services start postgresql@<新しいバージョン>
19+
export PATH="/opt/homebrew/opt/postgresql@<新しいバージョン>/bin:$PATH"
20+
21+
# 3. バージョン確認
22+
psql --version # 新しいバージョンになっていることを確認
23+
```
24+
25+
**Note**: `brew uninstall` はパッケージのみ削除し、データディレクトリ (`/opt/homebrew/var/postgresql@<バージョン>`) は残ります。
26+
27+
---
28+
29+
## 背景
30+
31+
`heroku pg:pull` などで本番環境のデータベースをローカルにプルする際、**本番環境とローカル環境の PostgreSQL メジャーバージョンが一致している必要があります**
32+
33+
バージョンが異なると、以下のようなエラーが発生します:
34+
35+
```
36+
pg_dump: エラー: サーバーバージョンの不一致のため処理を中断します
37+
pg_dump: 詳細: サーバーバージョン: X.Y、pg_dump バージョン: X.Y (Homebrew)
38+
```
39+
40+
****(2026年1月時点):
41+
- 本番環境: PostgreSQL 17.6
42+
- ローカル環境: PostgreSQL 16.9
43+
- 結果: バージョン不一致でエラー
44+
45+
## 本番環境のバージョンを確認(管理者のみ)
46+
47+
まず、本番環境(Heroku)の PostgreSQL バージョンを確認します:
48+
49+
```bash
50+
heroku pg:info --app coderdojo-japan | grep "PG Version"
51+
```
52+
53+
## 現在のローカルバージョンを確認
54+
55+
```bash
56+
psql --version
57+
```
58+
59+
本番環境と同じメジャーバージョン(例: 両方とも 17.x)であれば問題ありません。異なる場合はアップグレードが必要です。
60+
61+
## アップグレード方法
62+
63+
どちらのオプションを選ぶべきか:
64+
- **他のプロジェクトのデータベースも保持したい****オプション1(pg_upgrade)を推奨**
65+
- **すべてのデータベースを本番から再プルできる** → オプション2(クリーンインストール)が簡単
66+
67+
### オプション1: データを保持してアップグレード(pg_upgrade 使用)
68+
69+
既存のローカル DB データを保持したい場合、PostgreSQL の `pg_upgrade` ツールを使用します。
70+
71+
**このオプションの利点**:
72+
- すべてのデータベース(複数プロジェクト)を一度に移行できる
73+
- データ損失のリスクがない
74+
- 移行後すぐに作業を再開できる
75+
76+
**このオプションの欠点**:
77+
- 手順が複雑(10ステップ)
78+
- 互換性チェックやデータディレクトリの準備が必要
79+
80+
```bash
81+
# 1. 新しいバージョンをインストール
82+
brew install postgresql@<新しいバージョン>
83+
84+
# 2. 古いバージョンを停止
85+
brew services stop postgresql@<古いバージョン>
86+
87+
# 3. 互換性チェック(安全確認、データは変更されない)
88+
/opt/homebrew/opt/postgresql@<新しいバージョン>/bin/pg_upgrade \
89+
--old-datadir /opt/homebrew/var/postgresql@<古いバージョン> \
90+
--new-datadir /opt/homebrew/var/postgresql@<新しいバージョン> \
91+
--old-bindir /opt/homebrew/opt/postgresql@<古いバージョン>/bin \
92+
--new-bindir /opt/homebrew/opt/postgresql@<新しいバージョン>/bin \
93+
--check
94+
95+
# 4. データディレクトリの準備(brew install で自動初期化されるため)
96+
mv /opt/homebrew/var/postgresql@<新しいバージョン> \
97+
/opt/homebrew/var/postgresql@<新しいバージョン>.initial
98+
mkdir -p /opt/homebrew/var/postgresql@<新しいバージョン>
99+
/opt/homebrew/opt/postgresql@<新しいバージョン>/bin/initdb \
100+
-D /opt/homebrew/var/postgresql@<新しいバージョン> \
101+
--locale=en_US.UTF-8 -E UTF-8
102+
103+
# 5. 実際のアップグレード実行(--check フラグなし)
104+
/opt/homebrew/opt/postgresql@<新しいバージョン>/bin/pg_upgrade \
105+
--old-datadir /opt/homebrew/var/postgresql@<古いバージョン> \
106+
--new-datadir /opt/homebrew/var/postgresql@<新しいバージョン> \
107+
--old-bindir /opt/homebrew/opt/postgresql@<古いバージョン>/bin \
108+
--new-bindir /opt/homebrew/opt/postgresql@<新しいバージョン>/bin
109+
110+
# 6. 新しいバージョンを起動
111+
brew services start postgresql@<新しいバージョン>
112+
113+
# 7. PATH を更新(新しいターミナルで有効化)
114+
echo 'export PATH="/opt/homebrew/opt/postgresql@<新しいバージョン>/bin:$PATH"' >> ~/.zshrc
115+
116+
# 8. 現在のセッションで PATH を更新
117+
export PATH="/opt/homebrew/opt/postgresql@<新しいバージョン>/bin:$PATH"
118+
119+
# 9. オプティマイザ統計を更新(pg_upgrade 推奨)
120+
/opt/homebrew/opt/postgresql@<新しいバージョン>/bin/vacuumdb --all --analyze-in-stages
121+
122+
# 10. バージョン確認
123+
psql --version
124+
```
125+
126+
### オプション2: クリーンインストール(簡単)
127+
128+
**Note**: `brew uninstall` はパッケージのみ削除し、データディレクトリは残ります。データベースは保持されますが、新しいバージョンからはアクセスできません。
129+
130+
**手順**:
131+
132+
```bash
133+
# 1. 古いバージョンを停止・アンインストール
134+
brew services stop postgresql@<古いバージョン>
135+
brew uninstall postgresql@<古いバージョン>
136+
137+
# 2. 新しいバージョンをインストール
138+
brew install postgresql@<新しいバージョン>
139+
140+
# 3. 新しいバージョンを起動
141+
brew services start postgresql@<新しいバージョン>
142+
143+
# 4. PATH を更新(新しいターミナルで有効化)
144+
echo 'export PATH="/opt/homebrew/opt/postgresql@<新しいバージョン>/bin:$PATH"' >> ~/.zshrc
145+
146+
# 5. 現在のセッションで PATH を更新
147+
export PATH="/opt/homebrew/opt/postgresql@<新しいバージョン>/bin:$PATH"
148+
149+
# 6. バージョン確認
150+
psql --version
151+
```
152+
153+
## アップグレード後の確認
154+
155+
```bash
156+
# 1. PostgreSQL サービスの状態確認
157+
brew services list | grep postgresql
158+
# 期待される出力: postgresql@<新しいバージョン> started
159+
160+
# 2. 古いバージョンが動いていないか確認(重要)
161+
# 複数バージョンが "started" の場合、古いバージョンに接続される可能性あり
162+
# 古いバージョンが動いている場合: brew services stop postgresql@<古いバージョン>
163+
164+
# 3. psql のバージョン確認
165+
psql --version
166+
167+
# 4. 実際に接続してサーバーバージョンを確認
168+
psql -d postgres -c "SELECT version();"
169+
# クライアント(psql)とサーバーのバージョンが一致しているか確認
170+
```
171+
172+
## 本番データベースのプル(管理者のみ)
173+
174+
アップグレード後、本番環境(Heroku)のデータベースをローカルにプルできます:
175+
176+
```bash
177+
# ローカル DB を削除してから本番データをプル
178+
./drop_db_and_fetch_from_heroku.sh
179+
180+
# マイグレーションを実行(必要に応じて)
181+
bundle exec rails db:migrate
182+
183+
# ローカルサーバーを起動して確認
184+
bundle exec rails server
185+
```
186+
187+
## トラブルシューティング
188+
189+
### 複数バージョンが起動していて接続先が間違う
190+
191+
**症状**: `psql --version` は新しいバージョンを表示するが、`SELECT version()` で古いバージョンに接続される
192+
193+
**原因**: 複数の PostgreSQL サービスが同時に起動している
194+
195+
**解決方法**:
196+
```bash
197+
# すべての PostgreSQL サービスの状態を確認
198+
brew services list | grep postgresql
199+
200+
# 古いバージョンをすべて停止
201+
brew services stop postgresql@<古いバージョン>
202+
203+
# 新しいバージョンを再起動
204+
brew services restart postgresql@<新しいバージョン>
205+
206+
# 接続先を確認
207+
psql -d postgres -c "SELECT version();"
208+
```
209+
210+
### heroku pg:pull でバージョン不一致エラーが出る
211+
212+
**症状**: `psql --version` は正しいが、`heroku pg:pull` で「pg_dump バージョン: <古い>」エラー
213+
214+
**原因**: Heroku CLI が古い pg_dump を使用している(PATH を無視)
215+
216+
**解決方法**:
217+
```bash
218+
# 1. ターミナルを完全に再起動(PATH を完全にリロード)
219+
# または
220+
# 2. 新しいターミナルウィンドウを開く
221+
222+
# 3. それでもダメな場合、Heroku CLI を再インストール
223+
brew reinstall heroku/brew/heroku
224+
```
225+
226+
### PATH が正しく設定されていない
227+
228+
**症状**: `psql --version` が古いバージョンを表示
229+
230+
**解決方法**:
231+
```bash
232+
# 現在の psql のパスを確認
233+
which psql
234+
# 期待されるパス: /opt/homebrew/opt/postgresql@<新しいバージョン>/bin/psql
235+
236+
# 現在のセッションで PATH を更新
237+
export PATH="/opt/homebrew/opt/postgresql@<新しいバージョン>/bin:$PATH"
238+
239+
# 新しいターミナルで確認
240+
psql --version
241+
```
242+
243+
### PostgreSQL サービスが起動しない
244+
245+
```bash
246+
# サービスの状態を確認
247+
brew services list | grep postgresql
248+
249+
# エラー状態の場合、ログを確認
250+
tail -f /opt/homebrew/var/log/postgresql@<バージョン>.log
251+
252+
# サービスを再起動
253+
brew services restart postgresql@<バージョン>
254+
255+
# データディレクトリの権限を確認
256+
ls -la /opt/homebrew/var/postgresql@<バージョン>
257+
```
258+
259+
## 古いバージョンのクリーンアップについて
260+
261+
**推奨**: 古いバージョンは残しておく。
262+
263+
**理由**:
264+
- 他のプロジェクトで使用している可能性がある
265+
- 誤って削除すると、データベースが完全に失われる
266+
- ディスク容量は後で整理できる
267+
268+
269+
## 参考情報
270+
271+
- Heroku の PostgreSQL バージョン: https://devcenter.heroku.com/articles/heroku-postgresql#version-support-and-legacy-infrastructure
272+
- Homebrew PostgreSQL: https://formulae.brew.sh/formula/postgresql
273+
- PostgreSQL バージョン一覧: https://www.postgresql.org/support/versioning/
274+
- pg_upgrade 公式ドキュメント: https://www.postgresql.org/docs/current/pgupgrade.html
275+
276+
## 更新履歴
277+
278+
- 2026-01-21: 初版作成、pg_upgrade の正しい手順を追加、実際の経験に基づく改善

0 commit comments

Comments
 (0)