수동 CDB 생성과 PDB 파일 배치
NOMOUNT부터 CREATE DATABASE와 catcdb.sql까지의 CDB 생성, PDB 파일 배치 우선순위와 DB 삭제
#핵심 요약
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 FilesDB_CREATE_FILE_DEST로 목적지만 지정 |
DB_CREATE_ONLINE_LOG_DEST_1 |
리두 로그 파일 OMF 목적지 |
#필수 명령어 또는 SQL
#1단계: 파라미터 파일과 NOMOUNT
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 이름은 대소문자를 구분하므로 서버의 실제 값 그대로 씀
STARTUP NOMOUNT PFILE=$ORACLE_HOME/dbs/initCDBDEV.ora
SELECT status, instance_name, database_status FROM v$instance;결과 해석: 개별 실행 출력은 기재 없음
#2단계: CREATE DATABASE
mkdir -p /u01/app/oracle/oradata/CDBDEV/seed결과 해석:
SEED FILE_NAME_CONVERT의 대상 디렉터리는 오라클이 자동으로 만들지 않음
빠뜨리면 중간까지 만들고 실패함
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단계: 데이터 딕셔너리 구성
@?/rdbms/admin/catcdb.sql결과 해석:
실습에서는 실행 전에 로그 디렉터리(/home/oracle/logs)를 만들고 PATH에 $ORACLE_HOME/perl/bin을 추가하라고 했고, 입력 프롬프트로 로그 디렉터리, 로그 파일명, SYS 비밀번호, SYSTEM 비밀번호, 임시 테이블스페이스 이름을 받았음
30분~1시간이 걸릴 수 있어 로그 디렉터리를 지정해 두라고 안내함
#결과 확인
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 아래에 있고 파일명은 같고 경로만 달라야 변환 규칙이 적용된 것임
#이후 설정: 아카이브 모드
archive log list
shutdown immediate
startup mount
alter database archivelog;
alter database open;결과 해석: 개별 실행 출력은 기재 없음
#PDB 생성과 파일 위치
-- 방법 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 삭제
alter pluggable database ppdb close immediate;
drop pluggable database ppdb including datafiles;결과 해석:
CLOSE를 빼면 ORA-65025, INCLUDING DATAFILES를 빼면 딕셔너리에서만 지워지고 파일은 디스크에 남는다는 것이 실습 기록임
#OMF 사용 (참고)
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 삭제
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER SYSTEM ENABLE RESTRICTED SESSION;
DROP DATABASE;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로 쓴 곳과 쓰지 않은 곳이 있어 영속 여부를 확인하지 못했음