데이터베이스 연구실.log

수동 CDB 생성과 PDB 파일 배치

NOMOUNT부터 CREATE DATABASE와 catcdb.sql까지의 CDB 생성, PDB 파일 배치 우선순위와 DB 삭제

CDBENABLE PLUGGABLE DATABASEcatcdb.sqlOMFFILE_NAME_CONVERT

#핵심 요약

CDB 생성은 NOMOUNT(인스턴스 생성), MOUNT 단계의 CREATE DATABASE, OPEN 단계의 catcdb.sql 세 단계임
단계마다 열리는 파일과 존재하게 되는 것이 다름

ENABLE PLUGGABLE DATABASE 절이 CDB로 만들겠다는 선언임
SEED FILE_NAME_CONVERT는 시드 PDB의 데이터 파일 위치를 정함

PDB 데이터 파일 위치를 정하는 방법은 네 가지(CREATE_FILE_DEST, FILE_NAME_CONVERT, OMF, PDB_FILE_NAME_CONVERT)이고 우선순위가 있음
네 가지가 모두 없으면 PDB 생성이 실패함

DROP DATABASE는 파라미터 파일, 비밀번호 파일, /etc/oratab 항목을 지우지 않음

#개념과 동작 원리

#세 단계

단계 상태 이 시점에 열리는 것 하는 일 끝나면 존재하는 것
1 NOMOUNT 초기화 파라미터 파일, 얼럿 로그
SGA 할당, 백그라운드 프로세스 기동
파라미터 파일 준비, STARTUP NOMOUNT 인스턴스만
데이터베이스는 아직 없음
2 MOUNT 컨트롤 파일 CREATE DATABASE 컨트롤 파일, 리두 로그, CDB 루트와 시드의 데이터 파일
3 OPEN 데이터 파일, 온라인 리두 로그 catcdb.sql 데이터 딕셔너리 뷰, 표준 PL/SQL 패키지

NOMOUNT 상태에서 V$DATABASE를 조회하면 ORA-01507: database not mounted가 나온다는 것이 실습 기록임(인스턴스는 떠 있지만 DB는 없다는 뜻)

#CREATE DATABASE 절

절 정하는 것
USER SYS, USER SYSTEM IDENTIFIED BY 관리자 계정의 초기 비밀번호
실습에서는 비밀번호 복잡도 검증을 통과하지 못하면 CREATE DATABASE 자체가 실패한다고 설명
LOGFILE GROUP 리두 그룹, 멤버, 크기
멤버를 서로 다른 디스크에 두어 다중화
CHARACTER SET, NATIONAL CHARACTER SET 문자 집합
되돌리기 어려운 결정
EXTENT MANAGEMENT LOCAL SYSTEM 테이블스페이스의 공간 관리 방식
DATAFILE, SYSAUX DATAFILE SYSTEM, SYSAUX 데이터 파일 위치와 크기
DEFAULT TEMPORARY TABLESPACE, UNDO TABLESPACE 임시, undo 테이블스페이스
ENABLE PLUGGABLE DATABASE CDB로 만들겠다는 선언
SEED FILE_NAME_CONVERT 시드 PDB 데이터 파일이 만들어질 자리

#로컬 관리와 딕셔너리 관리

초기에는 익스텐트 할당 정보를 딕셔너리 테이블에 기록하는 딕셔너리 관리가 기본이었고, 할당과 반납 때마다 딕셔너리 갱신이 일어나 성능에 불리했음
로컬 관리는 각 데이터 파일 헤더에 비트맵으로 사용 정보를 기록해 딕셔너리를 거치지 않음
ASSM(자동 세그먼트 공간 관리)과 온라인 세그먼트 축소는 로컬 관리를 전제로 하고, OMF, 데이터 파일 자동 확장, AWR 기반 용량 예측은 두 방식 모두에서 동작한다고 수업 자료가 설명함
19c 등 최신 버전에서는 SYSTEM도 로컬 관리가 사실상 유일한 선택지이고 테이블스페이스 생성 시 지정이 없으면 로컬 관리가 기본이라는 설명도 수업 자료에 있음

#PDB 데이터 파일 위치를 정하는 방법

