如何使用 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 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 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. 选择创建任务。
注意:您还可以使用重命名架构规则,而无需将架构转换为小写字母。
创建任务后,验证在 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)