Amazon Web Services ブログ

AWS Schema Conversion Tool ブログシリーズ: ビルド 617 の新機能紹介



今回は、AWS Schema Conversion Tool (AWS SCT) 新バージョンをご紹介します。このバージョンには、テーブル値関数の変換のサポート、サーバーレベルの評価レポートへの追加情報などが含まれます。

AWS SCT とは、あるデータベースエンジン上の既存のデータベーススキーマを別のデータベースエンジン用に変換するためのツールです。リレーショナル OLTP スキーマやサポート対象のデータウェアハウス OLAP スキーマを Amazon RDS に変換することができます。たとえば、MySQL や PostgreSQL などと互換性があるため、Amazon Aurora に変換できます。また、リレーショナル OLTP スキーマやサポート対象のデータウェアハウス OLAP スキーマを Amazon Redshift に変換することも可能です。サポートされているすべてのソースおよびターゲットは、AWS SCT ドキュメントで確認できます。

以下に、この記事で説明するトピックの概要を示します。

  • Microsoft SQL Server から PostgreSQL へ – テーブル値関数の変換
  • SQL Server から PostgreSQL/MySQL へ – テーブル型変数の変換
  • SQL Server から PostgreSQL へ – MERGE ステートメントの実装
  • Oracle から PostgreSQL 10 へ – タイムゾーンデータなしで、列によるパーティションへのタイムスタンプ変換をサポート
  • Oracle から Amazon RDS for Oracle へ – 追加のサーバーレベルオブジェクト
  • SQL Server から Amazon RDS for SQL Server へ – 追加のサーバーレベルオブジェクト

これらの機能について詳しく見ていきましょう。

SQL Server から PostgreSQL へ – テーブル値関数

AWS SCT バージョン 616 では、複数ステートメントのテーブル値関数のエミュレーションで、データへのアクセスに一時テーブルを使用していました。AWS SCT は、まず一時テーブルを作成、データを入力して、テーブル値関数にアクセスする代わりにその一時テーブルにアクセスしていました。

バージョン 617 では、複数ステートメントのテーブル値関数は、元のテーブル値関数と同様の構造のテーブルを返します。 一時テーブルは複数ステートメントのテーブル値関数内部でのみ使われ、SQL Server で使用される可能性があるすべての DML をエミュレートします。 複数ステートメントのテーブル値関数外部では一時テーブルを使用しません。

以下にこの変更についての例を示します。

SQL Server テーブル型の実装

ユーザー定義のテーブル型はデータベースオブジェクトとして作成され、属性名とデータ型の一覧で定義されます。ユーザー定義のテーブル型として宣言されたテーブル値パラメータを使用すると、一時テーブルや多数のパラメーターを作成せずに、複数のデータ行を Transact-SQL ステートメントやルーチン (ストアドプロシージャや関数など) に送ることができます。

ターゲット: PostgreSQL および MySQL の場合

PostgreSQL および MySQL では、ユーザー定義のテーブル型をサポートしていませんが、一時テーブルを使用することで同様の機能を実行できます。

以下の例では、プロシージャとテーブル型に SQL Server ソースで作成された SELECT ステートメントを使用しています。

ソース (SQL Server) のテーブル型とプロシージャ:

CREATE TYPE Employee2Client AS TABLE(
    EmployeeID INT
  , EmployeeName VARCHAR(160)
  , ClientID INT
  , ClientName VARCHAR(160)
)
CREATE PROCEDURE [dbo].[PROC_CREATE_PROC_005]
  @p_E2C Employee2Client READONLY
AS
BEGIN
  SELECT *
    FROM @p_E2C
   WHERE UPPER(ClientName) 
     LIKE CONCAT('%', UPPER('bank'), '%');
END;

ターゲット: PostgreSQL の場合

以下のオブジェクトが PostgreSQL でテーブル型のエミュレート用に作成されます。

  • 複合型
  • ドメイン: 複合型の配列として宣言
  • 関数: 一時テーブルを作成

