데이터베이스 연구실.log

PDB 이동과 Non-CDB 전환 (Unplug/Plug, DBMS_PDB)

PDB Unplug와 Plug, 19c non-CDB의 XML 생성과 호환성 검사 및 대상 CDB 편입

Non-CDBPDBDBMS_PDBnoncdb_to_pdb.sqlCOPYUNPLUG

#핵심 요약

PDB 이동: 소스 CDB에서 PDB를 닫고 UNPLUG INTO 'xml'로 빼낸 뒤, 대상 CDB에서 호환성을 검사하고 CREATE PLUGGABLE DATABASE ... USING 'xml'로 꽂음

non-CDB 전환 순서: non-CDB를 읽기 전용으로 열어 DBMS_PDB.DESCRIBE로 XML 생성, 대상 CDB에서 CHECK_PLUG_COMPATIBILITY, CREATE PLUGGABLE DATABASE ... USING 'xml' COPY, PDB 안에서 noncdb_to_pdb.sql 실행, PDB 재기동

COPY 방식은 원래 파일을 보존하고 대상 경로로 복사함

실습의 AutoUpgrade 문서와 DBUA 문서에 같은 절차가 있는데 세부 순서가 다름
아래 표와 주의사항에 정리했음

#개념과 동작 원리

두 작업 모두 XML 파일로 PDB 구조를 설명하고, 대상 CDB가 그 XML로 호환 여부를 점검한 뒤 PDB를 만듦
차이는 XML을 만드는 방법임
이미 PDB인 것은 소스 CDB에서 UNPLUG INTO로 XML을 만들고, non-CDB는 DBMS_PDB.DESCRIBE로 만든 뒤 PDB 안에서 변환 스크립트를 한 번 더 실행함

공식 문서(Oracle Database 19c Multitenant Administrator's Guide E96136-19, 11장 Removing a PDB)에 따르면 PDB는 닫힌 상태에서만 Unplug할 수 있고, Unplug한 PDB는 마운트 상태로 소스 CDB에 남음
XML에는 대상 CDB에서 CREATE PLUGGABLE DATABASE로 꽂는 데 필요한 메타데이터가 들어 있음

non-CDB 전환에서는 대상 CDB를 먼저 PDB 0개로 만들고(-numberOfPDBs 0), 기존 non-CDB(ORCL)를 PDB(ORCLPDB)로 편입함
XML은 non-CDB의 구조를 설명하는 파일이고, 이 파일로 CDB가 호환 여부를 점검한 뒤 PDB를 만듦
변환 스크립트(noncdb_to_pdb.sql)는 편입된 PDB 안에서 non-CDB 형태의 흔적을 PDB 형태로 정리함
스크립트의 세부 동작은 수업 자료에 설명이 없음

#주요 용어와 구성 요소

용어 설명
DBMS_PDB.DESCRIBE PDB 설명 XML 파일 생성
non-CDB를 READ ONLY로 연 상태에서 실행
DBMS_PDB.CHECK_PLUG_COMPATIBILITY XML과 대상 CDB의 호환 여부를 TRUE 또는 FALSE로 반환
COPY 원래 파일을 복사해 새 위치에 PDB 구성
FILE_NAME_CONVERT 실습 경로를 대상 경로로 치환
UNPLUG INTO 'xml' 닫힌 PDB를 CDB에서 분리하고 메타데이터를 XML로 기록
CREATE_FILE_DEST COPY로 꽂을 때 데이터 파일을 만들 디렉터리 지정

#필수 명령어 또는 SQL

#1. non-CDB에서 XML 생성

셸 (oracle)데이터 또는 파일을 삭제함, 되돌릴 수 없음
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl
rm -f /home/oracle/orcl.xml
SQL*Plus (SYSDBA, non-CDB)인스턴스 또는 서비스 중단이 필요함
SHUTDOWN IMMEDIATE;
STARTUP OPEN READ ONLY;

EXEC DBMS_PDB.DESCRIBE('/home/oracle/orcl.xml');

SHUTDOWN IMMEDIATE;

결과 해석:

DBMS_PDB.DESCRIBE(pdb_descr_file => '/home/oracle/orcl.xml')을 PL/SQL 블록으로 쓰는 형태도 수업 자료에 있음

#2. 대상 CDB에서 호환성 검사

셸 (oracle)현재 세션 설정만 변경함
export ORACLE_SID=cdb
SQL*Plus (SYSDBA, CDB)현재 세션 설정만 변경함
SET SERVEROUTPUT ON

DECLARE
    v_result BOOLEAN;
BEGIN
    v_result := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
        pdb_descr_file => '/home/oracle/orcl.xml',
        pdb_name       => 'ORCLPDB'
    );

    IF v_result THEN
        DBMS_OUTPUT.PUT_LINE('YES');
    ELSE
        DBMS_OUTPUT.PUT_LINE('NO');
    END IF;
END;
/

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

