[Oracle] ORA-06552, ORA-06553 원인 / 해결

HYEOB KIM·2023년 8월 11일
0

Oracle

목록 보기
50/58

에러 메시지

  • ORA-06552 : PL/SQL: Compilation unit analysis terminated
  • ORA-06553 : PLS-553: 알 수 없는 문자 집합 이름입니다

원인

  • 해당 에러는 하나의 데이터 타입에 설정된 CHARACTER SET이 2개 이상일 때 발생하는 에러입니다.
  • 아래의 중복 조회 쿼리를 통해 CHARACTER SET 중복 여부를 확인합니다.

중복 조회 쿼리

SELECT 
DISTINCT(NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET,
	DECODE(TYPE#, 1, 
    	DECODE(CHARSETFORM, 1, 'VARCHAR2', 2, 'NVARCHAR2', 'UNKOWN'), 9,
        DECODE(CHARSETFORM, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'), 96,
        DECODE(CHARSETFORM, 1,   'CHAR', 2, 'NCHAR', 'UNKOWN'), 112, 
        DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')
    ) TYPES_USED_IN 
FROM SYS.COL$ 
WHERE CHARSETFORM IN (1,2) 
AND TYPE# IN (1, 9, 96, 112) 
order by 1;

결과(비정상)

  • 하나의 VARCHAR2 타입에 대해 2개의 CHARACTER SET이 설정된 것을 볼 수 있습니다.
CHARACTERSET                             TYPES_USED_IN
---------------------------------------- -------------
KO16MSWIN949                             VARCHAR2
KO16MSWIN949                             CLOB
KO16MSWIN949                             CHAR
AL16UTF16                                NCHAR
AL16UTF16                                NVARCHAR2
UTF8                                     VARCHAR2
AL16UTF16                                NCLOB

결과(정상)

  • 하나의 데이터 타입에는 1개의 CHARACTER SET만 설정되어 있습니다.
CHARACTERSET                             TYPES_USED_IN
---------------------------------------- -------------
AL16UTF16                                NCHAR
AL16UTF16                                NCLOB
AL16UTF16                                NVARCHAR2
KO16MSWIN949                             CHAR
KO16MSWIN949                             CLOB
KO16MSWIN949                             VARCHAR2

해결 방안

  • 작업 전 관련 기존 파라미터 값 확인
-- parallel server 파라미터 FALSE 확인(parallel server 파라미터의 경우 11g부터 RAC가 도입되면서 deprecate됨)
show parameter parallel_server
NAME  				       TYPE	       VALUE
-------------------------- ----------- -----------------------------------------
parallel_server 		   boolean	   FALSE
parallel_server_instances  integer	   1

show parameter aq_tm_processes

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes                      integer     1


show parameter job_queue_processes

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes                  integer     20

set lines 300 pages 200
col parameter for a30
col value for a30

select * from nls_database_parameters where parameter like '%CHARACTERSET%';

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_CHARACTERSET               KO16MSWIN949
  • 작업 시작
-- DB 재기동
lsnrctl stop LISTENER

shutdown immediate;
startup nomount;
alter database mount;

-- 추후 DB 재기동 시 원래 값으로 되돌아감
alter system enable restricted session;
alter system set aq_tm_processes=0;
alter system set job_queue_processes=0;

alter database open;

-- 캐릭터셋 변경 전 설정된 character set / national character set 확인
col value new_value charset // charset이라는 치환변수의 값을 보여줘
col value new_value ncharset // ncharset이라는 치환변수의 값을 보여줘
select * from nls_database_parameters where parameter like '%CHARACTERSET%';

alter database character set internal_use &CHARSET;
Enter value for charset: <NLS_CHARACTERSET 값>
old   1: alter database national character set internal_use &CHARSET                        
new   1: alter database national character set internal_use KO16MSWIN949  
alter database national character set internal_use &NCHARSET;
Enter value for charset: <NLS_NCHAR_CHARACTERSET 값>
old   1: alter database national character set internal_use &NCHARSET                        
new   1: alter database national character set internal_use AL16UTF16  

-- 2번 재기동
shutdown immediate;
startup;
shutdown immediate;
startup;

-- 캐릭터셋 중복 해소 확인
SELECT 
DISTINCT(NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET,
	DECODE(TYPE#, 1, 
    	DECODE(CHARSETFORM, 1, 'VARCHAR2', 2, 'NVARCHAR2', 'UNKOWN'), 9,
        DECODE(CHARSETFORM, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'), 96,
        DECODE(CHARSETFORM, 1,   'CHAR', 2, 'NCHAR', 'UNKOWN'), 112, 
        DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')
    ) TYPES_USED_IN 
FROM SYS.COL$ 
WHERE CHARSETFORM IN (1,2) 
AND TYPE# IN (1, 9, 96, 112) 
order by 1;

-- 원래 값으로 돌아왔는지 확인
show parameter aq
show parameter job_queue

-- 리스너 시작
lsnrctl start LISTENER

참고

  • update props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET'; 구문을 통해 캐릭터셋의 변경이 있었는지 확인
  • 이러한 캐릭터셋 변경 방법은 DB에 치명적

참고

  • aq_tm_processes : 큐 메시지를 모니터링하면서 시간을 컨트롤하고 지연되거나 만료된 상태의 메시지 프로세싱을 컨트롤한다
profile
Devops Engineer

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

유익한 자료 감사합니다.

답글 달기