2026년 10월 14일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-65050 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-65050 Common users, roles, or profiles can only be created in root 는?
ORA-65050 에러는 Oracle Multitenant 환경(12c 이상)에서 공통 사용자(Common User), 공통 롤(Common Role), 또는 공통 프로파일(Common Profile)을 루트 컨테이너(CDB$ROOT)가 아닌 PDB(Pluggable Database) 세션에서 생성하려 할 때 발생합니다. Oracle Multitenant 아키텍처에서 공통 객체는 반드시 CDB 전체에 걸쳐 적용되어야 하므로, 루트 컨테이너에서만 생성이 허용됩니다. 이 에러는 주로 기존 Non-CDB 환경에서 CDB 환경으로 마이그레이션한 직후나 DBA가 현재 접속된 컨테이너를 확인하지 않고 DDL을 실행할 때 빈번하게 발생합니다.
주요 발생 원인
1. 현재 세션이 PDB에 연결된 상태에서 공통 사용자(C## 접두어) 생성 시도
Oracle Multitenant 환경에서 공통 사용자는 이름이 반드시 C##으로 시작해야 하며, CDB$ROOT 컨테이너에 연결된 상태에서만 생성 가능합니다. DBA가 PDB에 접속한 채로 CREATE USER C##username ... 구문을 실행하면 이 에러가 즉시 발생합니다. 특히 여러 PDB를 동시에 관리하는 환경에서는 현재 컨테이너를 혼동하기 쉬워 실수가 잦습니다.
2. 공통 롤(Common Role)을 PDB 세션에서 생성하려는 경우
공통 롤 역시 CDB 전체에 적용되는 객체이므로 루트 컨테이너에서만 생성해야 합니다. PDB 내에서 로컬 롤을 만들 때는 C## 접두어 없이 생성해야 하며, 공통 롤과 로컬 롤의 구분을 명확히 이해하지 못한 상태에서 DDL을 실행하면 ORA-65050이 발생합니다. 자동화 스크립트나 배포 파이프라인에서 컨테이너 전환 로직이 누락된 경우 이 상황이 자주 발생합니다.
3. 공통 프로파일(Common Profile)을 PDB에서 생성하려는 시도
패스워드 정책이나 자원 제한 등을 정의하는 프로파일도 공통 프로파일로 만들려면 루트 컨테이너에서 생성해야 합니다. 보안 정책 표준화를 위해 CDB 전체에 동일한 프로파일을 적용하려는 의도로 DDL을 작성했더라도, PDB에 접속된 상태라면 ORA-65050이 발생합니다. 이 경우 역시 현재 컨테이너를 확인하지 않는 습관이 주된 원인입니다.
해결 방법
원인 1 해결: 현재 컨테이너 확인 후 루트로 전환하여 공통 사용자 생성
먼저 현재 접속된 컨테이너를 확인합니다.
-- 현재 컨테이너 확인
SHOW CON_NAME;
-- 또는 V$SESSION 뷰로 확인
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS current_container FROM DUAL;
CDB$ROOT가 아닌 PDB에 접속되어 있다면, 루트로 전환한 뒤 공통 사용자를 생성합니다.
-- CDB$ROOT로 전환 (SYS 또는 SYSDBA 권한 필요)
ALTER SESSION SET CONTAINER = CDB$ROOT;
-- 공통 사용자 생성 (C## 접두어 필수)
CREATE USER C##app_admin
IDENTIFIED BY "SecurePass123!"
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
CONTAINER = ALL;
-- 공통 사용자에게 권한 부여
GRANT CREATE SESSION TO C##app_admin CONTAINER = ALL;
GRANT CREATE TABLE TO C##app_admin CONTAINER = ALL;
원인 2 해결: 공통 롤 생성은 반드시 루트에서, 로컬 롤은 해당 PDB에서
-- CDB$ROOT에서 공통 롤 생성
ALTER SESSION SET CONTAINER = CDB$ROOT;
CREATE ROLE C##common_developer_role CONTAINER = ALL;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE PROCEDURE
TO C##common_developer_role CONTAINER = ALL;
-- 공통 롤을 공통 사용자에게 부여
GRANT C##common_developer_role TO C##app_admin CONTAINER = ALL;
-- 반면, 특정 PDB에서만 사용할 로컬 롤은 해당 PDB로 전환 후 생성
ALTER SESSION SET CONTAINER = ORCLPDB;
-- 로컬 롤 생성 (C## 접두어 없음)
CREATE ROLE local_report_role;
GRANT SELECT ANY TABLE TO local_report_role;
원인 3 해결: 공통 프로파일 생성 시 루트 컨테이너에서 실행
-- CDB$ROOT로 전환
ALTER SESSION SET CONTAINER = CDB$ROOT;
-- 공통 프로파일 생성
CREATE PROFILE C##secure_profile LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 90
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 10
PASSWORD_LOCK_TIME 1/24
PASSWORD_GRACE_TIME 7
SESSIONS_PER_USER 10
CONTAINER = ALL;
-- 공통 사용자에게 프로파일 적용
ALTER USER C##app_admin PROFILE C##secure_profile CONTAINER = ALL;
-- 생성된 공통 프로파일 확인
SELECT PROFILE, RESOURCE_NAME, LIMIT, COMMON
FROM CDB_PROFILES
WHERE PROFILE LIKE 'C##%'
ORDER BY PROFILE, RESOURCE_NAME;
추가: 현재 CDB 환경 전반 점검 쿼리
-- CDB 여부 및 현재 컨테이너 종합 확인
SELECT NAME,
CDB,
CON_ID,
SYS_CONTEXT('USERENV', 'CON_NAME') AS current_con,
SYS_CONTEXT('USERENV', 'CON_ID') AS current_con_id
FROM V$DATABASE;
-- 모든 PDB 목록 확인
SELECT CON_ID, NAME, OPEN_MODE, RESTRICTED
FROM V$PDBS
ORDER BY CON_ID;
-- 기존 공통 사용자 목록 확인
SELECT USERNAME, COMMON, CON_ID, ACCOUNT_STATUS
FROM CDB_USERS
WHERE COMMON = 'YES'
ORDER BY USERNAME;
예방 방법
1. DDL 실행 전 컨테이너 확인을 표준 절차로 제도화
모든 DBA 작업 매뉴얼과 배포 스크립트의 첫 줄에 반드시 현재 컨테이너를 출력하고 확인하는 구문을 포함시킵니다. CI/CD 파이프라인이나 자동화 스크립트에서는 컨테이너 전환 전후로 검증 로직을 넣어 의도하지 않은 컨테이너에서 DDL이 실행되지 않도록 제어합니다.
-- 모든 배포 스크립트 상단에 포함 권장
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
-- 컨테이너 확인 후 조건에 맞지 않으면 스크립트 중단
DECLARE
v_con_name VARCHAR2(100);
BEGIN
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') INTO v_con_name FROM DUAL;
IF v_con_name != 'CDB$ROOT' THEN
RAISE_APPLICATION_ERROR(-20001,
'ERROR: 현재 컨테이너가 CDB$ROOT가 아닙니다. 현재: ' || v_con_name);
END IF;
END;
/
2. 공통 객체와 로컬 객체 명명 규칙(Naming Convention) 문서화 및 코드 리뷰 적용
C## 접두어 규칙을 팀 전체가 이해하고 준수할 수 있도록 네이밍 컨벤션 문서를 작성하고, 코드 리뷰 체크리스트에 “공통 객체인 경우 C## 접두어 포함 여부 및 루트 컨테이너 전환 구문 포함 여부”를 필수 항목으로 추가합니다. 자동화 린트 도구나 스크립트 검증 도구를 활용하여 배포 전 사전 검증을 자동화하면 사람의 실수를 크게 줄일 수 있습니다.
관련 에러
- ORA-65048: Common user 또는 role 이름에
C##접두어가 없을 때 발생하는 에러로, ORA-65050과 함께 Multitenant 환경에서 자주 쌍으로 나타납니다. - ORA-65049: PDB에서 공통 객체를 삭제하려 할 때 발생하며, 생성뿐 아니라 삭제 작업도 루트에서 수행해야 함을 상기시켜 줍니다.
- ORA-65040: PDB에서 허용되지 않는 작업을 수행하려 할 때 발생하는 일반적인 Multitenant 제약 에러입니다.
- ORA-01017: 잘못된 컨테이너에 접속을 시도할 때 인증 실패와 함께 나타날 수 있는 에러로, 컨테이너 전환 실수와 연관되기도 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.