[Oracle] Oracle Data Pump 유틸리티를 사용하여 스키마를 이전하는 절차

Oracle Data Pump 유틸리티를 사용하여 스키마 데이터를 이전하는 절차는 다음과 같습니다. 여기서는 데이터 내보내기(expdp)와 데이터 가져오기(impdp)를 단계별로 설명하고, 이 과정에서 필요한 점검 및 설정 항목을 함께 안내하겠습니다.

  1. 사전 점검 및 설정
  2. 데이터 내보내기 (Export)
  3. 데이터 가져오기 (Import)
  4. 사후 점검 및 설정

1. 사전 점검 및 설정(소스, 타겟 동일)

1.1. 데이터베이스 접속 정보 및 이전할 스키마 등의 정보 확인

  • 사용하는 테이블 스페이스, 권한, Role, 디렉토리 객체 등에 동일해야 합니다.
  • 데이터베이스 인스턴스 이름, 사용자 이름, 비밀번호, 이전할 스키마를 확인합니다.
    – SID : export ORACLE_SID = orcl
    – 사용자 이름: scott
    – 비밀번호: tiger
    – 이전할 스키마: hr
    – 실제 Datapump 디렉터리 : /path/to/datapump
    – Oracle 디렉터리 이름: data_pump_dir

1.2. 디렉터리 객체 생성 및 권한 부여

  • Oracle Data Pump 유틸리티로 데이터를 import/export할 때 사용할 실제 디렉터리를 생성합니다.
  • 디렉터리 객체를 생성 및 삭제할 수 있는 권한을 사용자에게 부여합니다.
  • 데이터 파일을 저장할 파일 시스템 경로에 대한 디렉터리 객체를 생성하고 학인합니다.
  • 생성한 디렉터리에 대한 읽기 및 쓰기 권한을 사용자에게 부여합니다.
    $ mkdir /path/to/datapump
    
    SQL> GRANT CREATE ANY DIRECTORY TO scott;
    SQL> GRANT DROP ANY DIRECTORY TO scott;
    
    SQL> CREATE DIRECTORY data_pump_dir AS '/path/to/datapump';
    SQL> SELECT * FROM DBA_DIRECTORIES;
    
    SQL> GRANT READ, WRITE ON DIRECTORY data_pump_dir TO scott;
    

1.3. 디스크 공간 확인

  • DBA_SEGMENTS 뷰를 통해 내보내기될 데이터의 크기를 확인합니다.
    SELECT TABLESPACE_NAME, SUM(bytes/1024/1024/1024)
    FROM DBA_SEGMENTS 
    WHERE OWNER = 'scott' 
    GROUP BY TABLESPACE_NAME;
    
    SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME, BYTES/1024/1024/1024 AS SIZE_IN_GB, AUTOEXTENSIBLE
    FROM DBA_DATA_FILES
    WHERE TABLESPACE_NAME = '<tablespace_name>';
    
  • 내보내기 및 가져오기 작업에 충분한 디스크 공간이 있는지 확인합니다.(소스, 타겟 동일)
    $ du -s /path/to/datapump
    

1.4. 네트워크 연결 상태 확인

  • 소스와 타겟 데이터베이스 간의 네트워크 연결 상태를 점검합니다.(타겟 호스트 예: 198.168.56.101)

2. 데이터 내보내기 (Export)

2.1. expdp 명령어를 사용하여 전체 또는 특정 스키마 데이터를 내보냅니다.

    $ expdp scott/tiger [FULL=Y 또는 schemas=hr] directory=data_pump_dir dumpfile=hr_export.dmp logfile=hr_export.log include=user include=role include=grant exlude=statistics status=3 parallel=4
    
  • scott/tiger@orcl: 소스 데이터베이스 접속 정보입니다.
  • schemas=hr: 내보낼 스키마만 지정할 수도 있으나, 모두 내보내기를 하면 타겟 데이터베이스트에서 권한이나 Role 등을 따로 설정할 필요가 없습니다.
  • directory=data_pump_dir: 데이터 파일을 저장할 디렉터리입니다.
  • dumpfile=hr_export.dmp: 생성할 덤프 파일 이름입니다.
  • logfile=hr_export.log: 생성할 로그 파일 이름입니다.
  • include: 작업에 포함시킬 오브젝트를 설정합니다.
  • exclude: 작업에 제외할 오브젝트를 설정합니다.
  • status=3: 작업 중 상태 정보를 3초 간격으로 출력합니다.
  • parallel=4: 최대 4개의 작업 프로세스(Worker Process)가 동시에 병렬 처리되어 백업(Export) 및 복구(Import) 속도를 향상

2.2. 데이터 내보내기 결과 확인

  • 로그 파일(hr_export.log)을 검토하여 오류가 없는지 확인합니다.
    $ tail -f hr_export.log
    
    또는 해당 디렉토리의 사용량이 증가하는지 같이 확인하면 좋습니다.
    $ while
    > du -sh .
    > do
    > sleep 1
    > done;
    

2.3. hr_export.dmp 파일을 타겟 데이터베이스의 서버로 전송합니다.

  • scp 명령어를 사용하여 전송합니다.
    $ scp /path/to/hr_export.dmp oracle@198.168.56.101:/path/to/datapump
    

