AWS DMS マッピングルールを使用して Oracle スキーマを小文字で PostgreSQL に移行する方法を教えてください。

最終更新日: 2020 年 3 月 13 日

Oracle データベーススキーマを PostgreSQL に移行したいのですが、大文字と小文字の間に互換性がありません。どのようなオプションがありますか?

簡単な説明

Oracle はデータディクショナリに大文字でメタデータを保存しますが、PostgreSQL は小文字で保存します。どちらのデータベースでも、作成時にオブジェクト名を引用符で囲むことで、これらのデフォルト形式を上書きできます。しかし、予期しない動作が発生する可能性があるため、この方法をお勧めしません。AWS Database Migration Service (AWS DMS) はメタデータストレージのフォーマットを自動修正できないため、AWS DMS はオブジェクトを引用符で囲んで作成します。AWS DMS 引用符をマッピングルールで上書きすることで、この問題を回避できます。詳細については、「AWS Schema Conversion Tool (AWS SCT) を使用して、Oracle スキーマを PostgreSQL に変換する」をご参照ください。

解決方法

この例では、Oracle SCOTT スキーマを PostgreSQL に移行しています。オンプレミスの Oracle データベースがある場合は、このスキーマを作成できます。

$ORACLE_HOME/rdbms/admin/utlsampl.sql

Oracle を実行している Amazon Relational Database Service (Amazon RDS) DB インスタンスがある場合は、オンラインで同様のスクリプトを検索してください。

このスクリプトは、SCOTT スキーマに EMP、DEPT、BONUS、SALGRADE の 4 つのテーブルを作成します。全体で、少数の行が含まれます。

Oracle データベースに、テーブル名または列名に小文字が含まれるテーブルが作成されていないことを確認します。アプリケーションが大文字と小文字が混在するテーブル名と列名を使用している場合は、AWS DMS が検出したとおりにテーブルを正確にレプリケートできるようにすることをお勧めします。これらのマッピングルールを使用しないでください。

oracle> SELECT table_name from dba_tables where owner='SCOTT' and table_name <> upper(table_name);

oracle> SELECT table_name, column_name from dba_tab_columns where owner='SCOTT' and column_name <> upper(column_name);

エンドポイントとレプリケーションインスタンスを作成します。

1.    AWS DMS コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、レプリケーションインスタンスを作成し、ソースエンドポイントとターゲットエンドポイントを作成します。

2.    タスクを作成します。必ず [Enable logging] を選択してください。

3.    [Table mappings] ビューで [JSON] タブを選択し、[Enable JSON editing] をクリックします。次に、以下の例のようなコードを使用して、スキーマ、テーブル、列ケース処理の変換ルールを構築します。詳細については、「Using Table Mapping to Specify Task Settings」をご参照ください。

{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "select-scott",
      "object-locator": {
        "schema-name": "SCOTT",
        "table-name": "%"
      },
      "rule-action": "include"
    },
    {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "convert-schemas-to-lower",
      "rule-action": "convert-lowercase",
      "rule-target": "schema",
      "object-locator": {
        "schema-name": "%"
      }
    },
    {
      "rule-type": "transformation",
      "rule-id": "3",
      "rule-name": "convert-tables-to-lower",
      "rule-action": "convert-lowercase",
      "rule-target": "table",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      }
    },
    {
      "rule-type": "transformation",
      "rule-id": "4",
      "rule-name": "convert-columns-to-lowercase",
      "rule-action": "convert-lowercase",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%",
        "column-name": "%"
      }
    }
  ]
}

4.    [Create task] をクリックします。

注: スキーマを小文字に変換する代わりに、スキーマ名の変更ルールを使用することもできます。

タスクを作成したら、PostgreSQL ですべてのオブジェクトが小文字で作成されていることを確認します。

postgres> select table_name from information_schema.tables where table_schema='scott';
 table_name
------------
 bonus
 dept
 salgrade
 emp
(4 rows)


postgres> select table_name, column_name from information_schema.columns  where table_schema='scott' order by table_name;
 table_name | column_name
------------+-------------
 bonus      | ename
 bonus      | job
 bonus      | sal
 bonus      | comm
 dept       | deptno
 dept       | dname
 dept       | loc
 emp        | deptno
 emp        | hiredate
 emp        | sal
 emp        | comm
 emp        | empno
 emp        | ename
 emp        | job
 emp        | mgr
 salgrade   | losal
 salgrade   | hisal
 salgrade   | grade
(18 rows)