DataPump

Datapump를 이용한 데이터베이스 복제

돼지와함께춤을 2025. 5. 9. 15:19

Oracle에 Datapump 기능을 이용하여 기존 데이터베이스를 최대한 똑같이 복제하는 과정이다.

간략하게 요약하면!

  1. 소스db를 분석하고 타 서버에 타겟db환경을 똑같이 생성
  2. pfile 이관
  3. 소스db 테이블 스페이스 상태를 타겟db에 구축
  4. 소스db 프로파일 상태를 타겟db에 구축
  5. datapump로 데이터 이관
  6. 검증

datapump로는 테이블스페이스와 프로파일 까지는 이관하지 못하기 때문에 (db link, ogg 등 까지..) 

미리 타겟에 구축후 이관해준다.

이관시 full이 아닌 schema 리스트를 옵션에 기재하여 옮겨주었고 한번에 옮기는것보단 각 스키마별로 옮겨주는게

pump 도중 오류시 대응에 좋긴하다.  

 

덤프파일은 각 소스서버와 타겟서버에 연결된 nfs(network file system)를 directory로 이용했으며

nfs구축방법은 다루지않는다(모른다..).

학습용이면 그냥 같은 서버에 db복제해도 무방하니 상황에 맞게 참조하자.

 

  • 복제 전략
    서버, db 상태 구조와 datapump 아키텍처 구상도

복제 전략


그림으로 보실분은 아래 슬라이드 / 텍스트 기반 모음도 게시물 하단에 게시 

 

 


  • 이관 프로세스 요약본 (중간 중간 스크립트 파일 소스는 밑에 따로 작성함)
1. os 및 oracle 버전확인
  cat /etc/os-release
  uname -r

2. 디스크 용량, 메모리, 네트워크 설정 등 하드웨어 사양 확인

  # 소스 db 용량 확인
  SELECT ROUND(SUM(bytes)/1024/1024, 2) AS total_used_mb
  FROM dba_data_files;

  TOTAL_USED_MB
-------------
    1006822.5

  # 타겟 db서버 사용중 asm 디스크 확인
  SELECT PATH FROM V$ASM_DISK;
  asmcmd afd_lsdsk

  -- dev/sdc asm디스크 사용중

  SELECT 
    name AS diskgroup_name,
    total_mb,
    free_mb,
    (total_mb - free_mb) AS used_mb,
    ROUND((free_mb / total_mb) * 100, 2) AS free_percent
  FROM 
    v$asm_diskgroup;

  DISKGROUP_NAME           TOTAL_MB    FREE_MB   USED_MB FREE_PERCENT
------------------------------ ---------- ---------- ---------- ------------
  DATA                      4194304    3081988   1112316        73.48

3. db_info_layout.sql로 소스 db 구조 확인

4. 타겟 db 생성

5. db_info_layout.sql 타겟 db 검증

6. 소스 db에서 create_tablespaces.sql 파일 생성

7. create_tablespaces.sql nfs로 이동
  df -hT 
  cp create_tablespaces.sql /EDU_SYNC/create_tablespaces.sql

8. 파라미터 nfs로 이동
  CREATE PFILE='/home/oracle/pfile_source1.ora' FROM SPFILE;
  cp pfile_source.ora /EDU_SYNC/pfile_target.ora


9. 타겟 파라미터 적용
  cp /EDU_SYNC/pfile_target.ora  pfile_target.ora
  - 환경에 맞게 수정 사항
  검토
  *.__oracle_base='/u01/app/oracle'# ORACLE_BASE set from environment
  *._diag_adr_trace_dest='/u01/app/oracle/diag/rdbms/his011/HIS011/trace'
  *.audit_file_dest='/u01/app/oracle/admin/HIS011/adump'
  *.db_create_file_dest='+DATA'
  *.db_name='HIS011'
  *.diagnostic_dest='/u01/app/oracle'
  *.local_listener='LISTENER_HIS011'  // local_listener는 서버에서 데이터베이스가 리스너와 통신할 때 사용하는 기본 TNS 정보
  *.db_files=2048  

  수정
  *.control_files='+DATA/HIS011/CONTROLFILE/Current.1859.1190991641'
  

  파라미터 백업
  CREATE PFILE='/home/oracle/backup_pfile.ora' FROM SPFILE;
  추출 파라미터 적용 시작
  STARTUP PFILE='/home/oracle/pfile_target.ora';
  CREATE SPFILE FROM PFILE='/home/oracle/pfile_target.ora';
  srvctl config database -d HIS011 
  srvctl modify database -d HIS011 -spfile +DATA/spfileHIS011.ora
  srvctl start database -d HIS011 or startup
  재시작후 show parameter spfile 확인  

