【OCI クラウド移行ガイド】 Amazon Redshift から OCI Autonomous Data Warehouse へ移行してみた

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

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

# 移行するサービス：Amazon Redshift
今回、移行対象とするのはAmazon Redshiftです。
SQL DeveloperのAmazon Redshift移行アシスタントを用いて、Amazon RedshiftをAutonomous Data Warehouseに移行する手順を解説します。
SQL Developerでは、Amazon Redshift以外にも、MySQL Database、Microsoft SQL Server、Sybase Adaptive Server、IBM DB2、TeradataなどのOracle Databaseエンジン以外のソースDBから、Autonomous Databaseにスキーマ・オブジェクトおよびデータをコピーする機能が用意されています。

https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/migrate-autonomous-database.html

RedshiftのDBエンジンはPostgreSQLベース、Autonomous Data WarehouseはOracle Databaseですが、Amazon Redshift移行アシスタントによって自動的にDDL文を生成し、いい感じにデータ変換を行ってくれます。

# 移行方式

OCI Compute VM上のSQL DeveloperからAmazon Redshift,Autonomous Data Warehouseの双方に接続し、SQL DeveloperのAmazon Redshift移行アシスタント機能を使用して移行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/61bd8ef8-2ee4-a887-2c05-c60849ea3226.png)


https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/migrating-amazon-redshift.html#GUID-B8CC24A7-84EC-48E3-B312-42C75F61152E


# 前提条件

:::note warn
今回はデータの移行検証を目的としているため、リソースは全てパブリックアクセスすることを前提としています。本番環境の移行時には、リソースのプライベート接続考慮、両クラウド間の閉域接続を推奨いたします。AWS-OCI間のVPN接続については下記記事をご参照ください。

【OCI クラウド移行ガイド】 AWSとOCIをVPNで接続してみた
https://qiita.com/yama6/items/c188de191269cb604341
:::

- [x] Redshift,Autonomous Data Warehouseに接続するための、Windows Server 2019のComputeVMがパブリックサブネット上に構築されていること
Windows Server 2019の構築については、下記記事を参考にさせていただきました。

https://qiita.com/Skogkatter112/items/ee834376bbc7dab5bc56

- [x] Redshiftへのパブリックアクセスを許容するVPCリソースが設定されていること
Redshiftのパブリックアクセス設定については、下記記事を参考にさせていただきました。

https://qiita.com/peanuts2013/items/748c99fcee288b8feecd


# 移行手順
1. ComputeにSQL Developerインストール
1. Amazon Redshift JDBC ドライバー設定
1. Redshift 作成
1. 接続確認 SQL Developer→Redshift
1. ADW 作成
1. 接続確認 SQL Developer→ADW
1. データインポート用のS3作成
1. RedshiftからS3へのデータアンロードユーザ作成
1. 移行アシスタント機能実行
1. 移行結果確認

# 1. ComputeにSQL Developerインストール

Compute VMにRDP接続後、ブラウザから下記ページにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5c527979-2e6a-340f-536c-02e5454ccab5.png)

https://www.oracle.com/database/sqldeveloper/technologies/download/

Windows 64-bit with JDK 11 included をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/f26e64d7-a492-cfd6-02fa-a38107ffa051.png)

 ※ダウンロード時に、「現在のセキュリティ設定では、このファイルをダウンロードできません。 」と表示されるので、下記手順でファイルのダウンロードを有効化してください。
[インターネット オプション] > [セキュリティ] タブ > [レベルのカスタマイズ] ボタン > [セキュリティ設定] ダイアログの「ファイルのダウンロード」 > 「有効にする」

ダウンロード後、zipファイルを解凍し、"sqldeveloper"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b66bca75-005e-0898-f12d-8d19b90b9ae3.png)

ロード完了後、SQL Developerが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/66f0e8fd-978a-68dc-19e7-29cd3b6b2ddc.png)

SQL Developerのインストール作業は以上になります。

# 2. Amazon Redshift JDBC ドライバー設定

SQL DeveloperからJDBC ドライバーでRedshiftへ接続するため、設定を進めていきます。

### Amazon Redshift JDBC ドライバーのダウンロード

下記ページより、「JDBC 4.2 互換ドライバーバージョン 2.1」をWindwos Serverにダウンロードし、zipファイルを解凍します。

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/jdbc20-download-driver.html

### Amazon Redshift JDBC ドライバーのプリファレンス設定

ツール→プリファレンスを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e151fef4-536a-bcb6-2420-4ec6f5b97d4f.png)

画面左のナビゲーションペインから、「データベース」→「サード・パーティJDBCドライバ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/aae1249f-00bb-801b-ea7a-c1f55c1295b3.png)

