我想将我的 Oracle 数据库架构迁移到 PostgreSQL,但大小写不兼容。
简短描述
Oracle 将元数据以大写形式存储在其数据字典中,而 PostgreSQL 则以小写形式存储元数据。无论使用哪个数据库,都可以在创建对象名称时将其括在引号中以覆盖这些默认格式。但是,这并非最佳做法,可能会导致意外行为。由于 AWS Database Migration Service (AWS DMS) 无法自动更正元数据存储格式,因此 AWS DMS 用引号创建对象。解决方法是,您可以使用映射规则覆盖 AWS DMS 引号。有关更多信息,请参阅Use AWS SCT to convert the Oracle schema to PostgreSQL。
解决方法
本解决方法中的示例将 Oracle SCOTT 架构迁移到 PostgreSQL。如果您有本地 Oracle 数据库,请运行以下命令来创建此架构:
$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);
创建端点和复制实例:
-
要创建复制实例,请使用 AWS DMS 控制台或 AWS 命令行界面 (AWS CLI)。然后,创建源端点和目标端点。
-
创建任务。请务必选择启用日志记录。
-
在表映射视图中,选择 JSON 选项卡,然后选择启用 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": "%"
}
}
]
}
- 选择创建任务。
**注意:**您还可以使用重命名架构规则,而不是将架构转换为小写。
创建任务后,请确认所有对象都是以小写形式在 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