Oracle ORA-01188 오류 원인과 해결 방법 완벽 가이드

ORA-01188
2026년 07월 09일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-01188 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-01188 Character set mismatch in block header and file header 는?

ORA-01188 에러는 Oracle 데이터베이스의 데이터 파일(datafile) 블록 헤더에 기록된 문자 집합(character set) 정보와 파일 헤더(file header)에 기록된 문자 집합 정보가 일치하지 않을 때 발생하는 에러입니다. 일반적으로 다른 캐릭터셋을 사용하는 데이터베이스로부터 데이터 파일을 복사하거나, 잘못된 방법으로 데이터베이스를 마이그레이션하는 과정에서 주로 발생합니다. 이 에러는 데이터 무결성과 직결되는 심각한 문제로, 방치할 경우 데이터 손상(data corruption)으로 이어질 수 있으므로 즉각적인 조치가 필요합니다.


주요 발생 원인

1. 서로 다른 캐릭터셋의 데이터베이스 간 데이터 파일 이동

가장 빈번한 원인은 캐릭터셋이 다른 두 Oracle 데이터베이스 사이에서 데이터 파일을 그대로 복사하거나 이동하는 경우입니다. 예를 들어, AL32UTF8 캐릭터셋을 사용하는 데이터베이스의 데이터 파일을 KO16MSWIN949 캐릭터셋 데이터베이스에 붙여넣는 경우, 파일 헤더와 블록 헤더 간의 캐릭터셋 메타데이터가 불일치하게 됩니다. 이는 데이터베이스가 파일을 올바르게 인식하지 못하게 만들며, 마운트 또는 오픈 단계에서 에러를 유발합니다.

2. 불완전하거나 잘못된 캐릭터셋 변환 작업

ALTER DATABASE CHARACTER SET 또는 ALTER DATABASE NATIONAL CHARACTER SET 명령을 사용하여 캐릭터셋을 변경하는 도중 작업이 비정상적으로 중단되거나, Oracle CSSCAN/DMU(Database Migration Assistant for Unicode) 도구 없이 강제로 캐릭터셋을 변경하는 경우 이 에러가 발생할 수 있습니다. 캐릭터셋 변환은 모든 데이터 파일의 헤더 정보를 일관되게 업데이트해야 하는데, 중간에 작업이 실패하면 일부 파일만 업데이트되어 불일치 상태가 됩니다. 이런 상황은 데이터베이스 재기동 시 ORA-01188을 유발하는 대표적인 시나리오입니다.

3. 잘못된 백업 복구(RMAN Restore/Recovery) 또는 수동 파일 조작

RMAN을 통한 복구 과정에서 서로 다른 캐릭터셋 환경의 백업 셋을 혼용하거나, 운영 체제 레벨에서 데이터 파일을 직접 편집한 경우에도 이 에러가 발생합니다. 특히 수동으로 데이터 파일의 헤더 블록을 수정하는 일부 비공식적인 복구 시도는 블록 헤더와 파일 헤더 간의 캐릭터셋 정보를 불일치 상태로 만들 수 있습니다. Oracle Support의 공식 가이드라인 없이 이루어지는 로우 레벨(raw level) 파일 조작은 반드시 지양해야 합니다.


해결 방법

사전 진단: 현재 데이터베이스 캐릭터셋 확인

먼저 현재 데이터베이스의 캐릭터셋 정보를 확인합니다.

-- 데이터베이스 캐릭터셋 및 내셔널 캐릭터셋 확인
SELECT NAME, VALUE$
FROM SYS.PROPS$
WHERE NAME IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

-- 또는 NLS_DATABASE_PARAMETERS 뷰를 활용
SELECT PARAMETER, VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

원인 1 해결: 데이터 파일의 캐릭터셋 정보 확인 및 재정렬

데이터 파일의 헤더 정보를 덤프하여 문제를 구체적으로 파악합니다.

-- 데이터 파일 헤더 덤프 (파일 번호 1번 예시)
ALTER SESSION SET EVENTS 'immediate trace name file_hdrs level 10';

-- 특정 데이터 파일 헤더 정보 확인
SELECT FILE#, NAME, STATUS, CHECKPOINT_CHANGE#
FROM V$DATAFILE
WHERE STATUS != 'OFFLINE';

-- 파일별 블록 크기 및 생성 정보 확인
SELECT FILE#, BLOCK_SIZE, CREATION_TIME, TS#
FROM V$DATAFILE;

-- 문제가 있는 파일을 오프라인 처리 후 복구 시도
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/problematic_file.dbf' OFFLINE;

-- RMAN을 통한 해당 파일 복구
-- RMAN 세션에서 실행:
-- RESTORE DATAFILE '/u01/oradata/ORCL/problematic_file.dbf';
-- RECOVER DATAFILE '/u01/oradata/ORCL/problematic_file.dbf';

원인 2 해결: 캐릭터셋 변환 실패 후 복구

캐릭터셋 변환이 중단된 경우 Oracle의 공식 절차를 따라야 합니다.

-- 현재 캐릭터셋 상태 확인
SELECT * FROM V$NLS_PARAMETERS
WHERE PARAMETER LIKE '%CHARACTERSET%';

-- PROPS$ 테이블에서 직접 확인 (DBA 권한 필요)
SELECT NAME, VALUE$, COMMENT$
FROM SYS.PROPS$
WHERE NAME LIKE '%CHARACTERSET%';

