데이터베이스 연구실.log

PDB 생성과 복제

시드와 기존 PDB를 이용한 생성, 파일 위치와 OPEN 모드 및 NO DATA 복제 조건

USER_TABLESPACESCREATE PLUGGABLE DATABASEPDB 복제NO DATASAVE STATEPDB_FILE_NAME_CONVERTCREATE_FILE_DEST

#핵심 요약

PDB 복제는 같은 CDB 안의 기존 PDB를 수업 자료로 데이터와 구조를 복사해 새 PDB를 만듦
운영 데이터를 복사한 테스트 환경을 만들 때 씀

절차: 새 데이터 파일 위치를 정하고, 루트에서 소스 PDB를 닫고(실습은 읽기 전용으로 다시 엶), CREATE PLUGGABLE DATABASE ... FROM으로 복제하고, 새 PDB를 엶

복제된 PDB는 SYSTEM, SYSAUX, UNDO 테이블스페이스, 카탈로그, SYS와 SYSTEM, 수업 자료와 같은 이름의 로컬 관리자 계정을 물려받고 서비스 이름만 새로 받음

NO DATA를 주면 데이터는 빼고 메타데이터(스키마 구조)만 복제함

#개념과 동작 원리

#새 데이터 파일 위치 정하기

환경 방법
OMF 사용 DB_CREATE_FILE_DEST 초기화 파라미터
OMF 미사용 PDB_FILE_NAME_CONVERT 초기화 파라미터
문장에서 직접 CREATE PLUGGABLE DATABASE 안의 CREATE_FILE_DEST 절

실습에서는 이 방식이 시드로부터 PDB를 만들 때와 원리가 같다고 적었음
OMF는 데이터 파일 배치와 OMF에 있음

#소스 PDB의 상태

수업 자료 본문은 "소스 PDB를 닫는다"고 적었고, 실습은 닫은 뒤 OPEN READ ONLY로 다시 열고 복제했음
Oracle Database 19c의 로컬 PDB 복제는 소스 PDB가 닫히지 않은 상태를 전제함
CDB가 local undo와 ARCHIVELOG 모드이면 소스 PDB를 읽기, 쓰기로 연 채 핫 클론할 수 있음
둘 중 하나라도 충족하지 않으면 소스 PDB를 읽기 전용으로 열어야 함
복제 시작부터 종료까지 생성된 아카이브 로그를 보존해야 함
실습은 읽기 전용으로 다시 연 절차이며 당시 local undo, ARCHIVELOG 설정과 핫 클론 가능 여부는 확인 불가

#필수 명령어 또는 SQL

#시드에서 PDB 만들기와 자동 열림 설정

SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
CREATE PLUGGABLE DATABASE labsrc
  ADMIN USER pdbadmin IDENTIFIED BY <PASSWORD> ROLES = (DBA);

ALTER PLUGGABLE DATABASE labsrc OPEN;
ALTER PLUGGABLE DATABASE labsrc SAVE STATE;
SQL*Plus (SYSDBA, CDB$ROOT)조회만 함
SELECT name, open_mode FROM v$pdbs WHERE LOWER(name) = 'labsrc';

결과 해석:

SAVE STATE는 CDB를 다시 기동했을 때 이 PDB가 지금 상태(열림)로 돌아오게 함
실습은 DB_CREATE_FILE_DEST가 설정된 상태에서 파일 위치 절 없이 만들었음

#소스 PDB에 데이터 준비

SQL*Plus (SYSDBA, labsrc)객체 또는 설정을 변경함
ALTER SESSION SET CONTAINER = labsrc;

CREATE TABLESPACE users DATAFILE SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 1G;
ALTER DATABASE DEFAULT TABLESPACE users;

CREATE USER app IDENTIFIED BY <PASSWORD>
  DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
GRANT CREATE SESSION, RESOURCE, DBA TO app;

CREATE TABLE app.t_order (id NUMBER, order_dt DATE, amt NUMBER);
INSERT INTO app.t_order
SELECT LEVEL, SYSDATE - LEVEL, LEVEL * 1000 FROM dual CONNECT BY LEVEL <= 1000;
COMMIT;

결과 해석:

실습에서는 실습용 로컬 사용자에게 DBA 역할까지 줬음
실습 편의를 위한 것이며 운영 계정에는 맞지 않음