9. 타겟 db create_tablespaces.sql 실행
  cp /EDU_SYNC/create_tablespaces.sql create_tablespaces.sql
  @create_tablespaces.sql


10. 소스 db expdp par파일 추출

11. expdp
nohup expdp \'/ as sysdba\' parfile=/EDU_SYNC/expdp_schema_lev_parameter_20250120.par &


12. dump 용량 확인
ls -lh ~

13. impdp 파라미터 셋
vi /EDU_SYNC/impdp_schema_lev_parameter_20250120.par

DIRECTORY=EDU_SYNC
DUMPFILE=20250120_expdp_%U.dmp
LOGFILE=20250120_impdp_log.log
PARALLEL=4
CLUSTER=NO
CONTENT=ALL
TABLE_EXISTS_ACTION=REPLACE
SCHEMAS=AST,ASTU02,ASTU03,ASTU04,ASTU05,ASTU06,CCS,CCSU01,CDI,CMR,CMRU01,COM,COMU01,CRD,CRDU01,CRM,CRMU01,DEVU01,DEVU02,DIF,DIFU01,DMUU01,DUS,DUSU01,EEMU01,EIS,EMR,EMRU01,FOMU01,HC,HISU01,HISU02,HMLU01,HOS011,HRMU01,INFU01,LIS,LISU01,LISU02,MASU01,MIS,MOB,MOBU01,NUU01,NUU02,PAC,PACU01,PAM,PAMU01,PCS,PHOGG,PHSWM,PKS,PKSU01,SLT,SMSU01,STS,STSU01,SZ,SZU01,SZU02,TIS,UPDBK,VUNU01,ZZ,ZZU01


14. 프로파일 이관
recreate_profiles.sql 추출
타겟 db 실행

15. impdp
CREATE OR REPLACE DIRECTORY EDU_SYNC AS '/EDU_SYNC';
GRANT READ, WRITE ON DIRECTORY EDU_SYNC TO PUBLIC;

ALTER SYSTEM SET "_system_trig_enabled" = FALSE; // https://topic.alibabacloud.com/a/ora-06502-plsql-number-or-value-error-string-buffer-too-small-error-analysis_1_13_32487673.html

ALTER SYSTEM SET SGA_TARGET = 8G SCOPE=SPFILE;
ALTER SYSTEM SET SHARED_POOL_SIZE = 2G SCOPE=SPFILE;

db 재시작

nohup impdp \'/ as sysdba\' parfile=/EDU_SYNC/impdp_schema_lev_parameter_20250120.par &

SELECT * FROM DBA_DATAPUMP_JOBS WHERE STATE = 'EXECUTING';
impdp \'/ as sysdba\' attach=SYS_IMPORT_SCHEMA_01

끝나고 파라미터 롤백             
ALTER SYSTEM SET SGA_TARGET = 6G SCOPE=SPFILE;
ALTER SYSTEM SET SHARED_POOL_SIZE = 880M SCOPE=SPFILE;

db 재시작


16. 로그 분석
1. 파라미터 밸류 
2. user 이관
3. 시스템 권한
4. 롤 권한
5. db link
5. synonym 이관
6. 시퀀스 이관 -> 객체 권한
8. 테이블(메타) 이관 -> 객체 권한
9. 데이터 이관 -> 객체권한 -> comment
11. 패키지 이관 -> 객체 권한
12. 함수 이관 -> 객체 권한
13. 프로시져 이관 -> 객체 권한
14. 뷰 이관 -> 객체 권한 -> comment 이관
15. 패키지 바디 이관
16. 인덱스
17. 제약
18. 인덱스 통계
19. 트리거
20. 테이블 통계

 


  • db_info_layout.sql (db 상태 확인 스크립트. sqlplus에서 @파일.sql로 실행 / sqlplus 접속할 터미널 디렉토리에 파일저장)
SET LINESIZE 200
SET PAGESIZE 100
SET SERVEROUTPUT ON

PROMPT === 1. RAC 및 클러스터 확인 ===
SELECT VALUE AS DB_RAC_MODE
FROM V$PARAMETER 
WHERE NAME = 'cluster_database';

SELECT INSTANCE_NAME, HOST_NAME FROM GV$INSTANCE;

