ORA-06552
: PL/SQL: Compilation unit analysis terminatedORA-06553
: PLS-553: 알 수 없는 문자 집합 이름입니다중복 조회 쿼리
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
결과(정상)
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
: 큐 메시지를 모니터링하면서 시간을 컨트롤하고 지연되거나 만료된 상태의 메시지 프로세싱을 컨트롤한다
유익한 자료 감사합니다.