🐁

AWSのチュートリアル、RDS for OracleからRedshiftへの移行をやってみた

commits10 min read

概要

AWSには豊富なチュートリアルが用意されており、中には実践相当のモノもあります。

Oracle DBからRedshiftへデータを移行するという実際の仕事にもあり得そうなシチュエーション形式のチュートリアルがありましたので、体験してみました。
Redshiftは試験勉強の際に出てきて実際に触ったことがなかったので、このチュートリアルを通してRedshiftの理解を深めてみました。

https://aws.amazon.com/jp/getting-started/hands-on/migrate-oracle-to-amazon-redshift/
ただ、こちらのチュートリアルはメンテナンスが全然されておらず、書いてあることをそのまま実行してもうまくいかない部分が何箇所かありました。
なので、ハマったポイントを紹介してほかの人の助けになればと思います。

Amazon Redshiftについて

チュートリアルの前にAmazon Redshift(以下Redshift)について簡単に説明いたします。
Redshiftは大容量のデータを格納し、データを分析するのに最適なデータウェアハウス(DWH)と呼ばれるマネージドサービスです。
データベースはデータを取得し、保存するのには向いていますが大量のデータを分析するには不向きとなるケースがあります。
データウェアハウスはビッグデータの分析やレポートといったユースケースに最適です。
Redshiftは高速で完全マネージド型、ペタバイト規模のデータウェアハウスであり、多くの企業で利用されています。

https://aws.amazon.com/jp/redshift/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc

チュートリアルについて

チュートリアルではRDS上で稼働しているOracleデータウェアハウスからRedshiftへ移行するためのハンズオンとなっております。
前述したとおり、Redshiftへ移行することでデータ分析のパフォーマンス改善、コスト削減、スケーラビリティの向上といったメリットがあります。

具体的な手順は以下のとおりです。

AWS Schema Conversion Tool (AWS SCT) を使用して、Amazon Relational Database Service (Amazon RDS) 上で稼働しているサンプルの Oracle データウェアハウスから、データウェアハウススキーマとコードを変換します。AWS SCT はソースのスキーマとカスタムコードの大部分を、Amazon Redshift と互換性のあるフォーマットに自動的に変換できます。AWS SCT は変換不能なコードに明確な印を付けるので、手作業で変換できます。

AWS Database Migration Service (AWS DMS) を使用して、Oracle データウェアハウスから Amazon Redshift へデータを移行します。AWS DMS を使用することで、AWS マネジメントコンソールで数回クリックするだけで、データの移行を始められます。ソースデータウェアハウスは移行中も通常どおり運用できます。

ソースとターゲットのデータウェアハウス間のオブジェクトタイプ、オブジェクト数、各テーブルの行数を検証する SQL クエリを実行するなど、移行後のアクティビティを実行します。

実際のチュートリアル手順は以下のリンクから入れますので、皆さんも是非体験してみてください。

https://docs.aws.amazon.com/ja_jp/dms/latest/sbs/chap-rdsoracle2redshift.steps.html

Step1 CloudFormationテンプレートを使用してVPCでRDSインスタンスを起動する

まずは各種AWSリソースをプロビジョニングします。ページ内に埋め込まれているCloudFormationのテンプレートファイルをダウンロードします。

説明に従ってCloudFormationへテンプレートファイルをアップロードし、各種パラメータも自動で埋め込まれていますので、そのままスタックの作成まで実行すればRDSインスタンスが作成される予定でした。
ところが作成途中でRDSの作成に失敗してロールバックされました。

内容を確認しますと、DBインスタンスタイプがdb.m3.mediumでRDS for Oracleに対応していないと書かれています。

