【OCI クラウド移行ガイド】 Aurora PostgreSQLからOCI Database with PostgreSQLへ移行してみた


# OCIクラウド移行ガイドとは
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア（@araidon,@kazunishi,@yama6）による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
まとめ記事は以下になります。

https://qiita.com/yama6/items/b197c0fe3ec75eb02637

# 移行するサービス：Aurora PostgreSQL
今回、移行対象とするのはAmazon Aurora PostgreSQLです。
PostgreSQLクライアントアプリケーションである、pg_dumpと、pg_restoreを用いて、
Aurora PostgreSQLのDBをOCI Database with PostgreSQLに移行する手順を解説します。


# 移行方式

Amazon Aurora PostgreSQLのデータをpg dumpで取得し、そのダンプファイルを使用して、OCI Database with PostgreSQLへpg restoreを使用して移行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/261ea6a2-011f-bd5b-b74e-3e95180c75b6.png)


# 前提条件
・AWS,OCIそれぞれのPostgreSQL Databaseに対して接続するための、パブリックインスタンス上のEC2,ComputeVMが構築されていること



# 移行手順
1. Aurora PostgreSQLの作成
1. pg_dumpを利用したダンプファイルの取得
1. OCI Database with PostgreSQLの作成
1. pg_restoreを利用したリストアの実行



# 1. Aurora PostgreSQLの作成

AWSのコンソール画面にログインし、RDS＞データベースの作成画面に遷移します。
必要項目を入力していきます。

|項目  |入力内容
|---|---
|データベース作成方法を選択|標準作成
|エンジンのオプション|
|エンジンのタイプ|Aurora (PostgreSQL Compatible)
|利用可能なバージョン|Aurora PostgreSQL(Compatible with PostgreSQL 14.9)
|テンプレート|開発/テスト
|設定|
|DB クラスター識別子|test-aurora-postgresql（任意）
|認証情報の設定|
|マスターユーザー名|（任意）
|マスターパスワード|（任意）
|マスターパスワードの確認|（任意）
|クラスターストレージ設定|Aurora スタンダード
|インスタンスの設定|
|DB インスタンスクラス|バースト可能クラス (t クラスを含む)
|可用性と耐久性|Aurora レプリカを作成しない
|接続|
|コンピューティングリソース|EC2 コンピューティングリソースに接続しない
|ネットワークタイプ|IPv4
|Virtual Private Cloud (VPC)|(Auroraを建てるプライベートサブネットのVPC)
|DB サブネットグループ|(Default)
|パブリックアクセス|なし
|既存の VPC セキュリティグループ|（任意）
|アベイラビリティーゾーン|（任意）
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8445c86f-4df5-6b9a-d10b-fe7ba23bd041.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3daece2f-9330-a58f-4595-c3b232b33309.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9fc8fc8e-a30c-862d-fcf6-bf4ee2b9e8b1.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/7309bd42-123e-3b71-fb5d-44c8d43612e5.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/de55d633-b240-3ca6-ccd2-6c0d2a64e826.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c1db365e-ef85-7477-a214-1e55a3a84676.png)

必要項目を入力した後、作成ボタンを押下します。
作成を待機している間に、今回利用するpg_dumpをインストールしていきます。

# 2. pg_dumpを利用したダンプファイルの取得
今回利用するpg_dumpはPostgreSQLクライアントに含まれているため、PostgreSQLクライアントをインストールします。

# 2-1. PostgreSQLクライアントのインストール

今回、接続用のEC2インスタンスのOSはAmazon Linux 2023を選択しています。
環境に合わせて、各種linuxに対応した手順でインストールを実施してください。
各種OSごとの手順は以下を参照してください。

https://www.postgresql.org/download/


今回、Amazon Linux 2023用へのインストールは下記記事を参考にしました。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html

