이 글에서는 플러거블 데이터베이스(PDB)를 소스 컨테이너 데이터베이스(CDB)에서 분리(unplug)한 뒤, 대상 CDB에 다시 연결(plug)하는 전체 과정을 단계별로 살펴봅니다. 여기서 PDB란 애플리케이션 관련 데이터를 모두 저장하는 데이터베이스를 의미합니다.
멀티테넌트 아키텍처 개요
CDB(Container Database)는 서로 다른 애플리케이션과 관련된 0개 이상의 PDB를 포함하며, Oracle® 관련 메타데이터와 공용 사용자(common user)를 저장하는 단 하나의 루트 컨테이너를 반드시 가집니다. 루트 컨테이너의 이름은 CDB$ROOT입니다. 또한 루트 컨테이너에는 PDB$SEED라는 시드(seed) PDB가 하나 존재하는데, 이 시드 PDB는 CDB가 새로운 PDB를 생성할 때 사용하는 시스템 제공 템플릿입니다.
PDB는 비컨테이너(non-CDB) 환경에서 사용하던 것과 동일한 형태의 데이터베이스입니다. Oracle은 12c 버전에서 이러한 컨테이너 및 PDB 기능을 도입하여, 비즈니스 요구 사항에 따라 PDB를 자유롭게 추가할 수 있게 했습니다. 예를 들어 영업 부서 데이터를 담는 PDB를 영업 애플리케이션용으로, 인사(HR) 부서 데이터를 담는 PDB를 인사 애플리케이션용으로 각각 생성할 수 있습니다.
언플러그(unplug)란 PDB를 소스 CDB에서 분리하고, 플러그(plug)란 해당 PDB를 대상 CDB에 연결하는 작업을 말합니다.
이 글의 예제 환경은 다음과 같습니다. 소스 CDB인 TEST12에는 PDB1과 PDB2 두 개의 PDB가 있으며, 대상 CDB인 DEV12가 분리된 PDB들을 받게 됩니다.
PDB 언플러그 및 플러그 실습
이 섹션에서는 소스 CDB TEST12에서 PDB1과 PDB2를 분리한 후, 대상 CDB DEV12에 연결하는 방법을 알아봅니다.
작업을 시작하기 전 소스 PDB들의 상태는 MOUNTED로 표시됩니다.
1단계: 대상 CDB와의 호환성 검증
플러그 작업을 시작하기 전에, 연결하려는 PDB가 새로운 호스트 CDB와 호환되는지 반드시 확인해야 합니다. 호환되지 않으면 아래 PL/SQL 블록 실행 시 오류가 발생합니다.
. oraenv
[프롬프트에 dev12 입력]
sqlplus / as sysdba
set serveroutput on
DECLARE
compatible BOOLEAN := FALSE;
BEGIN
compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml');
if compatible then
DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? YES');
else DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? NO');
end if;
END;
/
set serveroutput on
DECLARE
compatible BOOLEAN := FALSE;
BEGIN
compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/home/oracle/app/oradata/pdb2/pdb2.xml');
if compatible then
DBMS_OUTPUT.PUT_LINE('Is pluggable PDB2 compatible? YES');
else DBMS_OUTPUT.PUT_LINE('Is pluggable PDB2 compatible? NO');
end if;
END;
/
2단계: PDB 종료(Close)
PDB를 분리하려면 먼저 PDB를 종료해야 합니다. 다음 SQL*Plus® 문을 실행합니다.
. oraenv
[프롬프트에 test12 입력]
sqlplus / as sysdba
alter pluggable database pdb1 close immediate;
alter pluggable database pdb2 close immediate;
실행 후 소스 PDB들은 마운트 상태에서 closed(종료) 상태가 되어야 합니다.
3단계: PDB 언플러그
PDB를 종료한 후 XML 매니페스트 파일을 생성합니다. 이 XML 파일에는 분리되는 PDB의 테이블스페이스 이름과 전체 경로, 그리고 데이터 파일 정보가 포함됩니다.
다음 명령으로 종료된 PDB를 분리하고 XML 파일의 경로와 이름을 지정합니다.
alter pluggable database pdb1 unplug into '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml';
alter pluggable database pdb2 unplug into '/home/oracle/app/oradata/pdb2/pdb2.xml';
다음 명령으로 종료된 PDB를 삭제(drop)하되 데이터 파일은 보존합니다.
drop pluggable database pdb1 keep datafiles;
drop pluggable database pdb2 keep datafiles;
다음 명령으로 분리된 PDB의 상태를 확인합니다.
select pdb_name, status from cdb_pdbs where pdb_name in ('PDB1', 'PDB2');
[아무 행도 조회되지 않음]
exit
4단계: PDB 플러그 — 세 가지 방법
PDB를 대상 CDB에 연결하는 방법은 COPY, NOCOPY, CLONE MOVE 세 가지가 있습니다.
COPY 방식으로 플러그
COPY 방식은 새 데이터 파일의 대상 위치를 생성·정의한 뒤, 분리된 PDB를 대상 CDB에 연결하고 데이터 파일을 복사하는 방법입니다.
먼저 대상 디렉터리를 생성합니다.
mkdir /home/oracle/app/oradata/DEV12/pdb1
sqlplus / as sysdba
분리된 PDB의 데이터 파일을 사용해 PDB를 CDB에 연결하고, 데이터 파일을 새 위치로 복사합니다.
create pluggable database pdb_plug_copy using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml'
COPY
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/pdb1');
연결된 PDB의 상태와 오픈 모드를 확인합니다.
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_COPY';
select open_mode from v$pdbs where name='PDB_PLUG_COPY';
-- 연결된 PDB의 데이터 파일 목록 조회
select name from v$datafile where con_id=3;
exit
NOCOPY 방식으로 플러그
NOCOPY 방식은 복사본을 만들거나 사용하지 않고, 분리된 PDB의 원본 데이터 파일을 그대로 사용해 대상 CDB에 연결하는 방법입니다.
create pluggable database pdb_plug_nocopy using '/home/oracle/app/oradata/pdb2/pdb2.xml'
NOCOPY
TEMPFILE REUSE;
이 작업은 몇 초 안에 완료됩니다. 분리된 PDB의 원본 데이터 파일이 이제 새 호스트 CDB의 새로 연결된 PDB에 속하게 됩니다. XML 파일에 지정된 임시 파일(temp file)과 동일한 이름의 파일이 대상 위치에 이미 존재하므로, TEMPFILE REUSE 절이 필요합니다.
연결된 PDB의 상태와 오픈 모드를 확인합니다.
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_NOCOPY';
select open_mode from v$pdbs where name='PDB_PLUG_NOCOPY';
연결된 PDB의 데이터 파일 목록도 확인합니다.
select name from v$datafile where con_id=3;
select name from v$datafile where con_id=4;
exit
CLONE MOVE 방식으로 플러그
CLONE MOVE 방식은 새 데이터 파일의 대상 위치를 생성·정의하고, 분리된 PDB의 데이터 파일을 사용해 대상 CDB에 연결한 뒤, 데이터 파일을 다른 위치로 이동(move)하는 방법입니다.
대상 디렉터리를 생성합니다.
mkdir /home/oracle/app/oradata/DEV12/clone
sqlplus / as sysdba
PDB를 CDB에 연결하고 데이터 파일을 새 위치로 이동합니다.
create pluggable database pdb_plug_move using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml'
MOVE
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/clone');
이때 전역 고유 식별자(GUID)가 고유하지 않다는 오류 메시지가 표시됩니다. PDB1이 이미 COPY 방식으로 연결되어 GUID 충돌이 발생한 것입니다.
이 문제를 해결하려면 AS CLONE 절을 추가하여 다음 코드를 실행합니다.
create pluggable database pdb_plug_move
AS CLONE using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml'
MOVE
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/clone');
연결된 PDB의 상태와 오픈 모드를 확인합니다.
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_MOVE';
select open_mode from v$pdbs where name='PDB_PLUG_MOVE';
연결된 PDB의 데이터 파일 목록도 조회합니다.
select name from v$datafile where con_id=5;
5단계: 연결된 PDB 오픈
다음 명령으로 PDB를 열어(open) 플러그 작업을 마무리합니다.
alter pluggable database pdb_plug_nocopy open;
alter pluggable database pdb_plug_copy open;
alter pluggable database pdb_plug_move open;
연결된 PDB들에 접속하여 현재 연결된 컨테이너 이름을 확인합니다.
connect sys/*****@localhost:1521/pdb_plug_nocopy AS SYSDBA
show con_name
connect sys/******@localhost:1521/pdb_plug_copy AS SYSDBA
show con_name
connect sys/******@localhost:1521/pdb_plug_move AS SYSDBA
show con_name
exit
6단계: PDB를 소스 CDB로 되돌리기
모든 플러거블 데이터베이스를 종료합니다.
. oraenv
[프롬프트에 dev12 입력]
sqlplus / as sysdba
alter pluggable database all close immediate;
pdb1 데이터베이스를 재생성하는 데 사용할 수 있도록 pdb_plug_copy를 분리합니다.
alter pluggable database pdb_plug_copy unplug into '/home/oracle/app/oradata/pdb_plug_copy.xml';
pdb_plug_copy 데이터베이스를 삭제합니다.
drop pluggable database pdb_plug_copy;
pdb2 재생성에 사용할 수 있도록 pdb_plug_nocopy를 분리하고 삭제합니다.
alter pluggable database pdb_plug_nocopy unplug into '/home/oracle/app/oradata/pdb_plug_nocopy.xml';
drop pluggable database pdb_plug_nocopy keep datafiles;
pdb_plug_move 데이터베이스를 삭제합니다.
drop pluggable database pdb_plug_move;
pdb1 데이터베이스를 TEST12 CDB에 다시 연결합니다.
connect sys/*****@localhost:1521/test12 as sysdba
create pluggable database pdb1 AS CLONE using '/u01/app/oracle/oradata/pdb_plug_copy.xml'
MOVE
FILE_NAME_CONVERT=('/home/oracle/app/oradata/DEV12/pdb1','/home/oracle/app/oradata/TEST12/pdb1');
pdb2 데이터베이스도 TEST12 CDB에 다시 연결합니다.
create pluggable database pdb2 using '/u01/app/oracle/oradata/pdb_plug_nocopy.xml' nocopy tempfile reuse;
pdb1과 pdb2를 엽니다.
alter pluggable database pdb2 open;
alter pluggable database pdb1 open;
exit
마치며
PDB의 언플러그와 플러그 기능은 서버 간 파일 전송을 단순화하고 사람의 실수 가능성을 줄여줍니다. 예를 들어 모든 PDB에 패치를 한 번에 적용할 수 있는 반면, 비컨테이너 환경에서는 각 데이터베이스마다 개별적으로 패치를 적용해야 합니다. 백업 등 기타 유지보수 작업 역시 컨테이너 및 PDB 환경에서 훨씬 수월합니다. 또한 서버 간 전송해야 할 파일이 하나로 통합되므로, 특정 파일을 실수로 누락하고 전송할 위험도 없습니다.
이 글이 12c의 PDB와 CDB가 비컨테이너 데이터베이스에 비해 갖는 장점을 이해하는 데 도움이 되기를 바랍니다.
궁금한 점이나 의견이 있다면 피드백 탭을 통해 남겨 주세요. 데이터베이스 서비스에 대해 더 자세히 알아보세요.