방법 우선순위 지정 정하는 방식
CREATE_FILE_DEST 1 SQL 이 PDB의 파일을 둘 디렉터리를 직접 지정
이름은 오라클이 정함
FILE_NAME_CONVERT(CREATE DATABASE에서는 SEED FILE_NAME_CONVERT) 2 SQL 실습 경로 문자열을 대상 경로로 치환
파일 이름은 그대로
OMF(DB_CREATE_FILE_DEST) 3 파라미터 목적지만 정하고 이름은 오라클이 결정
PDB_FILE_NAME_CONVERT 파라미터 4 파라미터 같은 치환 규칙을 미리 걸어 둠

실습에서 확인한 사항

네 가지 방법은 각각 단독으로 PDB 생성에 성공했음

OMF와 PDB_FILE_NAME_CONVERT가 함께 켜져 있으면 OMF가 우선해 파라미터 방식은 조용히 무시됨
그래서 PDB_FILE_NAME_CONVERT를 쓰려면 OMF를 먼저 꺼야 함

네 가지가 모두 없으면 ORA-65016: FILE_NAME_CONVERT must be specified로 실패함

OMF가 켜져 있어도 경로를 직접 지정하면 그 경로가 반영됨
OMF는 기본값이지 잠금이 아님

OMF 파일 이름은 o1_mf_ 규칙이고, PDB 파일은 PDB GUID 하위 디렉터리에 놓임

#주요 용어와 구성 요소

용어 설명
CDB 루트(CON_ID 1), 시드(CON_ID 2) CREATE DATABASE로 함께 만들어짐
컨트롤 파일과 리두 로그는 CDB 공용이라 seed 안에 없음
max_pdbs 실습 예시에서 10으로 지정한 파라미터
OMF Oracle Managed Files
DB_CREATE_FILE_DEST로 목적지만 지정
DB_CREATE_ONLINE_LOG_DEST_1 리두 로그 파일 OMF 목적지

#필수 명령어 또는 SQL

#1단계: 파라미터 파일과 NOMOUNT

셸 (oracle)객체 또는 설정을 변경함
mkdir -p /u01/app/oracle/oradata/CDBDEV
mkdir -p /u01/app/oracle/admin/CDBDEV/adump

cat > $ORACLE_HOME/dbs/initCDBDEV.ora <<'EOF'
db_name=CDBDEV
db_unique_name=CDBDEV
compatible=19.0.0
enable_pluggable_database=TRUE
max_pdbs=10
control_files=('/u01/app/oracle/oradata/CDBDEV/control01.ctl','/u01/app/oracle/oradata/CDBDEV/control02.ctl')
db_block_size=8192
undo_management=AUTO
sga_target=1G
pga_aggregate_target=300M
processes=300
diagnostic_dest='/u01/app/oracle'
audit_file_dest='/u01/app/oracle/admin/CDBDEV/adump'
remote_login_passwordfile=EXCLUSIVE
EOF

export ORACLE_SID=CDBDEV
sqlplus / as sysdba

결과 해석:

필수 세 항목은 db_name, control_files, enable_pluggable_database임
인스턴스가 없으면 Connected to an idle instance가 나옴
새로 올릴 SID 이름은 대소문자를 구분하므로 서버의 실제 값 그대로 씀

SQL*Plus (SYSDBA)객체 또는 설정을 변경함
STARTUP NOMOUNT PFILE=$ORACLE_HOME/dbs/initCDBDEV.ora
SELECT status, instance_name, database_status FROM v$instance;

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

#2단계: CREATE DATABASE

셸 (oracle)객체 또는 설정을 변경함
mkdir -p /u01/app/oracle/oradata/CDBDEV/seed

결과 해석:

SEED FILE_NAME_CONVERT의 대상 디렉터리는 오라클이 자동으로 만들지 않음
빠뜨리면 중간까지 만들고 실패함