まずは利用可能なを探していきましょう。
```
$ dnf search postgresql
=========================================================================================================================== Name & Summary Matched: postgresql ============================================================================================================================
collectd-postgresql.x86_64 : PostgreSQL plugin for collectd
postgresql-odbc.x86_64 : PostgreSQL ODBC driver
postgresql15.x86_64 : PostgreSQL client programs
postgresql15-contrib.x86_64 : Extension modules distributed with PostgreSQL
postgresql15-docs.x86_64 : Extra documentation for PostgreSQL
postgresql15-llvmjit.x86_64 : Just-in-time compilation support for PostgreSQL
postgresql15-plperl.x86_64 : The Perl procedural language for PostgreSQL
postgresql15-plpython3.x86_64 : The Python3 procedural language for PostgreSQL
postgresql15-pltcl.x86_64 : The Tcl procedural language for PostgreSQL
postgresql15-private-devel.x86_64 : PostgreSQL development header files for this build of PostgreSQL server
postgresql15-private-libs.x86_64 : The shared libraries required only for this build of PostgreSQL server
postgresql15-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql15-server-devel.x86_64 : PostgreSQL development header files and libraries
postgresql15-static.x86_64 : Statically linked PostgreSQL libraries
postgresql15-test.x86_64 : The test suite distributed with PostgreSQL
postgresql15-test-rpm-macros.noarch : Convenience RPM macros for build-time testing against PostgreSQL server
postgresql15-upgrade.x86_64 : Support for upgrading from the previous major release of PostgreSQL
```
postgresql15が利用可能であることがわかります。

インストールを行います。
```
sudo dnf install postgresql15
```
無事、インストールが完了したら、pg dumpを探してみましょう。
pg dumpは、/usr/bin配下にあります。
```
$ cd /
$ ls
bin  boot  dev  etc  home  lib  lib64  local  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
$ cd usr/bin
$ ls | grep pg_
pg_dump
pg_dumpall
pg_isready
pg_restore
pg_upgrade
```
pg_dumpと、のちに扱うpg_restoreがインストールされたことが確認できました。

# 2-2. PostgreSQLクライアントからAmazon Aurora PostgreSQLへの接続

では次に、Auroraに接続してみましょう。
PostgreSQLクライアントをインストールした、接続用のEC2インスタンスからアクセスできるように、Amazon Aurora PostgreSQLを作成する際に選択したセキュリティグループのインバウンドルールを下記のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2d1741f1-468b-fc73-0509-b5a1df6cdbeb.png)

設定後、Auroraのライターエンドポイントに対して、接続を行います。

```
$ psql --host=test-aurora-postgresql.cluster-cn07mhl9cm4v.ap-northeast-1.rds.amazonaws.com --port=5432 --username=postgres
Password for user postgres: 
psql (15.0, server 14.9)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=> 
```
接続が確認できました。

# 2-3. サンプルデータの挿入

下記のサンプルデータを利用してデータのロードを行います。

https://www.postgresqltutorial.com/postgresql-getting-started/postgresql-sample-database/


# 2-3-1. サンプルデータの準備
こちらのURLからローカルにzipファイルをダウンロードします。

https://www.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip

EC2インスタンスから一度ログアウトし、CloudShellに戻ります。
CloudShellにアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4d2c4107-3b04-7542-959b-87f81bb9f417.png)

CloudShellから下記コマンドを使用してEC2インスタンスにzipファイルを転送します。
```
[cloudshell-user@ip-XXX-XXX-XXX-XXX ~]$ ls
dvdrental.zip
[cloudshell-user@ip-XXX-XXX-XXX-XXX ~]$ scp -i 'EC2秘密鍵' 'ローカルの転送したいファイル' 'EC2ユーザー名@IPアドレス:ファイル配置先
```
再度EC2インスタンスにSSH接続し、下記コマンドでzipファイルを確認します。
```
$ ls
dvdrental.zip
```
zipファイルを解凍します。
```
$ unzip dvdrental.zip
Archive:  dvdrental.zip
  inflating: dvdrental.tar           
$ ls
dvdrental.tar dvdrental.zip
```
dvdrental.tarを使用して、データをロードします。

# 2-3-2. サンプルデータのロード

Auroraに接続し、dvdrentalデータベースを作成します。
```
postgres=> CREATE DATABASE dvdrental;
CREATE DATABASE
```
一度ログアウトし、EC2インスタンスに戻ります。
```
postgres=> exit
$ 
```
pg_restoreツールを使用してデータをdvdrentalデータベースにロードします。
```
$ pg_restore -h test-aurora-postgresql.cluster-cn07mhl9cm4v.ap-northeast-1.rds.amazonaws.com -U postgres -d dvdrental dvdrental.tar
Password: 
```
パスワードを打ち、数秒で処理が実行されます。

