如何使用 AWS DMS 映射规则将 Oracle schema 迁移到采用小写字母的 PostgreSQL?

上次更新时间:2020 年 9 月 1 日

我想将我的 Oracle 数据库 schema 迁移到 PostgreSQL,但大小写不兼容。该怎么做?

简短描述

Oracle 以大写字母形式将元数据存户在其数据库字典中,但 PostgreSQL 采用的是小写字母存储。不论是哪种数据库,您都可以在创建数据库时使用引号包围对象名称来覆盖这些默认格式。但这不是最佳实践,因为这样做可能会导致意外行为。AWS Database Migration Service (AWS DMS) 无法自动纠正元数据存储格式,因此,AWS DMS 将会创建使用引号的对象。作为解决方法,您可以利用映射规则覆盖 AWS DMS 引号。有关更多信息,请参阅使用 AWS Schema Conversion Tool (AWS SCT) 将 Oracle schema 转换为 PostgreSQL

解决方法

此示例会将 Oracle SCOTT schema 迁移到 PostgreSQL。如果您有本地 Oracle 数据库,则可以通过运行以下命令来创建此 schema:
$ORACLE_HOME/rdbms/admin/utlsampl.sql

如果您有运行 Oracle 的 Amazon Relational Database Service (Amazon RDS) 数据库实例,则在线搜索类似的脚本。

此脚本将在 SCOTT 架构下创建四个表:EMP、DEPT、BONUS 和 SALGRADE。它们都包含少数行。

确认在 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(启用 JSON 编辑)。然后,使用与以下示例类似的代码构建转换规则,以进行 schema、表和列的大小写处理。有关更多信息,请参阅使用表映射指定任务设置

{
  "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(创建任务)。

注意:您还可以使用重命名 schema 规则,而无需将 schema 转换为小写字母。

创建任务后,验证在 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)

这篇文章对您有帮助吗?


您是否需要账单或技术支持?