3. 데이터 가져오기 (Import)

3.1. 필요한 경우 타겟 데이터베이스에서 기존 스키마를 삭제

  • 기존 스키마가 존재할 경우, 해당 스키마를 삭제합니다. 삭제하기 전에 연결된 session이 없어야 합니다.
    SQL> DROP USER hr CASCADE;
    

3.2. 테이블스페이스의 여유 공간 확보

  • DBA_DATA_FILES 뷰의 AUTOEXTENSIBLE 컬럼 설정값이 “NO”라면 대량의 데이터를 가져오기할 때 공간부족으로 가져오기 작업이 실패할 수 있으므로 DATA FILE을 수작업으로 추가해 줍니다.(1.3 단계에서 확인한 DATA FILE의 갯수 및 크기와 비교)
    SQL> ALTER TABLESPACE <tablespace_name> ADD DATAFILE SIZE 20G;
    

3.3. impdp 명령어를 사용하여 스키마 데이터를 가져옵니다.

    $ impdp scott/tiger schemas=hr directory=data_pump_dir dumpfile=hr_export.dmp logfile=hr_import.log
    
  • scott/tiger: 타겟 데이터베이스 접속 정보입니다.
  • schemas=hr: 가져올 스키마 이름입니다.
  • directory=data_pump_dir: 데이터 파일이 저장된 디렉터리입니다.
  • dumpfile=hr_export.dmp: 가져올 덤프 파일 이름입니다.
  • logfile=hr_import.log: 생성할 로그 파일 이름입니다.
  • TABLE_EXISTS_ACTION=REPLACE 옵션은 기존 스키마(Schema)를 DROP하지 않고 가져오기할 때 사용합니다. 즉, 기존 테이블이 존재하는 경우 해당 테이블을 삭제(DROP) 후 재생성하는 방식으로 작동합니다.

3.4. 데이터 가져오기 결과 확인

  • 로그 파일(hr_import.log)을 검토하여 오류가 없는지 확인합니다.
    $ tail -f hr_import.log
    

3.5. $ORACLE_HOME/rdbms/admin/utlrp.sql 유틸리티를 실행

  • 의존성 문제, Import 순서 문제 등으로 Invalid된(비활성) PL/SQL 오브젝트(프로시저, 함수, 패키지, 트리거 등)를 다시 컴파일(Recompile)합니다.
    SQL> @?/rdbms/admin/utlrp.sql
    

4. 사후 점검 및 설정

4.1. 데이터 무결성 및 일관성 점검

  • 데이터가 올바르게 이전되었는지, 데이터 무결성과 일관성을 점검합니다.
  • expdp 명령어를 사용할 때 FULL 옵션과 INCLUDE 옵션을 사용해도 권한 설정이 이전되지 않으면 아래 스크립트로 권한 설정를 수작업으로 수행합니다.
    DEFINE V_GRANTEE = 'TGMADM';
    SET HEADING OFF;
    SET PAGESIZE 0;
    SET ECHO OFF;
    SET FEEDBACK OFF;
    SET VERIFY OFF;
    
    SPOOL grant_privileges.sql;
    
    SELECT 'GRANT ' || GRANTED_ROLE || ' TO ' || GRANTEE ||';'
    FROM   DBA_ROLE_PRIVS
    WHERE  GRANTEE = '&V_GRANTEE';
    
    SELECT 'GRANT ' || PRIVILEGE || ' ON ' || OWNER || '.' || TABLE_NAME || ' TO ' || GRANTEE || 
           CASE WHEN GRANTABLE = 'YES' THEN ' WITH GRANT OPTION;' ELSE ';' END
    FROM   DBA_TAB_PRIVS
    WHERE  GRANTEE = '&V_GRANTEE';
    
    SELECT 'GRANT '|| PRIVILEGE || ' TO ' || GRANTEE ||';'
    FROM DBA_SYS_PRIVS
    WHERE  GRANTEE = '&V_GRANTEE';
    
    SPOOL OFF;
    
  • DBA_OBJECTS 뷰는 Oracle 데이터베이스에서 모든 데이터베이스 객체(테이블, 인덱스, 뷰, 프로시저, 패키지 등)를 관리하고 조회하는 데 사용됩니다. 원본 스키마의 객체 수량과 import된 스키마의 객체 수량을 비교해 봅니다.
    COL OWNER FOR A15
    COL OBJECT_TYPE FOR A20
    COL STATUS FOR A15
    SET HEAD OFF
    SET PAGESIZE 0
    SELECT OWNER, OBJECT_TYPE, STATUS , COUNT(*) FROM DBA_OBJECTS
    WHERE OWNER IN ('TGMADM')
    GROUP BY OWNER, OBJECT_TYPE, STATUS
    ORDER BY 1,2,3;
    

4.2. 데이터베이스 통계 수집

  • 성능 최적화를 위해 데이터베이스 통계를 수집합니다.
    SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('hr');
    

4.3. 애플리케이션 연결 테스트

  • 애플리케이션이 정상적으로 타겟 데이터베이스에 연결되고 기능이 올바르게 작동하는지 테스트합니다.

4.4. 백업 수행

  • 데이터 이전 작업이 완료되고 정상적으로 확인된 후, 타겟 데이터베이스의 백업을 수행합니다.

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다