Oracle_Redshift_For_DMSDemo.template
    "OracleRDSInstanceType": {
      "ap-northeast-1": {
        "inst": "db.m3.medium"
      }, 
      "ap-northeast-2": {
        "inst": "db.t2.medium"
      },

なので、インスタンスタイプを現行のタイプに変更します。(t2系も念のためt3系に変更しておきます)

Oracle_Redshift_For_DMSDemo.template
    "OracleRDSInstanceType": {
      "ap-northeast-1": {
        "inst": "db.m5.large"
      }, 
      }, 
      "ap-northeast-2": {
        "inst": "db.t3.medium"
      }, 

ちなみにRedshiftも旧世代のインスタンスタイプを使っていましたが、こちらは問題なく作成されました。

Oracle_Redshift_For_DMSDemo.template
        "NodeType": "dc1.large", 
        "Port": "8192", 
        "PubliclyAccessible": "true", 
        "DBName": {
          "Ref": "RedshiftDBName"
        },

テンプレートファイルを修正して再度スタックの作成ボタンをクリックすれば、プロビジョニングが完了しますので出力ページからOracleJDBCConnectionStringRedshiftJDBCConnectionStringの値を控えておきます。

Step2 SQLツールとAWS Schema Conversion Toolをローカルコンピュータにインストールする

次にローカルマシン上からDBベースに接続するためにSQLクライアントツールをインストールします。
使い慣れたものがありましたらそれでもいいですが、こだわりがなければチュートリアルで、紹介しているSQL Workbench/Jを使ってもいいでしょう。

https://www.sql-workbench.eu/downloads.html

インストールしましたら、OracleとRedshiftのJDBCドライバーもダウンロードします。ダウンロードしたOracleとRedshiftのJDBCドライバーをSQL Workbench/Jクライアントに関連付けます。
完了しましたら次にAWS SCTをインストールします。

AWS Schema Conversion Tooは、ソースデータベーススキーマ、およびビュー、ストアドプロシージャ、関数といったデータベスコードオブジェクトの大部分を自動的にターゲットデータベース互換フォーマットへと変換することにより、異種データベース間の移行を計画的なものにします。

https://aws.amazon.com/jp/dms/schema-conversion-tool/
インストールが完了しましたら、Step内の説明に沿って初期設定をしていきます。

Step3 Oracle DB インスタンスへの接続をテストしてサンプルスキーマを作成する

次にOracleDBインスタンスに移行元となるデータを流し込みます。クライアントマシンからSQL接続するためにSQL Workbench/Jを起動し、接続画面からOracleDBのJDBCドライバとOracleJDBCConnectionStringで控えたURL、Step内に記載されている他パラメータをセットして、テスト接続を行います。テスト接続が完了しましたら、移行元データを流し込む作業へ入ります。
元データはCloudFormationのテンプレートが入っていたzipファイルの中にあるOraclesalesstarschema.sqlを使います。これをSQL Workbench/Jに張り付けてSQLを実行します。
流し込みましたら、Step内の確認SQLコマンドを実行して数を確かめます。チャネル別の販売数の数だけ例と比べるとぴったりと半分になっていますが、ここでは無視して先に進めます。

ステップ4 Amazon Redshiftデータベースへの接続をテストする

続いて、Redshiftの接続テストを行います。こちらも同じようにSQL Workbench/Jから接続画面を開き、RedshiftのJDBCドライバとRedshiftJDBCConnectionStringで控えたURL、Step内に記載されている他パラメータをセットし、テスト接続をします。すると接続失敗のポップアップがでました。
もう一度CloudFormationのテンプレート文を調べてみましたが、Step内で記載されているUsernameの値がデフォルトで設定したテンプレート部分と異なっていました。

Oracle_Redshift_For_DMSDemo.template
    "RedshiftDBUsername": {
      "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*", 
      "ConstraintDescription": "must begin with a letter and must be 1 - 128 alphanumeric characters", 
      "Default": "masteruser",  #デフォルトユーザーネーム
      "Description": "Enter master user name for Redshift", 
      "MaxLength": "128", 
      "MinLength": "1", 
      "NoEcho": "false", 
      "Type": "String"
    }

Username箇所をmasteruserに変更してもう一度テスト接続をすることで、Redshiftに接続することが成功しました。
確認用のSQLコマンドも問題なく実行されました。

ステップ5 AWS SCTを使用してOracleスキーマをAmazon Redshiftに変換する

OracleのデータをRedshiftに移行する前にスキーマを変換する必要があります。
AWS SCTを起動し、OracleとRedshiftの接続設定を行っていきます。

Redshiftの接続失敗

チュートリアル内で使われているAWS SCTはバージョンが古いからなのかチュートリアル内のパラメータだけを設定してもOKボタンがアクティブ化されませんでした。

AWS GlueのタブをクリックしますとGlueの設定が有効になっているとGlueの設定も必須になるようです。

今回のチュートリアルでは使いませんのでProject SettingからAmazon Glueの使用を無効化します。

チュートリアルではポート番号を5439で指定していますが、CloudFormationの出力パラメータを確認すると8192でしたので、8192を指定します。

接続できましたらStepの手順に沿ってOracleのSHスキーマをRedshiftのフォーマットへ変換させます。

ステップ6 スキーマ変換の検証

次にスキーマ変換できたか検証します。
SQL Workbench/Jを起動しRedshiftに接続します。
以下のSQLコマンドを実行すれば、Oracleのテーブルと一致していることがわかります。

SELECT 'TABLE' AS OBJECT_TYPE,
       TABLE_NAME AS OBJECT_NAME,
       TABLE_SCHEMA AS OBJECT_SCHEMA
FROM information_schema.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND   OBJECT_SCHEMA = 'sh';

ステップ7 AWS DMSレプリケーションインスタンスの作成

スキーマ変換の検証が完了しましたらいよいよチュートリアルのコアとなるデータ移行を実施します。
データ移行ではAWSのマネージドサービスであるAWS Database Migration Service(DMS)を利用します。

https://aws.amazon.com/jp/dms/

DMSはレプリケーションインスタンスを作成し、ソースDBからターゲットDBへデータを移行してくれます。

チュートリアルに沿ってレプリケーションインスタンスを作成します。

インスタンスクラスはt2ではなく現行世代のt3を使用します。

ステップ8 DMSソースDBとターゲットDBのエンドポイント作成

レプリケーションインスタンスを作成しましたら、ソースDBとターゲットDBのエンドポイントを作成します。

ソースエンドポイント作成

DMSもチュートリアル時点と比べていくつかアップデートされていましたので、変更点を記載します。
RDS DBインスタンスの選択にチェックをつければ下のドロップダウンリストからRDSインスタンスを選択できますのでCloudFormationで作成したOracleDBインスタンスを選択します。

エンドポイントデータベースへのアクセスは「アクセス情報を手動で提供する」を選択すればチュートリアルの項目が入力できます。

オプションで接続テストもできるようになっていますので、入力情報に間違いがないか確かめてみるのもいいでしょう。

ターゲットエンドポイント作成

ターゲットエンドポイントも同様に作成していきます。
アクセス方法を「アクセス情報を手動で提供する」を選択すれば、同じようにチュートリアルの項目が入力できます。

ステップ9 DMS マイグレーションタスクの起動

DMSのタスクを使用して、移行するスキーマと移行のタイプを指定できます。
データ移行タスクの作成もチュートリアル通りで問題ありません。
タスク設定については編集モードをウィザードにすれば、チュートリアルで選択するパラメータが表示されますので、順次進めていきます。

作成すると自動でタスクは実行されます。

ステップ10 データ移行完了の検証

タスクが完了しましたらデータ移行が完了していますので、確認します。

タスクをクリックし、テーブル統計タブを選択します。

再びSQL Workbench/Jを起動しRedshiftに接続します。
以下のSQLコマンドを実行し、テーブル名と行数が一致していることを確認します。

select "table", tbl_rows
from svv_table_info
where
SCHEMA = 'sh'
order by 1;

これでOracleからRedshiftへのデータ移行のチュートリアルを完了できました。

ステップ11 使用したリソースの削除

今回使用したAWSリソースはほっとくだけでもそれなりのコストになりますので、忘れないようにしっかりと削除します。

DMSリソース削除

DMSは作成したリソースを逆から削除していきます。


CloudFormationスタック削除

CloudFormationで作成したDBも忘れずに削除します。

所感

AWSのチュートリアル、「OracleからAmazon Redshiftに移行する」を体験しました。
当初は使っているPCのスペックが低くAWS SCTで必ずフリーズして先に進むことができませんでした。
新しくPCを購入し、やっとこのチュートリアルが完了できました。
チュートリアルも作成時点からいくつか変更されている部分がありましたので、この記事をお読みいただいて、トラップを回避できれば幸いです。