Oracle データベーススキーマを PostgreSQL に移行したいのですが、大文字小文字表記に互換性がありません。
簡単な説明
Oracle は、メタデータを大文字でデータディクショナリに保存し、PostgreSQL は小文字で保存します。どちらのデータベースでも、作成時にオブジェクト名を引用符で囲むことによってデフォルトの形式を上書きすることが可能です。ただし、予期しない動作の原因となる場合があることから、ベストプラクティスではありません。AWS Database Migration Service (AWS DMS) はメタデータストレージのフォーマットを自動修正できないため、AWS DMS はオブジェクトを引用符で囲んで作成します。これを回避するには、AWS DMS の引用符をマッピングルールで上書きします。詳細については、「AWS SCT を使用して Oracle スキーマを PostgreSQL に変換する」を参照してください。
解決策
この例では、Oracle SCOTT スキーマを PostgreSQL に移行しています。オンプレミスの Oracle データベースがある場合は、以下のコマンドを実行してこのスキーマを作成できます。
$ORACLE_HOME/rdbms/admin/utlsampl.sql
Oracle を実行している Amazon Relational Database Service (Amazon RDS) インスタンスがある場合は、オンラインで同様のスクリプトを検索してください。
このスクリプトは、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. [テーブルマッピング] ビューで**[JSON]** タブを選択し、[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. [タスクを作成] を選択します。
**注:**スキーマを小文字に変換する代わりに、スキーマ名の変更ルールを使用することもできます。
タスクを作成したら、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 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)
関連情報
Database Migration step-by-step walkthroughs
Migrate an on-premises Oracle database to Amazon RDS for PostgreSQL by using an Oracle bystander and AWS DMS