2026년 09월 16일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12712 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12712 new character set must be a superset of old character set 는?
ORA-12712 에러는 Oracle 데이터베이스의 문자 집합(Character Set)을 변경하려 할 때, 새로운 문자 집합이 기존 문자 집합의 상위 집합(Superset) 이 아닌 경우에 발생하는 에러입니다. 즉, 기존 문자 집합에서 표현 가능한 모든 문자를 새로운 문자 집합도 반드시 표현할 수 있어야 하며, 그렇지 않을 경우 Oracle은 데이터 손실 위험을 감지하고 변경을 차단합니다. 이 에러는 주로 ALTER DATABASE CHARACTER SET 명령을 실행할 때 나타나며, 특히 레거시 시스템에서 Unicode(AL32UTF8) 계열로 마이그레이션하는 과정에서 빈번하게 발생합니다.
주요 발생 원인
1. 기존 문자 집합보다 표현 범위가 좁은 문자 집합으로 변경 시도
Oracle 문자 집합 간에는 명확한 상/하위 관계(Superset/Subset)가 존재합니다. 예를 들어 KO16MSWIN949에서 US7ASCII로 변경을 시도하면, 한글 문자를 US7ASCII가 표현할 수 없기 때문에 ORA-12712가 발생합니다. 이 경우 기존 데이터에 포함된 수천 개의 문자가 새 문자 집합으로 표현되지 못해 심각한 데이터 손상으로 이어질 수 있습니다.
2. 문자 집합 간 상위/하위 관계를 확인하지 않고 마이그레이션 시도
현장에서 가장 흔한 실수 중 하나는 문자 집합의 계층 구조를 충분히 이해하지 않은 상태에서 ALTER DATABASE CHARACTER SET 명령을 실행하는 것입니다. Oracle은 내부적으로 문자 집합 간의 상위 집합 여부를 검사하며, 승인되지 않은 변환은 허용하지 않습니다. 특히 WE8ISO8859P1에서 KO16KSC5601로의 변경처럼 서로 다른 언어 그룹 간의 전환은 대부분 이 에러를 유발합니다.
3. Oracle CSSCAN 또는 DMU(Database Migration Assistant for Unicode) 사전 검증 생략
문자 집합 변경 전에는 반드시 기존 데이터가 새로운 문자 집합으로 안전하게 전환될 수 있는지 사전 검증이 필요합니다. CSSCAN 유틸리티나 Oracle DMU 도구를 실행하지 않고 무작정 변경 명령을 실행하면, 시스템이 이를 거부하거나 데이터 손상이 발생할 수 있습니다. 특히 멀티바이트 문자를 포함하는 컬럼이 있는 경우 이 단계를 건너뛰는 것은 매우 위험합니다.
해결 방법
방법 1: 현재 문자 집합 및 상위 집합 여부 확인
먼저 현재 데이터베이스의 문자 집합을 확인하고, 변경하려는 문자 집합이 상위 집합인지 Oracle 문서를 통해 검토합니다.
-- 현재 데이터베이스 문자 집합 확인
SELECT NAME, VALUE$
FROM SYS.PROPS$
WHERE NAME IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
-- 또는 V$NLS_PARAMETERS 뷰 사용
SELECT PARAMETER, VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
방법 2: 올바른 상위 집합으로 변경
아래는 KO16MSWIN949에서 AL32UTF8(UTF-8 기반 Unicode, 대부분의 문자 집합의 상위 집합)로 안전하게 변경하는 예시입니다. 반드시 RESTRICTED 모드에서 실행해야 합니다.
-- Step 1: 데이터베이스를 RESTRICTED 모드로 재시작
SHUTDOWN IMMEDIATE;
STARTUP RESTRICT;
-- Step 2: 문자 집합 변경 (상위 집합으로만 가능)
ALTER DATABASE CHARACTER SET AL32UTF8;
-- Step 3: 변경 확인
SELECT VALUE FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER = 'NLS_CHARACTERSET';
-- Step 4: 정상 모드로 재시작
SHUTDOWN IMMEDIATE;
STARTUP;
방법 3: INTERNAL_USE 옵션 사용 (주의 필요)
Oracle 내부적으로 상위 집합 검사를 우회하는 방법이 있습니다. 단, 이 방법은 Oracle Support의 명시적 승인 하에만 사용해야 하며, 데이터 손상 위험이 매우 높습니다.
-- !! 주의: Oracle Support 지시 없이 절대 사용 금지 !!
-- RESTRICTED 모드에서만 실행 가능
STARTUP RESTRICT;
-- INTERNAL_USE 옵션으로 검사 우회 (비권장)
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
-- 변경 후 반드시 전체 데이터 검증 수행
SELECT COUNT(*) FROM DBA_TABLES;
방법 4: CSSCAN을 통한 사전 검증
-- CSSCAN 실행 (OS 커맨드라인에서 실행)
-- csscan userid=system/password full=y tochar=AL32UTF8 log=csscan_report
-- 스캔 결과 확인 (CSSCAN 실행 후 생성된 테이블에서 조회)
SELECT *
FROM CSMIG.CSMIG$ERRORS
WHERE ROWNUM <= 50;
-- 변환 불가 데이터 확인
SELECT TABLE_NAME, COLUMN_NAME, FAILED_COUNT
FROM CSMIG.CSMIG$COLUMN_DATA
WHERE FAILED_COUNT > 0
ORDER BY FAILED_COUNT DESC;
방법 5: Export/Import를 이용한 마이그레이션
상위 집합으로의 직접 변경이 불가한 경우, 새로운 문자 집합으로 데이터베이스를 새로 생성하고 데이터를 이전하는 방법을 권장합니다.
-- 새 데이터베이스 생성 시 올바른 문자 집합 지정
CREATE DATABASE newdb
...
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16;
-- Data Pump를 이용한 전체 익스포트
-- expdp system/password full=y directory=DATA_PUMP_DIR dumpfile=full_export.dmp logfile=export.log
-- 새 데이터베이스로 임포트
-- impdp system/password full=y directory=DATA_PUMP_DIR dumpfile=full_export.dmp logfile=import.log
예방 방법
1. 데이터베이스 생성 시 AL32UTF8 문자 집합 채택
데이터베이스를 처음 생성할 때부터 AL32UTF8을 문자 집합으로 지정하면, 향후 문자 집합 변경으로 인한 문제를 원천 차단할 수 있습니다. AL32UTF8은 사실상 모든 언어와 문자를 표현할 수 있는 Unicode 기반 문자 집합으로, Oracle이 공식적으로 권장하는 표준입니다. 신규 프로젝트를 시작할 때는 반드시 이 문자 집합을 기본으로 채택하는 것을 조직 내 표준으로 정립해야 합니다.
-- 신규 데이터베이스 생성 시 권장 설정
CREATE DATABASE mydb
USER SYS IDENTIFIED BY sys_password
USER SYSTEM IDENTIFIED BY system_password
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DEFAULT TABLESPACE users
DEFAULT TEMPORARY TABLESPACE temp
UNDO TABLESPACE undotbs1;
2. 문자 집합 변경 전 전수 검증 및 백업 수행
문자 집합 변경은 데이터베이스 전체에 영향을 미치는 중대한 작업이므로, 변경 전에 반드시 전체 콜드 백업(Cold Backup) 또는 RMAN 백업을 수행하고, Oracle DMU(Database Migration Assistant for Unicode) 도구로 전체 데이터를 사전 검증해야 합니다. 이를 통해 변환 불가 데이터를 미리 파악하고 대응 방안을 수립할 수 있으며, 만일의 사태에 대비한 복구 지점도 확보할 수 있습니다.
-- RMAN을 이용한 전체 백업 수행
-- RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
-- 백업 완료 후 검증
SELECT STATUS, COUNT(*)
FROM V$BACKUP
GROUP BY STATUS;
관련 에러
- ORA-12713:
CHAR또는VARCHAR2컬럼에 문자 집합 변환 중 데이터가 잘릴 때 발생하는 에러로, ORA-12712와 함께 문자 집합 마이그레이션 과정에서 자주 나타납니다. - ORA-00904: 문자 집합 변경 후 일부 메타데이터 컬럼명이 깨지는 경우 발생할 수 있으며, 데이터 손상의 2차 증상으로 나타납니다.
- ORA-12714: National Character Set 변경 시 새로운 문자 집합이 상위 집합이 아닐 때 발생하며,
NCHAR,NVARCHAR2,NCLOB타입과 관련이 있습니다. - ORA-12721: 다른 세션이 활성화된 상태에서 문자 집합 변경을 시도할 때 발생하며, RESTRICTED 모드가 아닐 경우 나타납니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.