#복제 4단계

SQL*Plus (SYSDBA, CDB$ROOT)조회만 함
SHOW PARAMETER db_create_file_dest
SQL*Plus (SYSDBA, CDB$ROOT)인스턴스 또는 서비스 중단이 필요함
ALTER PLUGGABLE DATABASE labsrc CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE labsrc OPEN READ ONLY;
SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
CREATE PLUGGABLE DATABASE labcopy FROM labsrc;

ALTER PLUGGABLE DATABASE labcopy OPEN;
ALTER PLUGGABLE DATABASE labcopy SAVE STATE;
SQL*Plus (SYSDBA, CDB$ROOT)인스턴스 또는 서비스 중단이 필요함
ALTER PLUGGABLE DATABASE labsrc CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE labsrc OPEN;

결과 해석:

마지막 블록은 소스 PDB를 다시 읽기, 쓰기로 되돌림
소스 PDB를 닫는 동안 그 PDB의 서비스는 쓸 수 없음

SQL*Plus (SYSDBA)현재 세션 설정만 변경함
ALTER SESSION SET CONTAINER = labcopy;

SELECT tablespace_name, file_name FROM dba_data_files;
SELECT COUNT(*) FROM app.t_order;

결과 해석:

실습에서는 복제된 PDB에서 테이블스페이스와 APP.T_ORDER가 이어지는지 확인했음
결과 출력은 기재 없음

#NO DATA 복제

SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
CREATE PLUGGABLE DATABASE labnos FROM labsrc NO DATA;

ALTER PLUGGABLE DATABASE labnos OPEN;

결과 해석:

실습에서는 소스 PDB를 읽기 전용으로 연 상태에서 실행했음
실습 기록: 복제된 PDB에 같은 로컬 사용자로 접속해 테이블을 조회하자 "no rows selected"가 나왔음
테이블 구조는 있고 행은 없음

#사용자 테이블스페이스를 골라 복제 (USER_TABLESPACES)

소스(시드나 다른 PDB)에서 새 PDB로 가져올 사용자 정의 테이블스페이스를 고르거나 제한할 때 씀

옵션 결과
USER_TABLESPACES = ALL(기본값) 사용자 테이블스페이스를 모두 복제
USER_TABLESPACES = NONE 사용자 테이블스페이스 없이 생성
USER_TABLESPACES = ('<TS1>', '<TS2>') 적은 테이블스페이스만 복제
USER_TABLESPACES = ALL EXCEPT ('<TS1>') 적은 것만 빼고 복제
SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
CREATE PLUGGABLE DATABASE <NEW_PDB> FROM <SOURCE_PDB>
  USER_TABLESPACES = ('<TS_NAME>')
  FILE_NAME_CONVERT = ('<SOURCE_PDB_DIR>/', '<NEW_PDB_DIR>/');

결과 해석:

언플러그한 XML로 복제할 때도 같은 절을 쓸 수 있음

SQL*Plus (SYSDBA, CDB$ROOT)인스턴스 또는 서비스 중단이 필요함
ALTER PLUGGABLE DATABASE <SOURCE_PDB> CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE <SOURCE_PDB> UNPLUG INTO '<XML_FILE>';

CREATE PLUGGABLE DATABASE <NEW_PDB>
  AS CLONE USING '<XML_FILE>'
  COPY
  USER_TABLESPACES = NONE;

결과 해석:

결과 확인: 새 PDB에서 SELECT tablespace_name FROM dba_tablespaces로 고른 테이블스페이스만 있는지 확인함

#정리

SQL*Plus (SYSDBA, CDB$ROOT)데이터 또는 파일을 삭제함, 되돌릴 수 없음
ALTER PLUGGABLE DATABASE <PDB_NAME> CLOSE IMMEDIATE;
DROP PLUGGABLE DATABASE <PDB_NAME> INCLUDING DATAFILES;

결과 해석: 개별 실행 출력은 기재 없음

#사용 조건과 주의사항

소스 PDB를 닫으면 그 PDB를 쓰는 서비스가 중단됨

위 핫 클론 조건은 로컬 PDB 복제 기준이며 원격 복제와 스냅샷 복제의 추가 제약은 별도 확인이 필요함

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기