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 RDS(Amazon Relational Database Service) 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 CLI(AWS 명령줄 인터페이스)를 사용하여 복제 인스턴스를 생성한 다음, 원본 및 대상 엔드포인트를 생성합니다.

2.    태스크를 생성합니다. 로깅 활성화(Enable Logging)를 선택해야 합니다.

3.    테이블 매핑(Table mappings) 보기에서 JSON 탭을 선택한 다음, JSON 편집 활성화(Enable JSON editing)를 선택합니다. 그런 다음, 다음 예제와 비슷한 코드를 사용하여 스키마, 테이블 및 열 대소문자 처리에 대한 변환 규칙을 구축합니다. 자세한 내용은 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": "%"
      }
    }
  ]
}

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)

이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?