PROMPT === 2. ASM 파일시스템 여부 확인 ===
SELECT 'ASM 사용 여부: ' || 
       CASE WHEN VALUE IS NOT NULL THEN 'YES' ELSE 'NO' END AS ASM_STATUS
FROM V$PARAMETER
WHERE NAME = 'db_create_file_dest';

PROMPT === 3. DB Name 관련 ===
SELECT 'INSTANCE_NAME: ' || INSTANCE_NAME AS INFO FROM V$INSTANCE;
SELECT 'DB NAME: ' || NAME AS INFO FROM V$DATABASE;
SHOW PARAMETER DB_UNIQUE_NAME;
SELECT 'GLOBAL_NAME: ' || GLOBAL_NAME AS INFO FROM GLOBAL_NAME;

PROMPT === 4. DB 버전 ===
SELECT BANNER_FULL AS INFO FROM V$VERSION;

PROMPT === 5. ORACLE_BASE 경로 ===
SELECT DIRECTORY_PATH AS ORACLE_BASE FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = 'ORACLE_BASE';

PROMPT === 6. 문자셋 확인 ===
SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

PROMPT === 7. SGA 및 PGA 확인 ===
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;

PROMPT === 8. 컨테이너 DB 확인 ===
SELECT 'CDB: ' || CDB AS INFO FROM V$DATABASE;
SELECT NAME, CON_ID FROM V$CONTAINERS;

PROMPT === 9. 데이터 파일 확인 ===
SELECT 
    tablespace_name, 
    file_name, 
    ROUND(bytes/1024, 2) AS size_kb,
    ROUND(bytes/1024/1024, 2) AS size_mb,
    ROUND(bytes/1024/1024/1024, 2) AS size_gb,
    autoextensible
FROM 
    dba_data_files
WHERE 
    tablespace_name IN ('SYSTEM', 'SYSAUX', 'TEMP', 'UNDOTBS1', 'USERS');

PROMPT === 10. TEMP 데이터 파일 확인 ===
SELECT 
    FILE_NAME, 
    TABLESPACE_NAME, 
    ROUND(BYTES/1024, 2) AS SIZE_KB, 
    ROUND(BYTES/1024/1024, 2) AS SIZE_MB, 
    ROUND(BYTES/1024/1024/1024, 2) AS SIZE_GB
FROM DBA_TEMP_FILES;

PROMPT === 11. 기본 테이블스페이스 블록 사이즈 확인 ===
SELECT 
    TABLESPACE_NAME, 
    STATUS, 
    CONTENTS, 
    BLOCK_SIZE 
FROM 
    DBA_TABLESPACES
WHERE 
    TABLESPACE_NAME IN ('SYSTEM', 'SYSAUX', 'TEMP', 'UNDOTBS1', 'USERS');

PROMPT === 12. OMF 여부 확인 ===
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME IN ('db_create_file_dest');

PROMPT === 13. 컨트롤 파일 확인 ===
SHOW PARAMETER control_files;

SELECT 
  *
FROM 
    V$CONTROLFILE_RECORD_SECTION
WHERE 
    TYPE IN ('DATAFILE', 'INSTANCE', 'LOG HISTORY', 'REDO LOG', 'REDO LOG MEMBER');

PROMPT === 14. 리두 로그 파일 확인 ===
SELECT 
    lf.GROUP# AS REDO_LOG_GROUP, 
    lf.MEMBER AS REDO_LOG_FILE, 
    ROUND(l.BYTES/1024, 2) AS SIZE_KB, 
    ROUND(l.BYTES/1024/1024, 2) AS SIZE_MB
FROM V$LOGFILE lf 
LEFT JOIN V$LOG l ON lf.GROUP# = l.GROUP#
ORDER BY lf.GROUP#;

PROMPT === 15. FRA 확인 ===
SELECT 
    NAME, 
    ROUND(SPACE_LIMIT/1024, 2) AS SIZE_KB,
    ROUND(SPACE_LIMIT/1024/1024, 2) AS SIZE_MB,
    ROUND(SPACE_LIMIT/1024/1024/1024, 2) AS SIZE_GB
FROM V$RECOVERY_FILE_DEST;

PROMPT === 16. 아카이브 로그 모드 확인 ===
SELECT NAME, LOG_MODE FROM V$DATABASE;

PROMPT === 17. 컴포넌트 확인 ===
SELECT COMP_NAME, STATUS, VERSION FROM DBA_REGISTRY;