SQL*Plus (SYSDBA, NOMOUNT 상태)객체 또는 설정을 변경함
CREATE DATABASE cdbdev
  USER SYS IDENTIFIED BY <PASSWORD>
  USER SYSTEM IDENTIFIED BY <PASSWORD>
  LOGFILE
    GROUP 1 ('/u01/app/oracle/oradata/CDBDEV/redo01a.log',
             '/u01/app/oracle/oradata/CDBDEV/redo01b.log') SIZE 200M,
    GROUP 2 ('/u01/app/oracle/oradata/CDBDEV/redo02a.log',
             '/u01/app/oracle/oradata/CDBDEV/redo02b.log') SIZE 200M
  CHARACTER SET AL32UTF8
  NATIONAL CHARACTER SET AL16UTF16
  EXTENT MANAGEMENT LOCAL
  DATAFILE '/u01/app/oracle/oradata/CDBDEV/system01.dbf' SIZE 320M
  SYSAUX DATAFILE '/u01/app/oracle/oradata/CDBDEV/sysaux01.dbf' SIZE 380M
  DEFAULT TEMPORARY TABLESPACE temp_ts2
    TEMPFILE '/u01/app/oracle/oradata/CDBDEV/temp01.dbf' SIZE 30M
  UNDO TABLESPACE undotbs1
    DATAFILE '/u01/app/oracle/oradata/CDBDEV/undotbs01.dbf' SIZE 220M
  ENABLE PLUGGABLE DATABASE
  SEED FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDBDEV',
                            '/u01/app/oracle/oradata/CDBDEV/seed');

결과 해석:

진행은 alert_CDBDEV.log를 tail -f로 보고, 마지막에 Completed: create database 줄이 나와야 성공임

#3단계: 데이터 딕셔너리 구성

SQL*Plus (SYSDBA)객체 또는 설정을 변경함
@?/rdbms/admin/catcdb.sql

결과 해석:

실습에서는 실행 전에 로그 디렉터리(/home/oracle/logs)를 만들고 PATH에 $ORACLE_HOME/perl/bin을 추가하라고 했고, 입력 프롬프트로 로그 디렉터리, 로그 파일명, SYS 비밀번호, SYSTEM 비밀번호, 임시 테이블스페이스 이름을 받았음
30분~1시간이 걸릴 수 있어 로그 디렉터리를 지정해 두라고 안내함

#결과 확인

SQL*Plus (SYSDBA)조회만 함
SELECT name, cdb, open_mode FROM v$database;
SELECT tablespace_name, extent_management, segment_space_management, allocation_type FROM dba_tablespaces;
SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET';
SELECT group#, member FROM v$logfile ORDER BY group#, member;
SELECT con_id, name FROM v$datafile ORDER BY con_id, name;
SELECT name, open_mode FROM v$pdbs;
SELECT comp_id, comp_name, version, status FROM dba_registry ORDER BY comp_id;
SELECT owner, object_type, COUNT(*) FROM dba_objects WHERE status = 'INVALID' GROUP BY owner, object_type;

결과 해석:

해석: CDB가 YES면 ENABLE PLUGGABLE DATABASE가 반영된 것임
DBA_REGISTRY의 모든 구성 요소가 VALID여야 정상이고 RAC의 OPTION OFF는 단일 인스턴스라 쓰지 않는 것임
무효 객체 조회에 SYS 소유 객체가 많이 나오면 3단계가 중간에 깨진 것임
시드는 READ ONLY면 정상임
CON_ID 1의 파일은 CDBDEV 아래, CON_ID 2의 파일은 CDBDEV/seed 아래에 있고 파일명은 같고 경로만 달라야 변환 규칙이 적용된 것임

#이후 설정: 아카이브 모드

SQL*Plus (SYSDBA)인스턴스 또는 서비스 중단이 필요함
archive log list
shutdown immediate
startup mount
alter database archivelog;
alter database open;

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

#PDB 생성과 파일 위치

SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
-- 방법 1: CREATE_FILE_DEST
CREATE PLUGGABLE DATABASE ppdb
  ADMIN USER pdbadm IDENTIFIED BY <PASSWORD>
  CREATE_FILE_DEST='/u01/app/oracle/oradata/CDBDEV/ppdb';
alter pluggable database ppdb open;
alter pluggable database ppdb save state;

-- 방법 2: FILE_NAME_CONVERT
CREATE PLUGGABLE DATABASE pdbconv
  ADMIN USER pdbadm IDENTIFIED BY <PASSWORD>
  FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/CDBDEV/seed',
                       '/u01/app/oracle/oradata/CDBDEV_CONV');

-- 방법 3: OMF (파라미터로 목적지 지정 후)
ALTER SYSTEM SET db_create_file_dest = '/u01/app/oracle/oradata/CDBDEV_OMF' SCOPE=MEMORY;
CREATE PLUGGABLE DATABASE pdbomf ADMIN USER pdbadm IDENTIFIED BY <PASSWORD>;