# 2-3-3. サンプルデータの確認

実際にデータが投入されたことを確認しましょう。
まず、データベース一覧表示します。
```
postgres=> \l
   Name    |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges   
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
 dvdrental | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | 
 rdsadmin  | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/rdsadmin          +
           |          |          |             |             |            |                 | rdsadmin=CTc/rdsadmin
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
(5 rows)
```
次に、データベースを切り替えます。
```
postgres=> \c dvdrental 
psql (15.0, server 14.9)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
You are now connected to database "dvdrental" as user "postgres".
dvdrental=>
```
テーブルの一覧を表示します。
```
dvdrental=> \dt;
             List of relations
 Schema |     Name      | Type  |  Owner   
--------+---------------+-------+----------
 public | actor         | table | postgres
 public | address       | table | postgres
 public | category      | table | postgres
 public | city          | table | postgres
 public | country       | table | postgres
 public | customer      | table | postgres
 public | film          | table | postgres
 public | film_actor    | table | postgres
 public | film_category | table | postgres
 public | inventory     | table | postgres
 public | language      | table | postgres
 public | payment       | table | postgres
 public | rental        | table | postgres
 public | staff         | table | postgres
 public | store         | table | postgres
(15 rows)
```
最後に、データの中身を確認します。
```
dvdrental=>  select * from actor limit 5;
 actor_id | first_name |  last_name   |      last_update       
----------+------------+--------------+------------------------
        1 | Penelope   | Guiness      | 2013-05-26 14:47:57.62
        2 | Nick       | Wahlberg     | 2013-05-26 14:47:57.62
        3 | Ed         | Chase        | 2013-05-26 14:47:57.62
        4 | Jennifer   | Davis        | 2013-05-26 14:47:57.62
        5 | Johnny     | Lollobrigida | 2013-05-26 14:47:57.62
(5 rows)
```
ここまでで、Auroraにデータがロードされたことを確認できました。

# 2-4. サンプルデータのDumpファイル作成

exitコマンドでAuroraから抜け、EC2インスタンス上でpg dumpを実行します。

```
$ pg_dump -h test-aurora-postgresql.cluster-cn07mhl9cm4v.ap-northeast-1.rds.amazonaws.com -U postgres -O -x --format=t --file=fromaws_dvdrental.tar dvdrental
Password: 
$ ls
dvdrental.tar  dvdrental.zip  fromaws_dvdrental.tar
```

tarファイル形式のfromaws_dvdrental.tarというファイル名で、ダンプファイルを作成します。
また、このダンプファイルは別のデータベースにリストアするため、-O オプションを付ける必要があります。
これは、オブジェクトの所有権を元のデータベースにマッチさせるためのコマンドを出力しないようにするオプションです。
-x オプションでは、アクセス権限（grant/revokeコマンド）のダンプを抑制しています。

詳細は、下記リファレンスをご参照ください。

https://www.postgresql.jp/document/15/html/app-pgdump.html

ここで作成したfromaws_dvdrental.tarを利用し、OCI Database with PostgreSQLにデータベースを移行します。
一度EC2からCloudShell上に転送し、CloudShellの機能を利用してファイルをローカルにダウンロードしておきます。
```
scp -i test-pub-key.pem ec2-user@ec2-52-199-86-11.ap-northeast-1.compute.amazonaws.com:/home/ec2-user/fromaws_dvdrental.tar ~/fromaws_dvdrental.tar
```
ここまでで、AWS側の作業は完了です。

# 3. OCI Database with PostgreSQLの作成

OCI側の設定を進めていきます。
まずは、データベースが必要となるため、コンソール画面から作成していきます。

OCIのコンソール画面にログインし、ナビゲーションメニューからPostgreSQL＞データベースを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/25bf52b7-566d-840a-1d93-74853a7eedbf.png)

新規データベースの作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/80d3d990-09ae-9314-7412-dd7700928b8c.png)

次へボタンを押下し、必要項目を入力していきます。

