2025. 3. 16. 10:32ㆍIT/Oracle
오라클 데이터베이스 간에 스키마를 동기화하려고 할 때 솔루션 없이 할 수 있는 몇 가지 방법이 있습니다. 이러한 방법들은 대부분 데이터베이스 관리 및 SQL 스크립팅 기술을 요구합니다. 다음은 몇 가지 접근 방식입니다
1. SQL 스크립트 사용
✅ 오라클 데이터베이스에서 스키마 객체의 DDL을 추출하고, 이를 다른 데이터베이스에 적용하여 스키마를 동기화합니다.
✅ 방법
- DBMS_METADATA.GET_DDL 함수를 사용하여 특정 데이터베이스 객체의 DDL을 추출합니다. 예를 들어, 테이블, 뷰, 시퀀스 등의 생성 스크립트를 얻을 수 있습니다.
- 추출된 스크립트를 SQL 파일로 저장합니다.
- SQL 파일을 대상 데이터베이스에서 실행하여 스키마를 동기화합니다.
SELECT DBMS_METADATA.GET_DDL('TABLE', 'YOUR_TABLE_NAME', 'YOUR_SCHEMA_NAME') FROM DUAL;
이 SQL을 실행하면 테이블의 생성 스크립트를 반환합니다.
2. 데이터 펌프(Expdp/Impdp)
✅ 오라클 데이터 펌프는 데이터와 데이터베이스 객체를 내보내고 가져오는 유용한 도구입니다. 스키마만 동기화하려면, 데이터 펌프의 스키마 모드를 사용하여 스키마 관련 객체와 데이터를 내보낸 다음, 대상 데이터베이스에서 이를 가져올 수 있습니다. 데이터를 제외하고 객체만 가져오려면 가져오기 작업에서 CONTENT=METADATA_ONLY 옵션을 사용하면 됩니다.
✅ 방법
- Expdp(Export Data Pump)를 사용하여 스키마의 데이터 및 메타데이터를 .dmp 파일로 내보냅니다.
- Impdp(Import Data Pump)를 사용하여 .dmp 파일에서 데이터베이스 객체를 가져옵니다.
- 스키마만 동기화하려면, CONTENT=METADATA_ONLY 옵션을 사용합니다.
- 예시
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를 통해 접근할 수 있으며, 대화형으로 두 스키마의 차이를 해결할 수 있습니다.
✅ 방법
- SQL Developer의 데이터베이스 비교 도구를 사용하여 두 데이터베이스의 스키마를 비교합니다.
- 비교 결과에서 차이점을 확인하고, 동기화할 항목을 선택합니다.
- SQL Developer가 생성한 DDL 스크립트를 실행하여 스키마를 동기화합니다.
4. PL/SQL 스크립트
✅ 자동화된 PL/SQL 스크립트를 작성하여 스키마 동기화를 구현할 수 있습니다. 이 방법은 데이터베이스 내의 스키마 정보를 조회하고, 필요한 변경사항을 적용하는 프로시저나 패키지를 개발하는 것을 포함합니다.
✅ 방법
- 데이터베이스의 메타데이터를 조회하는 PL/SQL 프로시저를 작성합니다.
- 필요한 DDL 명령을 동적으로 생성하여 실행합니다.
- 이 스크립트는 기존 스키마와 비교하여 차이가 있는 경우에만 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 스크립트와 데이터베이스 구성을 저장하고 관리하는 작업이 포함됩니다. 이 접근 방법은 팀이 데이터베이스 변경을 효과적으로 협업하고, 문제가 발생했을 때 이를 쉽게 복구할 수 있게 해줍니다.
'IT > Oracle' 카테고리의 다른 글
| 오라클 - 등록된 Job 및 프로시저 호출 조회(ㅇ) (5) | 2025.03.18 |
|---|---|
| 오라클에서 스키마 정보를 추출하는 방법(ㅇ) (2) | 2025.03.16 |
| PL/SQL에서 커서(Cursor) 이용한 SELECT INSERT 하는 프로시저 설명 (1) | 2025.03.12 |
| 오라클 - Standard Edition (SE) 파티션 테이블 지원 여부(ㅇ) (3) | 2025.03.11 |
| 오라클 OLAP(Online Analytical Processing)란? (1) | 2025.03.11 |