エントリの追加ボタンを押下し、ダウンロード＆解凍したフォルダから、"redshift-jdbc42-2.1.0.29.jar" を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/65b32ee4-7e83-e760-af35-632dda864656.png)

エントリ登録されたことを確認したら、OKボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b1ad266c-a01f-0b7f-ec24-4408cd58b730.png)

### 設定確認

画面左の「接続」→「新規データベース接続」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0129acf6-2df7-eb4e-00fe-53f36210b7c8.png)

Amazon Redshift JDBC ドライバーを設定したことで、「データベースのタイプ」タブを選択した際に、"Amazon Redshift"が表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ee1bd1c7-193c-f82c-4a0b-58418dc907ac.png)

ドライバーの設定作業は以上になります。
移行対象のRedshiftを作成し、ここから繋げられるか確認していきましょう。

# 3. Redshift 作成

下記手順を参考に、Redshiftを作成します。

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/tutorial-loading-data-launch-cluster.html

以下、手順との変更点のみ記載します。

ノードの種類はdc2.large、ノード数は1に設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5d6ad498-aaed-4715-cb37-7f2c9540bbff.png)

作成時にデータを入れるため、「サンプルデータをロード」にチェックを入れます。
自動的にTICKETというサンプルデータベースが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/65efc6a5-ded2-e0ca-954c-19cb9948338f.png)

SQL Developerからの簡易的な接続を考慮し、管理者パスワードは手動追加を選択しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6f8a79b3-793f-1abc-e8b6-53545782bcfd.png)

追加設定「デフォルトを使用」のタブをオフにし、VPCの設定をします。
今回は、Redshift へのパブリック接続を許可するために「[パブリックにアクセス可能] をオンにする」にチェックを付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c1c90dcf-0549-2614-c36a-d488a31ec10c.png)

クラスターサブネットグループは、AZが異なる3つのパブリックサブネットを登録しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/16b87cef-1ff7-407c-eef5-61878cf158c9.png)

あとは作成ボタンを押下し、Redshiftが作成されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b994b52d-0248-f1bf-a178-6adbd745fdf7.png)

コンソール画面から、タブ「データベース」を選択し、「データベース接続」からデータベース名、ユーザ名を入力し、「接続」ボタンを押下するとスキーマ情報が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/76ea2ff9-14e8-f38d-b5e3-7d5355fb6cf1.png)

TICKETデータベースを構成するテーブルを確認することができました。
次に、SQL Developerからも接続を確認していきましょう。

# 4. 接続確認 SQL Developer→Redshift

画面左の「接続」→「新規データベース接続」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0129acf6-2df7-eb4e-00fe-53f36210b7c8.png)

「データベースのタイプ」タブを開き、"Amazon Redshift"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ee1bd1c7-193c-f82c-4a0b-58418dc907ac.png)

Nameにredshift（任意文字列入力）、Redshiftを作成した際に設定したユーザー名、パスワードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5583fab7-1d0a-bd69-8dbc-271aa7542cfd.png)

Amazon Redshift JDBC URLは、Redshiftのコンソール画面から文字列を取得し、入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b0584f05-b972-9cd2-5bf4-d07464b7640c.png)

接続ボタンを押下します。
接続に成功すると、画面左の接続ナビゲーションに、redshiftが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ebe22887-62ba-4ed0-9c4f-3467d40966c9.png)

:::note warn
接続に失敗する場合は、「[パブリックにアクセス可能] をオンにする」チェックが付いているか、Redshiftで設定したサブネットグループを構成するサブネットがインターネットゲートウェイにルートがあるか、セキュリティグループがRedshiftの接続ポート5439でインバウンドが許可されているかを確認してください。
:::

Redshift作成時に自動ロードしたデータが格納されていることも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e326cf49-3a41-c759-2912-4488c438a844.png)

移行元であるRedshiftの準備作業は完了です。
次に、移行先であるAutonomous Data Warehouseを作成していきます。

# 5. Autonomous Data Warehouse の作成

下記手順に従ってAutonomous Data Warehouseを作成します。

https://oracle-japan.github.io/ocitutorials/adb/adb101-provisioning/#2-adb%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

ワークロード・タイプには、分析系システムを対象とするAutonmous Data Warehouse (ADW)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c80aa124-9537-901a-29ae-71d0aad08082.png)

データベース・バージョンは19cを選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/386b8e0f-3b3b-12aa-4bd5-2b6358c969b1.png)


ネットワーク・アクセスは、「許可されたIPおよびVCN限定のセキュア・アクセス」を選択し、IPアドレスには、事前に立てたWindows ServerのComputeVMが持つパブリックIPを指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d9d1198a-b273-0ab5-9877-21ca22e3a0dc.png)

