PDB 생성과 복제
시드와 기존 PDB를 이용한 생성, 파일 위치와 OPEN 모드 및 NO DATA 복제 조건
#핵심 요약
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 만들기와 자동 열림 설정
CREATE PLUGGABLE DATABASE labsrc
ADMIN USER pdbadmin IDENTIFIED BY <PASSWORD> ROLES = (DBA);
ALTER PLUGGABLE DATABASE labsrc OPEN;
ALTER PLUGGABLE DATABASE labsrc SAVE STATE;SELECT name, open_mode FROM v$pdbs WHERE LOWER(name) = 'labsrc';결과 해석:
SAVE STATE는 CDB를 다시 기동했을 때 이 PDB가 지금 상태(열림)로 돌아오게 함
실습은 DB_CREATE_FILE_DEST가 설정된 상태에서 파일 위치 절 없이 만들었음
#소스 PDB에 데이터 준비
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단계
SHOW PARAMETER db_create_file_destALTER PLUGGABLE DATABASE labsrc CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE labsrc OPEN READ ONLY;CREATE PLUGGABLE DATABASE labcopy FROM labsrc;
ALTER PLUGGABLE DATABASE labcopy OPEN;
ALTER PLUGGABLE DATABASE labcopy SAVE STATE;ALTER PLUGGABLE DATABASE labsrc CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE labsrc OPEN;결과 해석:
마지막 블록은 소스 PDB를 다시 읽기, 쓰기로 되돌림
소스 PDB를 닫는 동안 그 PDB의 서비스는 쓸 수 없음
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 복제
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>') |
적은 것만 빼고 복제 |
CREATE PLUGGABLE DATABASE <NEW_PDB> FROM <SOURCE_PDB>
USER_TABLESPACES = ('<TS_NAME>')
FILE_NAME_CONVERT = ('<SOURCE_PDB_DIR>/', '<NEW_PDB_DIR>/');결과 해석:
언플러그한 XML로 복제할 때도 같은 절을 쓸 수 있음
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로 고른 테이블스페이스만 있는지 확인함
#정리
ALTER PLUGGABLE DATABASE <PDB_NAME> CLOSE IMMEDIATE;
DROP PLUGGABLE DATABASE <PDB_NAME> INCLUDING DATAFILES;결과 해석: 개별 실행 출력은 기재 없음
#사용 조건과 주의사항
소스 PDB를 닫으면 그 PDB를 쓰는 서비스가 중단됨
위 핫 클론 조건은 로컬 PDB 복제 기준이며 원격 복제와 스냅샷 복제의 추가 제약은 별도 확인이 필요함