-- 캐릭터셋 정보가 불일치하는 경우, RESTRICTED 모드로 전환 후 재설정
-- ※ 이 작업은 Oracle Support와 반드시 협의 후 진행
STARTUP RESTRICT;

-- 내부 캐릭터셋 업데이트 (Oracle Support 가이드라인에 따라 실행)
-- ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

-- 정상 모드로 재기동
SHUTDOWN IMMEDIATE;
STARTUP;

-- 변경 후 확인
SELECT PARAMETER, VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

원인 3 해결: RMAN을 이용한 정상 백업에서의 복구

-- RMAN에서 백업 목록 확인
-- RMAN> LIST BACKUP OF DATABASE;

-- 특정 시점으로의 복구 (캐릭터셋 변경 이전 시점)
-- RMAN> RUN {
--   SET UNTIL TIME "TO_DATE('2024-01-15 09:00:00','YYYY-MM-DD HH24:MI:SS')";
--   RESTORE DATABASE;
--   RECOVER DATABASE;
-- }

-- 복구 후 데이터 파일 상태 확인
SELECT FILE#, STATUS, CHECKPOINT_CHANGE#, LAST_CHANGE#
FROM V$DATAFILE_HEADER
ORDER BY FILE#;

-- 오프라인된 파일이 있다면 온라인으로 전환
ALTER DATABASE DATAFILE 5 ONLINE;

-- 데이터베이스 오픈
ALTER DATABASE OPEN RESETLOGS;

진단용 추가 쿼리

-- 데이터 파일 헤더 상태 종합 조회
SELECT 
    DH.FILE#,
    DH.STATUS,
    DH.CHECKPOINT_CHANGE#,
    DH.RESETLOGS_CHANGE#,
    DF.NAME AS FILE_PATH,
    DF.BYTES / 1024 / 1024 AS SIZE_MB
FROM V$DATAFILE_HEADER DH
JOIN V$DATAFILE DF ON DH.FILE# = DF.FILE#
ORDER BY DH.FILE#;

-- Alert 로그에서 ORA-01188 관련 에러 메시지 위치 파악 후
-- NLS 관련 파라미터 전체 조회
SELECT * FROM NLS_DATABASE_PARAMETERS ORDER BY PARAMETER;
SELECT * FROM NLS_INSTANCE_PARAMETERS ORDER BY PARAMETER;
SELECT * FROM NLS_SESSION_PARAMETERS ORDER BY PARAMETER;

예방 방법

1. 데이터 파일 이동 및 마이그레이션 시 캐릭터셋 사전 검증 프로세스 수립

데이터 파일을 다른 데이터베이스 환경으로 이동하기 전에 반드시 소스와 타깃 데이터베이스의 캐릭터셋 정보를 사전에 비교하는 체크리스트를 마련하고, 검증 스크립트를 자동화하는 것이 중요합니다. 또한 Oracle Data Pump(expdp/impdp)나 RMAN Transportable Tablespace 기능을 활용하면 캐릭터셋 관련 메타데이터를 안전하게 처리할 수 있으므로, 단순 파일 복사 방식의 마이그레이션은 지양해야 합니다.

-- 마이그레이션 전 소스/타겟 캐릭터셋 비교 스크립트
-- 소스 DB에서 실행
SELECT 'SOURCE_DB' AS DB_TYPE, PARAMETER, VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET')
UNION ALL
-- 타겟 DB에서도 동일 쿼리 실행 후 결과 비교
SELECT 'CHECK_INSTANCE' AS DB_TYPE, PARAMETER, VALUE
FROM NLS_INSTANCE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

2. 정기적인 데이터 파일 헤더 무결성 점검 및 백업 정책 강화

주기적으로 RMAN의 VALIDATE DATABASE 명령을 실행하여 모든 데이터 파일의 무결성을 검증하고, 캐릭터셋 변경 작업 전후로 반드시 전체 백업(full backup)을 수행하는 정책을 수립해야 합니다. 특히 캐릭터셋 마이그레이션 작업은 Oracle DMU(Database Migration Assistant for Unicode) 도구를 사용하고, 작업 전 공식 Oracle MOS(My Oracle Support) 노트를 철저히 검토하는 습관을 들여야 합니다.


관련 에러

  • ORA-01190: 제어 파일 또는 데이터 파일이 마지막 RESETLOGS 이전 상태임을 나타내는 에러로, 불완전한 복구 과정에서 ORA-01188과 함께 발생하는 경우가 많습니다.
  • ORA-01122: 데이터 파일 헤더 검증 실패 에러로, ORA-01188 발생 시 연쇄적으로 나타나는 대표적인 관련 에러입니다.
  • ORA-01110: 문제가 발생한 특정 데이터 파일을 지목하는 에러로, ORA-01188과 항상 세트로 출력되어 문제 파일을 식별하는 데 도움을 줍니다.
  • ORA-00704 / ORA-39700: 데이터베이스 업그레이드 또는 캐릭터셋 변환 작업 중 발생하는 에러로, 잘못된 캐릭터셋 마이그레이션 절차와 관련이 있습니다.
  • ORA-12714: 잘못된 내셔널 캐릭터셋 지정 에러로, NCHAR/NVARCHAR2 타입 컬럼을 다루는 환경에서 ORA-01188과 연관될 수 있습니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기