PDB 이동과 Non-CDB 전환 (Unplug/Plug, DBMS_PDB)
PDB Unplug와 Plug, 19c non-CDB의 XML 생성과 호환성 검사 및 대상 CDB 편입
#핵심 요약
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 생성
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.xmlSHUTDOWN 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에서 호환성 검사
export ORACLE_SID=cdbSET 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 생성
mkdir -p /u01/app/oracle/oradata/cdb/orclpdbCREATE PLUGGABLE DATABASE orclpdb
USING '/home/oracle/orcl.xml'
COPY
FILE_NAME_CONVERT = (
'/u01/app/oracle/oradata/orcl/',
'/u01/app/oracle/oradata/cdb/orclpdb/'
);결과 해석: 개별 실행 출력은 기재 없음
#4. 변환 스크립트와 재기동
ALTER SESSION SET CONTAINER=orclpdb;
@?/rdbms/admin/noncdb_to_pdb.sqlALTER 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. 최종 검증
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
ALTER PLUGGABLE DATABASE movepdb CLOSE IMMEDIATE;
SHOW PDBSmkdir -p /home/oracle/stageALTER 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
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;
/mkdir -p /u01/app/oracle/oradata/ORCL/movepdbCREATE 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로 올린 뒤 전환한 흐름에서 암시되지만 명시되지 않았음