Amazon RDS for PostgreSQLのDBを移行

## 目次
1.はじめに
2.前提
3.手順
4.参考
5.終わりに

## はじめに
諸事情でRDS for PostgreSQLからRDS for PostgreSQLにDB移行したかったのですが、思った以上に手間取ったので備忘録として残します。
ちなみに楽をしようとした結果、仕様に迷って時間がかかりました。


## 前提
#### 移行前のDB
Amazon RDS for PostgreSQL
エンジンバージョン：15.7

#### 移行後のDB
Amazon RDS for PostgreSQL
エンジンバージョン：15.10

#### 移行のためのインターフェイス
EC2（Windows）からコマンドプロンプトで実行。
pg_dumpとpg_restoreのコマンドを利用するため、PostgreSQLのクライアントツールがインストールされていることが必須になります。
実行したEC2（Windows）のローカルにはPostgreSQL16がインストールされているため、PostgreSQLのクライアントツールがインストール済みでした。


## 手順
### 手順1 環境変数を変更する
コマンドプロンプトでpg_dumpとpg_restoreのコマンドを実行できるよう、まずは環境変数を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/22d3bf23-eb8f-4ba2-adc1-7b953f747719.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/17832fdd-e6a5-4086-a7d2-d8d69e10613d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/f2133b21-9904-4fca-be7e-c6909776e255.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/c7154e72-fc75-420c-b8ee-342748af993f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/21ec79d4-a156-4726-8ee1-05c53969b05b.png)

システム環境変数のPathにPostgreSQLのbinを登録します。
PostgreSQLのバージョンが16でデフォルトだと下記のとなります。
```
C:\Program Files\PostgreSQL\16\bin\
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/101b90e3-656a-4a0c-9037-ce268b22f659.png)

コマンドプロンプトから下記を実行します。
localhostにインストールしたPostgreSQLのバージョンが確認できたら設定完了です。
```bash
psql --version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/1c084520-c125-4600-982f-bd12fe8d65ee.png)


### 手順2 移行前のDBを出力
下記を実行します。
```bash
pg_dump -h YOUR_HOST -U YOUR_USER -c -Fc -d YOUR_DBNAME > backup.dump
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/5902f04f-2164-41a9-bcc2-d78adaf3a155.png)

C:\Users\Administrator配下にdumpファイルが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/83612acc-f30e-4cf0-aee7-79872bfd0d51.png)

### 手順3 移行先のDBを作成
pg_restoreには指定した名前のDBを新規作成する機能がない為、事前にDBを作成する必要があります。
今回はpgAdminより作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/ea81097e-10ee-4ea1-8753-d11409e7fa16.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/e1564348-0bba-45ab-a312-2d703815dce2.png)


### 手順4 移行先のDBにリストア
下記を実行します。
ここでのユーザーはpostgresを指定し、パスワードもpostgresのパスワードを入力してください。
```bash
pg_restore --clean -h YOUR_HOST -p YOUR_PORT -U postgres -d NEW_DATABASE_NAME backup.dump
```


### 手順5 移行先のDBに参照権限付与
pgadminにpostgresユーザーから接続します。
リストアしたDBを右クリックし、権限付与ウィザードを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/e912580e-2961-4e7a-828a-e7f035e674f8.png)

対象のオブジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/86c1adc2-4f2f-446a-901b-11e7a8d5927f.png)

右上の＋をクリックし受領者をPUBLIC、権限にAllを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/7eea9326-551c-49a2-b516-2e0640db2527.png)

進んで完了します。


### 手順5 移行先のDB確認
移行先のDBにpostgresユーザー以外から接続します。
postgresユーザー以外からテーブル内が見れることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803480/7fd516fd-2593-42f1-a450-925090003e73.png)


## 参考
下記のQiita記事がPostgreSQLのバックアップとリストアの情報についてかなり詳細にまとまっており、参考にさせていただきました。

https://qiita.com/jun1s/items/8ba778b91258c33396e8#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%82%92%E5%85%83%E3%81%AB%E6%96%B0%E3%81%97%E3%81%84%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B


## おわりに
コマンドプロンプトでpg_dumpとpg_restoreが使えればすぐに移行できます。
参考になれば幸いです。