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.    작업을 생성합니다. [로깅 활성화]를 선택해야 합니다.

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.    [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)