PROMPT === 18. AMM (1,2) 및 ASMM(3,4) 메모리 관리 여부 확인 ===
SHOW PARAMETER memory_target; 
SHOW PARAMETER memory_max_target;
SHOW PARAMETER sga_target; 
SHOW PARAMETER pga_aggregate_target;

PROMPT === 19. DB 동시 접속 최대 OS 사용자 프로세스 수 확인 ===
SHOW PARAMETER processes;

PROMPT === 20. 접속 모드 확인 (DEDICATED/SHARED) ===
SHOW PARAMETER service_names;
SHOW PARAMETER shared_servers;

PROMPT === 21. OEM 구성 여부 확인 ===
SELECT NAME, VALUE 
FROM V$PARAMETER 
WHERE NAME IN ('control_management_pack_access', 'em_express_enabled');

SELECT DBMS_XDB_CONFIG.GETHTTPSPORT AS HTTPS_PORT FROM DUAL;


PROMPT === 22. 데이터베이스 크기 확인 ===
SELECT 
    ROUND(SUM(BYTES)/1024, 2) AS TOTAL_SIZE_KB,
    ROUND(SUM(BYTES)/1024/1024, 2) AS TOTAL_SIZE_MB,
    ROUND(SUM(BYTES)/1024/1024/1024, 2) AS TOTAL_SIZE_GB
FROM DBA_DATA_FILES;

PROMPT === 모든 정보 출력 완료 ===

  • create_tablespaces.sql(테이블 스페이스 생성) 파일 추출하는 sql 문(sql plus에서 실행)
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET PAGESIZE 0
SET LINESIZE 200
SET TRIMSPOOL ON
SET TERMOUT OFF 

SPOOL create_tablespaces.sql