AWS SCT に変換されるコード (PostgreSQL): 

CREATE TYPE ramya_dbo.employee2client$aws$t AS (
employeeid NUMERIC(10,0),
employeename VARCHAR(160),
clientid NUMERIC(10,0),
clientname VARCHAR(160)
);

CREATE DOMAIN ramya_dbo.employee2client AS 
    ramya_dbo.employee2client$aws$t [] NOT NULL;

CREATE OR REPLACE FUNCTION ramya_dbo.employee2client$aws$f
(IN variable_name VARCHAR)
RETURNS void
AS
$BODY$
BEGIN
    EXECUTE 'DROP TABLE IF EXISTS ' || variable_name;
    EXECUTE 'CREATE TEMPORARY TABLE ' 
    || variable_name || ' ramya_dbo.employee2client$aws$t WITH OIDS;';
END;
$BODY$
LANGUAGE  plpgsql;


CREATE OR REPLACE FUNCTION ramya_dbo.proc_create_proc_005
(IN par_p_e2c ramya_dbo.employee2client, OUT p_refcur refcursor)
AS
$BODY$
BEGIN
    OPEN p_refcur FOR
    SELECT
        *
        FROM par_p_e2c$aws$tmp
        WHERE LOWER(UPPER(clientname))
             LIKE LOWER(CONCAT('%', UPPER('bank'), '%'));
END;
$BODY$
LANGUAGE  plpgsql;

以下の画像は、AWS SCT によってテーブル型を模してターゲットのデータベースに作成されたオブジェクトを示しています。ここで、SQL Server のテーブル型 Employee2Client が PostgreSQL に変換されたことがわかります。

ターゲット: MySQL の場合

MySQL はテーブル型のパラメーターをサポートしていませんが、この機能を一時テーブルを使用して再現できます。一時テーブルは MySQL のセッションとの接続切断後に削除されるため、接続ごとに毎回作成する必要があります。

AWS SCT に変換されるコード (MySQL): 