#3. PDB 생성

셸 (oracle)객체 또는 설정을 변경함
mkdir -p /u01/app/oracle/oradata/cdb/orclpdb
SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
CREATE PLUGGABLE DATABASE orclpdb
USING '/home/oracle/orcl.xml'
COPY
FILE_NAME_CONVERT = (
  '/u01/app/oracle/oradata/orcl/',
  '/u01/app/oracle/oradata/cdb/orclpdb/'
);

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

#4. 변환 스크립트와 재기동

SQL*Plus (SYSDBA)객체 또는 설정을 변경함
ALTER SESSION SET CONTAINER=orclpdb;
@?/rdbms/admin/noncdb_to_pdb.sql
SQL*Plus (SYSDBA)인스턴스 또는 서비스 중단이 필요함
ALTER SESSION SET CONTAINER=CDB$ROOT;
ALTER PLUGGABLE DATABASE orclpdb CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE orclpdb OPEN;
ALTER PLUGGABLE DATABASE orclpdb SAVE STATE;
SHOW PDBS;

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

#5. 최종 검증

SQL*Plus (SYSDBA)조회만 함
show con_name
show pdbs
select name, open_mode from v$pdbs;
select comp_name, version, status from dba_registry order by comp_name;

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

#일반 PDB를 다른 CDB로 옮기기 (Unplug와 Plug)

실습 환경: 소스 CDB newcdb의 PDB MOVEPDB를 대상 CDB orcl로 옮김
셸에서 ORACLE_SID를 바꿔 가며 SQL*Plus(SYSDBA, CDB$ROOT)로 실행함

소스 CDB에서 PDB 닫기와 Unplug

SQL*Plus (SYSDBA, 원래 CDB의 CDB$ROOT)인스턴스 또는 서비스 중단이 필요함
ALTER PLUGGABLE DATABASE movepdb CLOSE IMMEDIATE;
SHOW PDBS
셸 (oracle)객체 또는 설정을 변경함
mkdir -p /home/oracle/stage
SQL*Plus (SYSDBA, 원래 CDB의 CDB$ROOT)객체 또는 설정을 변경함
ALTER PLUGGABLE DATABASE movepdb UNPLUG INTO '/home/oracle/stage/movepdb.xml';
SELECT pdb_name, status FROM cdb_pdbs;

결과 해석:

실습 기록: 닫은 뒤 MOVEPDB는 MOUNTED, Unplug 뒤 CDB_PDBS의 상태는 UNPLUGGED였음

대상 CDB에서 호환성 검사와 Plug

SQL*Plus (SYSDBA, 대상 CDB의 CDB$ROOT)현재 세션 설정만 변경함
SET SERVEROUTPUT ON
DECLARE c BOOLEAN;
BEGIN
  c := DBMS_PDB.CHECK_PLUG_COMPATIBILITY('/home/oracle/stage/movepdb.xml', 'MOVEPDB');
  DBMS_OUTPUT.PUT_LINE(CASE WHEN c THEN 'YES' ELSE 'NO' END);
END;
/
셸 (oracle)객체 또는 설정을 변경함
mkdir -p /u01/app/oracle/oradata/ORCL/movepdb
SQL*Plus (SYSDBA, 대상 CDB의 CDB$ROOT)객체 또는 설정을 변경함
CREATE PLUGGABLE DATABASE movepdb
USING '/home/oracle/stage/movepdb.xml'
COPY CREATE_FILE_DEST='/u01/app/oracle/oradata/ORCL/movepdb';

ALTER PLUGGABLE DATABASE movepdb OPEN;
ALTER PLUGGABLE DATABASE movepdb SAVE STATE;
SHOW PDBS

결과 해석:

실습 기록: 꽂은 직후 MOVEPDB는 MOUNTED였고, 이후 열었음
실습에서는 CREATE_FILE_DEST 경로를 환경에 맞게 고치라고 표시했음

#구문과 옵션 설명

구문 의미 바꿀 입력값
STARTUP OPEN READ ONLY DESCRIBE를 위해 읽기 전용으로 기동
pdb_descr_file, pdb_name XML 경로, 편입할 PDB 이름
USING 'xml' COPY XML 기준으로 파일 복사 방식 PDB 생성
FILE_NAME_CONVERT = (대상) 경로 치환 실제 데이터 파일 경로
ALTER SESSION SET CONTAINER 세션의 컨테이너 전환 PDB 이름 또는 CDB$ROOT
SAVE STATE CDB 재기동 후에도 PDB가 열린 상태 유지

#사용 조건과 주의사항

COPY 대신 원래 파일을 옮기는 방식은 기재 없음

이 전환은 업그레이드 문서의 일부로 쓰였음
전환 전에 non-CDB가 대상 CDB와 같은 버전이어야 한다는 조건은 수업 자료가 19c로 올린 뒤 전환한 흐름에서 암시되지만 명시되지 않았음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

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

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