SELECT  
    CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY tablespace_name ORDER BY file_name) = 1 THEN
            'CREATE TABLESPACE ' || tablespace_name || 
            ' DATAFILE ''' || REGEXP_SUBSTR(file_name, '^\+[^/]+') || ''' ' || 
            ' SIZE ' || ROUND(bytes/1024/1024, 2) || 'M ' || 
            CASE 
                WHEN autoextensible = 'YES' THEN 'AUTOEXTEND ON;'
                ELSE 'AUTOEXTEND OFF;'
            END
        ELSE
            'ALTER TABLESPACE ' || tablespace_name || 
            ' ADD DATAFILE ''' || REGEXP_SUBSTR(file_name, '^\+[^/]+') || ''' ' || 
            ' SIZE ' || ROUND(bytes/1024/1024, 2) || 'M ' || 
            CASE 
                WHEN autoextensible = 'YES' THEN 'AUTOEXTEND ON;'
                ELSE 'AUTOEXTEND OFF;'
            END
    END AS ddl_script
FROM 
    dba_data_files
WHERE 
    tablespace_name NOT IN ('UNDOTBS1', 'TEMP', 'SYSAUX', 'SYSTEM', 'USERS')
ORDER BY 
    tablespace_name, file_name;

SPOOL OFF

SET TERMOUT ON

  • recreate_profile.sql(프로파일 생성)파일 추출하는 sql문(sql plus에서 실행)
SET PAGESIZE 50000    
SET LINESIZE 32767   
SET LONG 500000       
SET LONGCHUNKSIZE 500000 
SET HEADING OFF     
SET FEEDBACK OFF    
SET ECHO OFF          
SET VERIFY OFF       
SET TERMOUT OFF    
SET TRIMSPOOL ON     


-- 1. 모든 프로파일 삭제 (DEFAULT 프로파일 제외, 중복 제거)
SPOOL recreate_profiles.sql
SELECT DISTINCT 'DROP PROFILE "' || PROFILE || '" CASCADE;'
FROM DBA_PROFILES
WHERE PROFILE <> 'DEFAULT';
SPOOL OFF

-- 2. 모든 프로파일 생성 (DEFAULT 프로파일 제외, 마지막 행 `;` 추가)
SPOOL recreate_profiles.sql APPEND
WITH PROFILE_DDL AS (
    SELECT DISTINCT 'CREATE PROFILE "' || PROFILE || '"' || '  LIMIT' AS DDL, PROFILE, NULL AS RESOURCE_NAME
    FROM DBA_PROFILES
    WHERE PROFILE <> 'DEFAULT'
    UNION ALL
    SELECT '       ' || RESOURCE_NAME || ' ' || LIMIT ||
           CASE 
               WHEN ROW_NUMBER() OVER (PARTITION BY PROFILE ORDER BY RESOURCE_NAME DESC) = 1 THEN ';'
               ELSE ''
           END AS DDL,
           PROFILE, RESOURCE_NAME
    FROM DBA_PROFILES
    WHERE PROFILE <> 'DEFAULT'
)
SELECT DDL FROM PROFILE_DDL
ORDER BY PROFILE, RESOURCE_NAME NULLS FIRST;
SPOOL OFF

-- 3. DEFAULT 프로파일 설정 (ALTER PROFILE 사용, 마지막 행 `;` 추가)
SPOOL recreate_profiles.sql APPEND
WITH DEFAULT_PROFILE_DDL AS (
    SELECT 'ALTER PROFILE DEFAULT LIMIT' AS DDL,  NULL AS RESOURCE_NAME  FROM DUAL
    UNION ALL
    SELECT '       ' || RESOURCE_NAME || ' ' || 
           DECODE(RESOURCE_NAME, 'PASSWORD_ROLLOVER_TIME', CASE WHEN LIMIT > 1 THEN LIMIT ELSE '0' END ,  LIMIT) || 
           DECODE(ROW_NUMBER() OVER (ORDER BY RESOURCE_NAME DESC), 1, ';', '') AS DDL,
           RESOURCE_NAME
    FROM DBA_PROFILES
    WHERE PROFILE = 'DEFAULT'
)
SELECT DDL FROM DEFAULT_PROFILE_DDL
ORDER BY RESOURCE_NAME NULLS FIRST;

SPOOL OFF

 


expdp 용 parameter 파일 추출 PLSQL

DECLARE
    v_directory_name VARCHAR2(128) := 'EDU_SYNC';
    v_directory_path VARCHAR2(4000);
    v_schemas_list CLOB;
    v_parfile_content CLOB;
    v_output_file UTL_FILE.FILE_TYPE;
BEGIN
    -- 1. EDU_SYNC 디렉토리 확인 및 생성
    BEGIN
        SELECT DIRECTORY_PATH
        INTO v_directory_path
        FROM DBA_DIRECTORIES
        WHERE DIRECTORY_NAME = v_directory_name;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            v_directory_path := '/EDU_SYNC';
            EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY ' || v_directory_name || ' AS ''' || v_directory_path || '''';
            EXECUTE IMMEDIATE 'GRANT READ, WRITE ON DIRECTORY ' || v_directory_name || ' TO PUBLIC';
    END;

    -- 2. 활성화된 사용자 목록을 스키마 리스트로 추출
    SELECT LISTAGG(USERNAME, ',') WITHIN GROUP (ORDER BY USERNAME)
    INTO v_schemas_list
    FROM DBA_USERS
    WHERE ACCOUNT_STATUS = 'OPEN'  -- 활성 계정만 선택
      AND ORACLE_MAINTAINED <> 'Y'
      AND USERNAME NOT IN ('SYSTEM', 'SYS');  -- SYSTEM, SYS 제외

    -- 3. 파라미터 파일 내용 생성
    v_parfile_content := 'DIRECTORY=' || v_directory_name || CHR(10) ||
                         'DUMPFILE=20250120_expdp_%U.dmp' || CHR(10) || -- 병렬 작업 시 %U 추가
                         'LOGFILE=20250120_expdp_log.log' || CHR(10) ||
                         'CLUSTER=NO' || CHR(10) ||
                         'CONTENT=ALL' || CHR(10) ||
                         'PARALLEL=4' || CHR(10) || -- 병렬 레벨 추가
                         'SCHEMAS=' || v_schemas_list;

    -- 4. /home/oracle/expdp_schema.par 파일로 저장
    v_output_file := UTL_FILE.FOPEN('EDU_SYNC', 'expdp_schema_lev_parameter_20250120.par', 'W');
    UTL_FILE.PUT_LINE(v_output_file, v_parfile_content);
    UTL_FILE.FCLOSE(v_output_file);

    DBMS_OUTPUT.PUT_LINE('parfile 생성 완료');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('오류 발생: ' || SQLERRM);
END;

  • verify.sql (이관 검증.  sqlplus에서 @파일.sql로 실행 / sqlplus 접속할 터미널 디렉토리에 파일저장 )
-- verify.sql

SET SERVEROUTPUT ON SIZE UNLIMITED
SET ECHO OFF           
SET FEEDBACK OFF       
SET HEADING ON         
SET PAGESIZE 10000     
SET LINESIZE 200       
SET TRIMSPOOL ON       
SET TERMOUT OFF        

SET NULL 'NULL'        

SET SQLPROMPT ''       
SET VERIFY OFF         

SET COLSEP '|'         
SET ROWSEP '' 
SET TIMING OFF  

-- 1. 활성 사용자 목록 출력
PROMPT ======================= 활성 사용자 목록 =======================
SELECT USERNAME
FROM DBA_USERS
WHERE ACCOUNT_STATUS = 'OPEN'
  AND ORACLE_MAINTAINED <> 'Y'
  AND USERNAME NOT IN ('SYSTEM', 'SYS')
ORDER BY USERNAME;

-- 2. 스키마별 테이블 개수, 인덱스 개수, 제약조건 개수, 뷰 개수, 테이블 건수
PROMPT ======================= 스키마별 오브젝트 정보 =======================
BEGIN
    FOR user_rec IN (
        SELECT USERNAME
        FROM DBA_USERS
        WHERE ACCOUNT_STATUS = 'OPEN'
          AND ORACLE_MAINTAINED <> 'Y'
          AND USERNAME NOT IN ('SYSTEM', 'SYS')
        ORDER BY USERNAME
    ) LOOP
        -- 스키마별 테이블 개수
        FOR tbl_count IN (
            SELECT COUNT(*) AS table_count
            FROM ALL_TABLES
            WHERE OWNER = user_rec.USERNAME
        ) LOOP
            DBMS_OUTPUT.PUT_LINE('스키마: ' || user_rec.USERNAME || ', 테이블 개수: ' || tbl_count.table_count);
        END LOOP;
        
        -- 스키마별 인덱스 개수
        FOR idx_count IN (
            SELECT COUNT(*) AS index_count
            FROM DBA_INDEXES
            WHERE OWNER = user_rec.USERNAME
        ) LOOP
            DBMS_OUTPUT.PUT_LINE('스키마: ' || user_rec.USERNAME || ', 인덱스 개수: ' || idx_count.index_count);
        END LOOP;
        
        -- 스키마별 제약조건 개수
        FOR cons_count IN (
            SELECT COUNT(*) AS constraint_count
            FROM DBA_CONSTRAINTS
            WHERE OWNER = user_rec.USERNAME
	      AND CONSTRAINT_NAME NOT LIKE 'BIN$%'
        ) LOOP
            DBMS_OUTPUT.PUT_LINE('스키마: ' || user_rec.USERNAME || ', 제약조건 개수: ' || cons_count.constraint_count);
        END LOOP;
        
        -- 스키마별 뷰 개수
        FOR view_count IN (
            SELECT COUNT(*) AS view_count
            FROM DBA_VIEWS
            WHERE OWNER = user_rec.USERNAME
        ) LOOP
            DBMS_OUTPUT.PUT_LINE('스키마: ' || user_rec.USERNAME || ', 뷰 개수: ' || view_count.view_count);
        END LOOP;

        -- 스키마별 테이블 건수
        FOR tbl_row_count IN (
            SELECT TABLE_NAME, NUM_ROWS
            FROM ALL_TABLES
            WHERE OWNER = user_rec.USERNAME
            ORDER BY TABLE_NAME
        ) LOOP
            DBMS_OUTPUT.PUT_LINE('스키마: ' || user_rec.USERNAME || ', 테이블: ' || tbl_row_count.TABLE_NAME || ', 건수: ' || NVL(tbl_row_count.NUM_ROWS, 0));
        END LOOP;
    END LOOP;
END;
/

-- 3. DB 전체 용량 확인
PROMPT ======================= DB 전체 용량 =======================
SELECT ROUND(SUM(bytes)/1024/1024, 2) AS total_used_mb
FROM DBA_DATA_FILES;

-- 4. 테이블스페이스 사용량 확인
PROMPT ======================= 테이블스페이스 사용량 =======================
SELECT TABLESPACE_NAME, USED_SPACE * 8192 / 1024 / 1024 AS used_space_mb 
FROM DBA_TABLESPACE_USAGE_METRICS;

-- 5. 파라미터 설정 확인
PROMPT ======================= 파라미터 설정 =======================
SELECT NAME, VALUE
FROM V$PARAMETER
ORDER BY NAME;
/

'DataPump' 카테고리의 다른 글

DataPump 옵션 모음  (0) 2025.05.28
Datapump estimate 옵션  (1) 2025.05.09