macOSでPostgres.appを使用している場合のメジャーアップデート（データ移行有）

# はじめに
Local環境でPostgeSQLの14を使用していたのですが、15にバージョンアップしたくなりました。ただHomebrew経由でインストールしたPostgreSQLはなく、GUIのPostgres.appからインストールしたPostgreSQLを使用していました。GUI版かつデータ移行有でのメジャーバージョンアップを解説したサイトがそんなになさそうだったので記録しておきます。どなたかの参考になれば幸いです。（基本的に[Postgres.app公式サイトのドキュメント](https://postgresapp.com/)を参考にしてますが、公式サイトはデータの移行とメジャーバージョンアップを分けて記載しており少々分かりにくかったです。）

# 環境
|項目|情報|
| ---- | ---- |
|OS|macOS Ventura 13.1|
|プロセッサ|1.6 GHz デュアルコアIntel Core i5|
|PostgreSQL(アップデート前)|14.6|
|PostgreSQL(アップデート後)|15.1|

# メジャーアップデート手順

## 旧バージョンのバックアップ取得

### Postgres.appを開き、サーバが起動してなければ起動する。
![postgres_backup_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/eba189cf-3d18-5379-7690-f77f6747aec8.png)
![postgres_backup_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/e4da3a2d-9977-4a91-93e6-ac8d4ea14d26.png)

### 一時フォルダ作成
ターミナルで以下のコマンドを実行し、任意の場所に一時フォルダを作成する。(フォルダ名は何でもいいです。)
```
$ mkdir -m 777 postgresql_dump
$ cd postgresql_dump
```
### バックアップコマンド実行
ターミナルで以下のコマンドを実行し、旧バージョンのPostgreSQLのデータをバックアップする。
```
$ pg_dumpall --quote-all-identifiers | gzip >postgresapp.sql.gz
$ ls -l
total 8
-rw-r--r--  1 xxxxxx  xxxxxx  1174  2  8 21:36 postgresapp.sql.gz
```

## 旧バージョンのPostgres.appのアンインストール

### 旧バージョンのサーバ停止
Postgres.appを開き、旧バージョンのサーバを停止する。
![postgres_install_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/de065a43-ca65-7743-eb02-878587f47afd.png)
![postgres_install_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/777db15b-835f-8390-77ae-800e51a6e567.png)

停止したらPostgres.appは閉じる。

### 旧バージョンのPostgres.appの削除
ApplicationsフォルダのPostgres.appをゴミ箱に移動する。

### 旧バージョンのデータディレクトリ削除
ターミナルで以下のコマンドを実行し、旧バージョンのPostgreSQLのデータディレクトリを削除する。
```
$ rm -rf ~/Library/Application\ Support/Postgres
$ ls -ld ~/Library/Application\ Support/Postgres
ls: /Users/ngnmsn/Library/Application Support/Postgres: No such file or directory
```

### 旧バージョンの設定削除
ターミナルで以下のコマンドを実行し、旧バージョンのPostgreSQLの設定を削除する。
```
$ defaults delete com.postgresapp.Postgres2
```

### 旧バージョンの$PATHコマンドラインツールの構成削除
ターミナルで以下のコマンドを実行し、旧バージョンの$PATHコマンドラインツールの構成を削除する。
```
$ sudo rm /etc/paths.d/postgresapp
```

## 新バージョンのインストール

### 最新のメジャーアップデートのインストーラーをダウンロード
Postgres.appの公式サイトから最新のメジャーアップデートのインストーラーをダウンロード
[Postgres.app公式のインストーラーダウンロードページ](https://postgresapp.com/downloads.html)
![postgres_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/66d6527d-c88e-366f-1d11-0e7f8b0c3134.png)

### Applicationsフォルダへのドラッグ&ドロップ
ダウンロードしたdmgファイルをダブルクリックし、インストールを開始する。
以下のウィンドウが表示されたら"Postgres.app"を"Applications"にドラッグ&ドロップ
![postgres_15_install_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/067be454-0525-f6f4-a785-3b5b5a4f3699.png)

### 「開く」をクリック
新しく配備されたApplicationsフォルダのPostgres.appを開くと以下のウィンドウが表示されるので、「開く」をクリック。
![postgres_install_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/b5b1aa8f-912d-fc54-7034-316a5719c6b4.png)

### 「Initialize」をクリック
新しいバージョンのPostgres.appが開かれるので、「Initialize」をクリックして初期化する。
![postgres_install_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/76e133d5-c965-81b2-fa14-dd04b48a0fc8.png)
初期化が完了するとサーバが起動する。
![postgres_install_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/a3d1faa8-0ad3-72b9-52e2-33b1eb1a6b72.png)

### パスを通す。
付属のコマンドラインツールを使用できるようにするため、ターミナルで以下のコマンドを実行する。
```
$ sudo mkdir -p /etc/paths.d
$ echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp
```

### psqlによるバージョン確認
ターミナルで以下のコマンドを実行し、psqlのバージョンが15となっているか確認する。
```
$ psql --version
psql (PostgreSQL) 15.1
```

## 旧バージョンのバックアップデータの新バージョンへの移行

### 一時ディレクトリ移動
ターミナルで以下のコマンドを実行し、一時フォルダに移動する。
また先程のバックアップがあることを確認する。
```
$ cd /* 一時ディレクトリのパス */
$ ls -l
total 8
-rw-r--r--  1 xxxxxx  xxxxxx  1174  2  8 21:36 postgresapp.sql.gz
```

### データ移行コマンドを実行
ターミナルで以下のコマンドを実行し、新バージョンのサーバにバックアップデータを移行する。
```
$ gunzip <postgresapp.sql.gz | psql
```

### データが正常に移行されたか確認する。
psql等で確認してください。
データが正常に移行されていれば、以上となります。