1. 설치 환경 정보
| OS | Microsoft Windows Server 2022 (64bit) |
| DB 버전 | Oracle Database 12c 12.2.0.1.0 (Standard Edition) |
| DB Bundle Patch |
Windows DB Bundle Patch 12.2.0.1.180717 (Patch ID: 27937914) --> 오라클에 비밀번호 문의 후 다운 |
| OPatch | 12.2.0.1.14 |
| ORACLE_HOME | C:\app\oracle\product\12.2.0\dbhome_1 |
| Character Set | UTF8 / AL16UTF16 |
| NLS | KOREAN_KOREA |

2. 증상
(1) DBCA로 데이터베이스를 생성하는 도중, 단계 14/15 (진행률 약 28%) 에서 아래 오류 뜸.
"무시"를 눌러 진행은 가능했으나, 여러 진행률(28%, 29%, 33% 등)에서 연쇄적으로 동일 오류가 발생했고,
(2) DB 생성 후 다수의 SYS 패키지가 INVALID 상태가 됨
ORA-04063: package body "SYS.DBMS_AQADM_SYS"에 오류가 있습니다
ORA-06512: 11행
ORA-06512: "SYS.DBMS_AQADM", 410행
ORA-06508: PL/SQL: 호출 중인 프로그램 단위를 찾을 수 없습니다

