오라클 데이터베이스 간 스키마를 동기화 기법 소개

2025. 3. 16. 10:32IT/Oracle

반응형

오라클 데이터베이스 간에 스키마를 동기화하려고 할 때 솔루션 없이 할 수 있는 몇 가지 방법이 있습니다. 이러한 방법들은 대부분 데이터베이스 관리 및 SQL 스크립팅 기술을 요구합니다. 다음은 몇 가지 접근 방식입니다

1. SQL 스크립트 사용
✅ 오라클 데이터베이스에서 스키마 객체의 DDL을 추출하고, 이를 다른 데이터베이스에 적용하여 스키마를 동기화합니다.

방법

  1. DBMS_METADATA.GET_DDL 함수를 사용하여 특정 데이터베이스 객체의 DDL을 추출합니다. 예를 들어, 테이블, 뷰, 시퀀스 등의 생성 스크립트를 얻을 수 있습니다.
  2. 추출된 스크립트를 SQL 파일로 저장합니다.
  3. SQL 파일을 대상 데이터베이스에서 실행하여 스키마를 동기화합니다.
SELECT DBMS_METADATA.GET_DDL('TABLE', 'YOUR_TABLE_NAME', 'YOUR_SCHEMA_NAME') FROM DUAL;


이 SQL을 실행하면 테이블의 생성 스크립트를 반환합니다.


2. 데이터 펌프(Expdp/Impdp)

 

오라클 데이터 펌프는 데이터와 데이터베이스 객체를 내보내고 가져오는 유용한 도구입니다. 스키마만 동기화하려면, 데이터 펌프의 스키마 모드를 사용하여 스키마 관련 객체와 데이터를 내보낸 다음, 대상 데이터베이스에서 이를 가져올 수 있습니다. 데이터를 제외하고 객체만 가져오려면 가져오기 작업에서 CONTENT=METADATA_ONLY 옵션을 사용하면 됩니다.
 
✅ 방법

  1. Expdp(Export Data Pump)를 사용하여 스키마의 데이터 및 메타데이터를 .dmp 파일로 내보냅니다.
  2. Impdp(Import Data Pump)를 사용하여 .dmp 파일에서 데이터베이스 객체를 가져옵니다.
  3. 스키마만 동기화하려면, CONTENT=METADATA_ONLY 옵션을 사용합니다.
  4. 예시
expdp userid=/ directory=your_directory dumpfile=schema_exp.dmp schemas=your_schema content=metadata_only 
impdp userid=/ directory=your_directory dumpfile=schema_exp.dmp remap_schema=old_schema:new_schema

 


3. SQL Developer 사용

 

✅ 오라클 SQL Developer는 데이터베이스 객체를 비교하고 동기화하는 기능을 제공합니다. 두 데이터베이스 간의 차이점을 시각적으로 보여주고, 필요한 DDL 스크립트를 자동으로 생성해 줍니다. 이 기능은 GUI를 통해 접근할 수 있으며, 대화형으로 두 스키마의 차이를 해결할 수 있습니다.

✅ 방법

  1. SQL Developer의 데이터베이스 비교 도구를 사용하여 두 데이터베이스의 스키마를 비교합니다.
  2. 비교 결과에서 차이점을 확인하고, 동기화할 항목을 선택합니다.
  3. SQL Developer가 생성한 DDL 스크립트를 실행하여 스키마를 동기화합니다.

 

4. PL/SQL 스크립트

 자동화된 PL/SQL 스크립트를 작성하여 스키마 동기화를 구현할 수 있습니다. 이 방법은 데이터베이스 내의 스키마 정보를 조회하고, 필요한 변경사항을 적용하는 프로시저나 패키지를 개발하는 것을 포함합니다.
 방법

  1. 데이터베이스의 메타데이터를 조회하는 PL/SQL 프로시저를 작성합니다.
  2. 필요한 DDL 명령을 동적으로 생성하여 실행합니다.
  3. 이 스크립트는 기존 스키마와 비교하여 차이가 있는 경우에만 DDL 명령을 실행합니다
-- 프로시저 정의: SYNC_SCHEMA라는 이름의 PL/SQL 프로시저를 생성합니다. 
-- 이 프로시저는 대상 스키마 이름을 입력 받습니다.
-- 커서 사용: 대상 스키마의 모든 테이블을 조회하기 위해 커서를 사용합니다.
-- 테이블 존재 여부 확인: 현재 스키마(MY_SCHEMA)에서 대상 스키마의 테이블이 존재하는지 확인합니다.
-- DDL 추출 및 실행: 대상 스키마의 테이블이 현재 스키마에 존재하지 않는 경우, 
-- DBMS_METADATA.GET_DDL 함수를 사용해 해당 테이블의 생성 DDL을 추출하고 
-- EXECUTE IMMEDIATE로 실행합니다. 이를 통해 누락된 테이블을 동기화합니다.
-- 출력: 동기화의 진행 상황을 출력합니다.


CREATE OR REPLACE PROCEDURE SYNC_SCHEMA(target_schema IN VARCHAR2) IS
  cursor existing_tables IS
    SELECT table_name FROM all_tables WHERE owner = target_schema;

  ddl_statement VARCHAR2(4000);
BEGIN
  -- 현재 스키마의 모든 테이블에 대해 반복
  FOR table_rec IN existing_tables LOOP
    -- 대상 데이터베이스 스키마에서 테이블 존재 여부 확인
    IF NOT EXISTS (SELECT 1 FROM all_tables WHERE table_name = table_rec.table_name AND owner = 'MY_SCHEMA') THEN
      -- 테이블 생성을 위한 DDL 추출
      ddl_statement := DBMS_METADATA.GET_DDL('TABLE', table_rec.table_name, target_schema);
      -- 추출된 DDL 실행
      EXECUTE IMMEDIATE ddl_statement;
      DBMS_OUTPUT.PUT_LINE('Table ' || table_rec.table_name || ' has been synchronized.');
    ELSE
      DBMS_OUTPUT.PUT_LINE('Table ' || table_rec.table_name || ' already exists.');
    END IF;
  END LOOP;
END;
/

5. 버전 관리

버전 관리 시스템을 사용하여 데이터베이스 스키마를 관리하는 것은 개발 프로세스를 표준화하고, 변경사항을 추적하며, 여러 환경 간의 일관성을 유지하는 데 매우 중요합니다. 여기에는 Git 같은 버전 관리 도구를 사용하여 SQL 스크립트와 데이터베이스 구성을 저장하고 관리하는 작업이 포함됩니다. 이 접근 방법은 팀이 데이터베이스 변경을 효과적으로 협업하고, 문제가 발생했을 때 이를 쉽게 복구할 수 있게 해줍니다.

반응형