AWS DMS のマッピングルールを使用して、Oracle スキーマを小文字で PostgreSQL に移行するにはどうすればよいですか?
最終更新日: 2020 年 9 月 1 日
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 Command Line Interface (AWS CLI) を使用して、レプリケーションインスタンスを作成してから、ソースエンドポイントとターゲットエンドポイントを作成します。
2. タスクを作成します。[Enable logging] (ロギングを有効化) を選択してください。
3. [Table mappings] (テーブルマッピング) ビューで、[JSON] タブを選択し、[Enable JSON editing] (JSON の編集を有効化) を選択します。その後、次のサンプルに類似したコードを使用して、スキーマ、テーブル、列の大文字または小文字の変換ルールを構築します。詳細については、テーブルマッピングを使用して、タスクの設定を指定するを参照してください。
{
"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)