3. 근본 원인 분석
3-1. INVALID 오브젝트 확인
SELECT owner, object_type, object_name, status
FROM dba_objects
WHERE status = 'INVALID'
AND owner IN ('SYS', 'SYSTEM')
ORDER BY object_type, object_name;
| SYS | PACKAGE BODY | DBMS_AQADM_SYS | INVALID |
| SYS | PACKAGE BODY | DBMS_PRVTAQIM | INVALID |
3-2. 진짜 원인 - DBCOMPATMAJOR 미정의
INVALID 패키지를 직접 컴파일해보니 아래 에러가 확인됐다.
ALTER PACKAGE SYS.DBMS_PRVTAQIM COMPILE BODY;
SHOW ERRORS PACKAGE BODY SYS.DBMS_PRVTAQIM
PLS-00302: 'DBCOMPATMAJOR' 구성 요소가 정의되어야 합니다
DBCOMPATMAJOR는 Bundle Patch(180717)가 추가하는 구성 요소로,
base 12.2.0.1 엔진에는 존재하지 않는다.
이 정의가 DB에 반영되지 않아 AQ 관련 패키지들이 연쇄적으로 INVALID가 된 것이다.
3-3. datapatch 적용 실패 확인
SELECT patch_id, action, status, action_time
FROM dba_registry_sqlpatch
ORDER BY action_time;
PATCH_ID ACTION STATUS
27937914 APPLY WITH ERRORS ← 패치 SQL 적용 실패
opatch lspatches에서는 패치가 적용된 것으로 나오지만(바이너리 반영),
dba_registry_sqlpatch에서 WITH ERRORS로 나타났다.
즉 패치의 SQL 부분(datapatch)이 DB에 제대로 반영되지 않은 상태였다.
핵심 개념: opatch apply(바이너리 패치)와 datapatch(DB 내부 SQL 반영)는 별개의 작업이다.
lspatches에 보여도 datapatch가 실패하면 DB 내부는 미반영 상태다.
3-4. datapatch 실패의 진짜 이유 - 한글 로케일
datapatch를 수동 실행하니 로그에서 결정적 단서가 나왔다.
Patch 27937914 apply: WITH ERRORS
logfile: ...\27937914_apply_ORCL_20267월 02_18_03_52.log (errors)
Error at line 0: Could not open logfile ...20267월 02...log
로그 파일명에 한글 "월"이 포함되어 datapatch가 로그 파일을 생성/오픈하지 못했다.
한국어 OS 로케일의 날짜 형식이 원인이었다.
캐릭터셋(UTF8/AL32UTF8), NLS_LANG, OPatch 버전은 모두 원인이 아니었음 (테스트로 배제).
4. 후속 조치 (해결)
4-1. OS 날짜 형식 변경
제어판 → 국가 또는 지역 → 형식 탭 → 영어(미국) 으로 변경
(시스템 로캘 변경은 재부팅이 필요하므로, 형식만 변경 + 아래 chcp로 우회)
4-2. 콘솔 코드페이지 영어 전환
chcp 437
set ORACLE_HOME=C:\app\oracle\product\12.2.0\dbhome_1
set ORACLE_SID=orcl
set NLS_LANG=AMERICAN_AMERICA.UTF8
4-3. datapatch 재실행 (SUCCESS 확인)
cd %ORACLE_HOME%\OPatch
datapatch -verbose
Patch 27937914 apply: SUCCESS
logfile: ...27937914_apply_ORCL_2026Jul02_18_10_13.log (no errors)
로그 파일명이 정상(2026Jul02)으로 생성되며 datapatch가 성공했다.
4-4. DBCOMPATMAJOR 정의 파일 직접 실행
datapatch가 SUCCESS여도 일부 패키지 BODY가 여전히 INVALID였다.
DBCOMPATMAJOR가 정의된 패치 파일을 찾아 직접 실행했다.
-- [ CMD 창 ]
findstr /S /I /M /C:"DBCOMPATMAJOR" "C:\app\oracle\product\12.2.0\dbhome_1\OPatch\27937914\*.sql"
→ files\rdbms\admin\dbmsaqds.sql
-- [ CMD 창 ]
sqlplus / as sysdba
@C:\app\oracle\product\12.2.0\dbhome_1\OPatch\27937914\files\rdbms\admin\dbmsaqds.sql
SELECT COUNT(*) FROM dba_source
WHERE name = 'DBMS_REGISTRY'
AND UPPER(text) LIKE '%DBCOMPATMAJOR%';
변경 전: 0
변경 후: 1 ← DBCOMPATMAJOR 정의 반영됨
4-5. 패키지 재컴파일
ALTER PACKAGE SYS.DBMS_PRVTAQIM COMPILE BODY;
ALTER PACKAGE SYS.DBMS_AQADM_SYS COMPILE BODY;
@?/rdbms/admin/utlrp.sql
4-6. 최종 확인
-- AQ 패키지 상태
SELECT object_name, object_type, status FROM dba_objects
WHERE object_name IN ('DBMS_AQADM_SYS','DBMS_PRVTAQIM','DBMS_AQADM_SYSCALLS')
ORDER BY object_name, object_type;
-- 전체 INVALID 확인
SELECT owner, object_name, object_type FROM dba_objects
WHERE status='INVALID' AND owner IN ('SYS','SYSTEM');
-- 컴포넌트 상태
SELECT comp_name, status FROM dba_registry ORDER BY comp_name;
→ AQ 패키지 BODY 모두 VALID 전환, INVALID 오브젝트 정상화 완료.
5. 정리
| 증상 | DBCA 생성 중 "ORA-04063 ORA-06512 ORA-06508 호출중인 프로그램 단위를 찾을 수 없습니다" 오류 메세지 반복 |
| 근본 원인 | 한글 OS 로케일의 날짜 형식 → datapatch 로그 파일 생성 실패 → 패치의 DBCOMPATMAJOR 미반영 → AQ 패키지 INVALID |
| 해결 | ① OS 형식 영어화 + chcp 437 ② datapatch 재실행 ③ dbmsaqds.sql 직접 실행 ④ utlrp 재컴파일 |
6. 교훈
- 한국어 로케일 환경에서 datapatch 실행 시, 날짜 형식 영어화 또는 chcp 437이 필요할 수 있다.
- dba_registry_sqlpatch가 SUCCESS로 기록되어도 실제 오브젝트가 미반영일 수 있으므로,
개별 오브젝트 상태를 반드시 검증해야 한다. - opatch apply ≠ datapatch — 바이너리 패치와 DB SQL 반영은 별개 작업이다.