-- 방법 4: PDB_FILE_NAME_CONVERT (OMF를 먼저 꺼야 함)
ALTER SYSTEM SET db_create_file_dest = '' SCOPE=MEMORY;
ALTER SYSTEM SET pdb_file_name_convert =
  '/u01/app/oracle/oradata/CDBDEV/seed','/u01/app/oracle/oradata/CDBDEV_PARAM' SCOPE=MEMORY;
CREATE PLUGGABLE DATABASE pdbparam ADMIN USER pdbadm IDENTIFIED BY <PASSWORD>;

결과 해석:

각 방법의 대상 디렉터리는 미리 만들어 둠(실습의 mkdir -p)

#PDB 삭제

SQL*Plus (SYSDBA, CDB$ROOT)데이터 또는 파일을 삭제함, 되돌릴 수 없음
alter pluggable database ppdb close immediate;
drop pluggable database ppdb including datafiles;

결과 해석:

CLOSE를 빼면 ORA-65025, INCLUDING DATAFILES를 빼면 딕셔너리에서만 지워지고 파일은 디스크에 남는다는 것이 실습 기록임

#OMF 사용 (참고)

SQL*Plus (SYSDBA)데이터 또는 파일을 삭제함, 되돌릴 수 없음
ALTER SYSTEM SET db_create_file_dest = '/u01/app/oracle/oradata/CDBDEV_OMF';
CREATE TABLESPACE demo_omf_ts;   -- DATAFILE 절 없이 생성
DROP TABLESPACE demo_omf_ts INCLUDING CONTENTS AND DATAFILES;
-- OMF 끄기
alter system set db_create_file_dest='';
-- 리두 로그 OMF
alter system set db_create_online_log_dest_1='/u01/app/oracle/oradata/CDBDEV_REDO1';
alter database add logfile group 4;

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

#CDB 삭제

SQL*Plus (SYSDBA)데이터 또는 파일을 삭제함, 되돌릴 수 없음
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER SYSTEM ENABLE RESTRICTED SESSION;
DROP DATABASE;
셸 (oracle, root)데이터 또는 파일을 삭제함, 되돌릴 수 없음
rm -f $ORACLE_HOME/dbs/initCDBDEV.ora $ORACLE_HOME/dbs/spfileCDBDEV.ora
sed -i '/^CDBDEV:/d' /etc/oratab
export ORACLE_SID=orcl

결과 해석:

DROP DATABASE는 데이터 파일, 리두 로그, 컨트롤 파일을 한 번에 지우고 인스턴스까지 내리지만 파라미터 파일, 비밀번호 파일(orapwCDBDEV), /etc/oratab 항목은 남김
그래서 위 두 번째 블록이 필요함
마지막 ORACLE_SID 되돌리기를 빠뜨리면 다음 실습에서 엉뚱한 인스턴스에 접속함

#구문과 옵션 설명

구문 의미 바꿀 입력값
STARTUP NOMOUNT PFILE= 파라미터 파일로 인스턴스만 기동 pfile 경로
@?/rdbms/admin/catcdb.sql CDB 딕셔너리 일괄 구성
실습 기록: 수 KB의 껍데기이고 실제 작업은 catalog.sql, catproc.sql이 함
프롬프트 입력값
ALTER SYSTEM SET ... SCOPE=MEMORY 현재 인스턴스에만 적용
재기동 시 사라짐
ALTER SYSTEM ENABLE RESTRICTED SESSION 제한 모드 전환 DROP DATABASE 전
SELECT ... FROM v$pdbs PDB 목록과 상태

#사용 조건과 주의사항

이 단계 구성은 실습의 학습 환경임
문자 집합, 블록 크기, 테이블스페이스 구조는 생성 뒤 바꾸기 어려운 값이므로 생성 전에 결정해야 함

실습의 PDB$SEED 복제 예시는 생성 대상과 OPEN 대상이 달라 전체 절차 확인 불가

실습에서는 ALTER SYSTEM SET db_create_file_dest를 SCOPE=MEMORY로 쓴 곳과 쓰지 않은 곳이 있어 영속 여부를 확인하지 못했음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

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

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