AWS DMS のマッピングルールを使用して、Oracle スキーマを小文字で PostgreSQL に移行する方法を教えてください。
最終更新日: 2020 年 9 月 1 日
簡単な説明
Oracle は、メタデータを大文字でデータディクショナリに保存し、PostgreSQL は小文字で保存します。どちらのデータベースでも、作成時にオブジェクト名を引用符で囲むことによってデフォルトの形式を上書きすることが可能ですが、予期しない動作の原因となる場合があることから、ベストプラクティスではありません。AWS Database Migration Service (AWS DMS) はメタデータストレージのフォーマットを自動修正できないため、AWS DMS はオブジェクトを引用符で囲んで作成します。回避策として、マッピングルールを使って AWS DMS の引用符を上書きすることができます。詳細については、「AWS Schema Conversion Tool (AWS SCT) を使用して、Oracle スキーマを PostgreSQL に変換する」を参照してください。
解決方法
$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. タスクを作成します。ロギングを有効化するようにしてください。
3. [Table mappings] (テーブルマッピング) ビューで [JSON ] タブを選択してから、[Enable JSON editing] (JSON の編集を有効にする) を選択します。次に、以下の例のようなコードを使用して、スキーマ、テーブル、列の大文字小文字処理の変換ルールを構築します。詳細については、「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)