Autonomous Databaseの作成 ボタンを押下し、プロビジョニングの完了を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/08f09060-b3bb-6dda-2189-24b6caa5c231.png)

Autonomous Data Warehouseの作成作業は以上です。

# 6. 接続確認 SQL Developer→ADW

SQL DeveloperからAutonomous Data Warehouseへの接続を確認します。

### 事前準備：クラウド・ウォレットのダウンロード

SQL Developerから接続する際に、クラウド・ウォレットが必要となります。
OCIコンソール ADWの詳細画面から、「データベース接続」を押下し、Windows Server上にウォレットをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3dd067a3-0f32-395e-2be5-027d2f6a3eff.png)

### SQL Developerからの接続

画面左の「接続」→「新規データベース接続」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/0129acf6-2df7-eb4e-00fe-53f36210b7c8.png)

「データベースのタイプ」タブが "Oracle"に設定されていることを確認します。
接続タイプのタブを押下し、「クラウド・ウォレット」を選択します。
「構成ファイル」フィールドの「参照」ボタンをクリックし、事前準備でダウンロードしたクラウド・ウォレットのzipファイルを選択します。
ユーザ名、パスワードに、ADWを作成した際のユーザ名、パスワードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ad661ce8-ddd6-e6a1-6e6f-eb65779387a1.png)

接続ボタンを押下し、画面左の「接続」にADWが追加されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/06a98275-eb8d-8e30-c082-b158d2c013ff.png)

:::note warn
接続に失敗する場合は、「許可されたIPおよびVCN限定のセキュア・アクセス」にて設定したIPアドレスに、SQL　Developerを操作しているWindows ServerのパブリックIPが設定されているかを確認してください。
:::

以上でADWの接続確認は完了です。いよいよ本題の、RedshiftからADWへデータベースを移行作業に移ります。

# 7. データインポート用のS3作成
ADWからRedshiftに直接アクセスすることはできないため、移行データを格納するためのステージング環境として、S3が必要となります。
下記の手順に従ってS3を作成します。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/creating-bucket.html

今回は、パブリックアクセスをONにしています。
移行アシスタント利用時にこのS3のバケット情報が必要となります。（後述）

# 8. RedshiftからS3へのデータアンロードユーザ作成
### 目的
移行アシスタントを実行すると、RedshiftがS3へデータをアンロードします。
このとき、移行アシスタントが本処理の実行権限を持つ必要があります。
移行アシスタントからS3へのデータアンロード操作実行権限はIAMユーザの資格情報を用います。
というわけで、S3アクセス権限を持つIAMユーザを作成していきます。

### IAMグループの作成
下記を参考に、"adw"という名前のIAMグループを作成します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_groups_create.html

### IAMユーザの作成

下記を参考に、"adwuser"という名前のIAMユーザを作成します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/01f54584-b07b-bc15-cdac-8c4a10f91499.png)

### IAMグループへのユーザ追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e8cd4d44-b68e-0f31-f214-8a4cfc9a4372.png)

作成したadwグループにユーザを追加します。
最期に、「ユーザを作成」ボタンを押下します。

### 資格情報（アクセスキー、シークレットアクセスキー）の設定

ユーザ作成後、ユーザー一覧から"adwuser"を選択し、「セキュリティ認証情報」のタブを押下します。
「アクセスキー」フィールドの「アクセスキーを作成」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e16acd83-e927-bb75-4aa8-3159b80f10ec.png)

「その他」を選択し、「次へ」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ec144eba-0394-ab58-d6a1-0cc660e61689.png)

説明タグ値には適当な文字列を入力し、「アクセスキーを作成」ボタンを押下します。
作成後表示される「アクセスキー」と「シークレットアクセスキー」をメモします。

### インラインポリシーの作成
「許可」タブを押下し、「許可の追加」ボタンを押下して「インラインポリシーの追加」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4102ecf9-545c-fd8a-76ad-7db360650f35.png)

サービスの選択で"S3"を選択します。
「すべての S3 アクション (s3:*)」にチェックを入れ、「リソース」で「すべて」を選択します。
「次へ」ボタンを押下し、ポリシー名に適当な文字列を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/008f2c68-2a95-fc4d-ea6c-7526baaa05c6.png)

「ポリシーの作成」ボタンを押下します。
以上でユーザ作成作業は完了です。

# 9. 移行アシスタント機能実行

SQL Developerに戻り、先ほど作成したユーザ権限で移行アシスタント機能を実行していきます。

### 移行画面の表示