CREATE PROCEDURE RAMYA_dbo.PROC_CREATE_PROC_005(in par_p_E2C VARCHAR(255))
BEGIN
    DROP TEMPORARY TABLE IF EXISTS par_p_E2C$PROC_CREATE_PROC_005;
    SET @aws$tbl$stmt := 
    CONCAT('CREATE TEMPORARY TABLE par_p_E2C$PROC_CREATE_PROC_005 
    SELECT * FROM ', par_p_E2C);
    PREPARE aws$tbl$stmt FROM @aws$tbl$stmt;
    EXECUTE aws$tbl$stmt;
    DEALLOCATE PREPARE aws$tbl$stmt;
    SELECT
        *
        FROM par_p_E2C$PROC_CREATE_PROC_005
        WHERE UPPER(ClientName) LIKE CONCAT('%', UPPER('bank'), '%');
END;

以下の例では、AWS SCT が SQL Server プロシージャ (PROC_CREATE_PROC_005) を MySQL に変換する方法を示しています。

SQL Server から PostgreSQL へ – MERGE ステートメントの実装

SQL Server での MERGE は、ソースのテーブルとの統合結果に基づき、ターゲットのテーブルで挿入、更新、削除を実行します。PostgreSQL では MERGE ステートメントをサポートしていませんが、INSERT ON CONFLICT 句を使用して同様の機能を実行できます。

こちらのプロシージャ例では、WHEN NOT MATCHED 句 1 つのみの MERGE を使用しています。

AWS SCT では、以下のような MERGE ステートメントもサポートしています。

  • テーブルからの MERGE
  • ビューからの MERGE
  • サブクエリからの MERGE
  • WHEN MATCHED 句なしの MERGE
  • WHEN NOT MATCHED 句なしの MERGE
  • INSERT あり、フィールドリストなしの MERGE

以下は制限により使用できません。

  • ON 条件の複雑な MERGE
  • 2 つの WHEN MATCHED THEN 句 (現時点でサポート外)
  • WHEN NOT MATCHED BY SOURCE 句 (現時点でサポート外)

Oracle から PostgreSQL 10 へ – タイムゾーンデータなしで、列によるパーティションへのタイムスタンプ変換

今回のバージョンより、AWS SCT では Oracle から PostgreSQL 10 への移行時に、タイムゾーンのデータ型なしのタイムスタンプ付きでのパーティション列の移行をサポートしています。

以下の例では、パーティションキーが Call_Date 、データ型が timestamp の Oracle パーティションテーブルを示しています。AWS SCT は、このテーブルを call_date でパーティションテーブルに変換し、Oracle パーティションに対応する 4 つのパーティションを PostgreSQL ターゲットに作成します。

Oracle から Amazon RDS for Oracle へ – 追加のサーバーレベルオブジェクト

AWS SCT の前回のリリースでは、サーバーレベルの評価レポートを導入しました。今回のリリースでは、評価レポートに多数のオブジェクトを新しく追加しました。

以下に、ターゲットのデータベースを評価する際に役立つサーバーレベルオブジェクトを示します。すべての一覧については、AWS SCT リリースノートをご覧ください。

  • DB インスタンス制限
  • 文字セット
  • Data Guard および Active Data Guard
  • Automatic Storage Management
  • レプリケーション
  • エンタープライズユーザーセキュリティ
  • Streams
  • XML DB
  • Oracle Application Express (APEX)
  • REDO ログ生成

以下に、サーバーレベル評価レポートの一部を示します。最初のレポート例では、Amazon RDS for Oracle でレプリケーションをサポートしていないことと、その代替の方法について示しています。

レプリケーション:
Amazon RDS for Oracle ではレプリケーションをサポートしていません
評価レポート: Amazon RDS for Oracle では、データキャプチャーの変更を行う
 PL/SQL パッケージをサポートしていません。データのレプリケーションには、
 Amazon RDS Multi-AZ および AWS DMS をお試しください。

また、Oracle XML DB の機能を使用していれば、レポートでサポート外の内容と関連するドキュメントがわかる場合もあります。

Oracle XML DB プロトコルサーバー:
評価レポート: Oracle XML DB。Amazon RDS for Oracle では XML DB の機能をサポートしますが、
XML DB プロトコルサーバーはサポートしません。次の記事の前提条件と設定の手順を
お読みください: Oracle XML DB オプション

以下に、Oracle から RDS for Oracle への変換におけるサーバーレベル評価レポートの実際例を示します。

SQL Server から Amazon RDS へ – 追加の SQL Server オブジェクト

前セクションで説明した Oracle から RDS for Oracle への移行レポート同様、SQL Server から RDS for SQL Server への移行でも追加のオブジェクトがあります。

以下に役立つ新しいオブジェクトをご紹介します。

  • ミラーリング
  • ログ配布
  • AlwaysON
  • クラスターノード
  • データベースメール
  • Reporting services
  • Analysis services
  • Integration services
  • フルテキスト検索サービス
  • Data quality services

たとえば、SQL Server DB インスタンスでデータベースミラーリングを使用している場合があります。サーバーレベル評価レポートでは、マルチ AZ 配置を Amazon RDS のデータベースインスタンスに使用する提案をします。また、SQL Server DB インスタンスに SQL Server ログ配布が設定されている場合があります。レポートでは、Amazon RDS がログ配布をサポートしていないことがわかります。

こちらは、SQL Server から Amazon RDS の SQL Server への移行についてのサーバーレベル評価レポートのスナップショットです。

結論

ビルド 617 には、この記事でお知らせした機能以外にもいくつかの改良を加えました。AWS SCT リリースノートページで、機能の全リストにアクセスできます。

これらの機能は、お客様からのフィードバックに基づき実装しました。コメントおよび提案をいただき感謝いたします。次回の記事をお楽しみに。


今回のブログ投稿者について

Ramya Kaushik は、アマゾン ウェブ サービスの Database Migration Service (DMS) & Schema Conversion Tool (SCT) チーム でデータベースエンジニアを務めています。