|項目  |入力内容
|---|---
|データベース構成|
|Database system name  |test-postgresql（任意）
|PostgreSQLバージョン|14（固定）
|データベース・システム  |
|ノード数  | 1
|Performance tier|300k IOPS（固定）
|ハードウェアの構成|
|OCPU数|2
|使用可能なシェイプ|PostgreSQL.VM.Standard.E4.Flex.2.32GB を選択
|ネットワーキングの構成|
|仮想クラウド・ネットワーク|（任意のVCNを指定）
|サブネット|（任意のサブネットを指定）
|プライベートIP オプション|（空欄）
|データベース管理者資格証明|
|ユーザー名|(任意)
|Password options|Input password を選択
|Password|(任意)
|Confirm password|(任意)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f22aab68-c954-6b09-da3a-5f60be7b45f5.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/00c1c4fb-f34b-a69c-1260-0112e39a367d.png)
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/450a24f8-8981-b9fb-bc79-3ada263c67f6.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0dfc5915-2486-e9a4-5664-2e28074964cf.png)

必要項目を入力した後、サマリ画面が表示されるので、送信ボタンを押下します。
作成されるまで10-20分ほど待機します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9953f5e1-e2c6-72c3-d08f-00ee89fe0e9c.png)

データベースが作成されました！

# 4. pg_restoreを利用したリストアの実行

# 4-1. postgresqlクライアントのインストール
2-1. PostgreSQLクライアントのインストールと同様に、OCIのCompute VMインスタンスにもPostgreSQLクライアントをインストールします。
なお、OCI側のOSはOracle Linux8を使用しています。

インストール方法については、こちらの記事を参考にしました。

https://qiita.com/dingtianhongjie/items/8547e156fb8e4528733e#postgresql-cli%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

# 4-2. OCI Database with PostgreSQLへの接続

下記コマンドを実行し、接続します。
この<endpoint>はOCI Database with PostgreSQLのDBシステムの詳細から確認できます。
同じVCNの中にあるCompute VMインスタンスから接続する場合、Endpoint,FQDNどちらからも接続が可能です。

```
[opc@test-instance ~]$ psql -h <endpoint> -U <usename> -d postgres
Password for user yamadas: 
psql (14.10, server 14.9)
WARNING: psql major version 10, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> 
```
接続が確認できました！

# 4-3. リストアの実行

まず、データベースを作成します。
```
postgres=> create database oci_dvdrental;
CREATE DATABASE
```
postgresqlを抜けて、ローカルからアップロードしたfromaws_dvdrental.tarを使用してリストアを実行します。
```
postgres=> exit
[opc@test-instance ~]$ pg_restore -h <endpoint> -U <usename> -O -d oci_dvdrental fromaws_dvdrental.tar
```

# 4-4. テストデータの確認

再度OCI Database with PostgreSQLへ接続します。
oci_dvdrentalにデータベースを切替え、テーブルを確認し、データを確認します。

```
postgres=> \c oci_dvdrental
psql (14.10, server 14.9)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
You are now connected to database "oci_dvdrental" as user "yamadas".
oci_dvdrental=> \dt;
            List of relations
 Schema |     Name      | Type  |  Owner  
--------+---------------+-------+---------
 public | actor         | table | yamadas
 public | address       | table | yamadas
 public | category      | table | yamadas
 public | city          | table | yamadas
 public | country       | table | yamadas
 public | customer      | table | yamadas
 public | film          | table | yamadas
 public | film_actor    | table | yamadas
 public | film_category | table | yamadas
 public | inventory     | table | yamadas
 public | language      | table | yamadas
 public | payment       | table | yamadas
 public | rental        | table | yamadas
 public | staff         | table | yamadas
 public | store         | table | yamadas
(15 rows)

oci_dvdrental=> select * from actor limit 5;
 actor_id | first_name |  last_name   |      last_update       
----------+------------+--------------+------------------------
        1 | Penelope   | Guiness      | 2013-05-26 14:47:57.62
        2 | Nick       | Wahlberg     | 2013-05-26 14:47:57.62
        3 | Ed         | Chase        | 2013-05-26 14:47:57.62
        4 | Jennifer   | Davis        | 2013-05-26 14:47:57.62
        5 | Johnny     | Lollobrigida | 2013-05-26 14:47:57.62
(5 rows)
```

Aurora PostgreSQLで確認した同様のデータが確認できました！


# まとめ

pg dump, pg restoreによる、Amazon Aurora PostgreSQLから、11月中旬にGAされたOCI Database with PostgreSQLへの移行を検証しました。
移行作業の一助になりましたら幸いです。