ツール→移行→クラウド移行を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/20bb38cf-1449-4e43-2ec8-6ad06aeb2bc7.png)

すると、RedshiftからAutonomous Data Warehouseへの移行画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/36594210-f6c5-63dd-39c3-eebf40f230f1.png)

### プロパティの入力と選択

|項目 |入力設定値
|---|---
|接続|redshiftを選択
|選択したスキーマ|「使用可能なスキーマ」から"public"を >ボタンで選択
|データを含める|チェックを入れる
|AWSアクセスキー|「資格情報（アクセスキー、シークレットアクセスキー）の設定」で取得したアクセスキー
|AWS秘密アクセス|「資格情報（アクセスキー、シークレットアクセスキー）の設定」で取得したシークレットアクセスキー
|S3バケットURI|「データインポート用のS3作成」で作成したS3のバケットURI *


今回一番のトラップはS3バケットのURI形式でした。

S3バケットURIは下記形式に従います。
```ruby:S3バケットURIの形式
https://s3.リージョン名.amazonaws.com/バケット名
```

:::note alert
S3バケットURI形式について
下記ドキュメントでは、「https://s3-リージョン名.amazonaws.com/バケット名」 となっていますが、この形式で実行するとスキーマ・オブジェクトは移行できてもデータだけ移行できない結果となりました。

Autonomous DatabaseへのAmazon Redshiftの移行
https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/migrating-amazon-redshift.html#GUID-37FF7BD6-E52C-4ECB-912D-5614B62B4CCE

s3のあとの -（ハイフォン）を .（ドット）に読み替える必要があります。

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/56d8fdd0-6bc6-61d3-b721-1807193f2f5e.png)


「次へ」ボタンを押下します。

### ターゲット情報確認
移行アシスタントを実行すると、移行のためにSQLDEV_MIGREPOSという内部ユーザが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8058f391-b381-c7b8-ff4d-2295192a0651.png)

移行オプションで「今すぐ移行」にチェックを入れます。
「次へ」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e3a31f46-2820-a325-edf6-db8400521017.png)

「終了ボタン」を押下すると、移行アシスタントが実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d59a1f43-602a-2e54-db92-55d3149fac6b.png)

ポップアップにてRedshiftMigrationTaskは9段階で実行されます。
9/9が完了したら実行自体は終了です。

### 実行ログ確認
実行ログは、ステップ2/3で画面表示されたディレクトリにフォルダが生成され、格納されます。
"redshift_migration_reportYYYY-MM-DDTHH-MM-XX.XXXXXXXXZ" ファイルを確認します。

```
This is a generated Redshift Migration Report file 'redshift_migration_report'.
______________________________________________________________

______________________________________________________________
OPERATION ID      : 8
LOGFILE TABLE     : COPY$8_LOG
BADFILE TABLE     : COPY$8_BAD
SOURCE SCHEMA     : public
TARGET SCHEMA     : PUBLIC_
SOURCE TABLE      : category
TARGET TABLE      : CATEGORY
SOURCE TABLE ROWS : 11
TABLE ROWS LOADED : 11
ERROR MESSAGE     : null
STATUS            : COMPLETED
START TIME        : 2024-08-31 13:27:50.816938
END TIME          : 2024-08-31 13:27:54.874944
______________________________________________________________
…
```
上記のようにテーブルごとにログが出力されます。
スキーマ名を比べてみると、ソーススキーマが"public"であったことに対し、ターゲットスキーマは"PUBLIC_"に変換されていることがわかります。
SOURCE TABLE ROWSとTABLE ROWS LOADEDの行数が一致し、STATUSがCOMPLETEDになっていればツール実行は成功です。

# 10. 移行結果確認

Redshift,ADWそれぞれで対応するテーブルに対して、下記の同じSQLを実行します。

```ruby:Redshift
select * from public.users;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/4642b814-6489-9e64-658d-5443622edf7e.png)

```ruby:ADW
select * from public_.users;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/991b0f65-4e90-23c5-23a1-7dc96afdb641.png)

RedshiftからADWへ同じ内容のデータが移行されていることが確認できました。

# おわりに
SQL DeveloperからRedshiftとADWの双方に繋いでさえしまえば、ソースとターゲットの設定だけで簡単に移行できることが実感できました。プラットフォームが異なるサービスでも、共通のViewerでデータを確認できるので便利です。
この移行アシスタントでは、他のDBエンジンからAutonomous Databaseへの移行機能も提供しています。次回以降、SQL Serverなどの移行を試してみたいと思います。

# 参考

https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/migrating-amazon-redshift.html#ADBSB-GUID-A00E1C78-BCB1-46E9-97FA-DD1B377DF1F2