Jehna :)

ORA-06552, 06553 문자셋 변경 후 오류 본문

윌리/DB

ORA-06552, 06553 문자셋 변경 후 오류

Jehna 2018. 3. 22. 11:55

"[ORACLE] 문자셋 변경 후 오류 해결 방법"


역시나.. 과감하게 문자셋을 변경했더니.. 오류가 발생했다.

허허허허.. 오라클에 오자도 모르는 나란 인간.. 



  * 오류 메시지

     ORA-06552: PL/SQL: Compilation unit analysis terminated

     ORA-06553: PLS-553: character set name is not recognized

  * 원인

    문자셋이 중복되어 발생

  * 해결 방법

    문자셋을 제대로 변경해주면 된다..




1. 문자셋 중복 확인 

    - 솔직히 아래 쿼리를 이해하고 실행한건 아니다.. 이해하려고 했으나 너무 어렵다능 T^T

 

 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);



    - 정상적인 결과 값은 아래와 같다. 만약 아래와 다르게 여러 문자셋이 뒤죽박죽 나왔다면 문자셋이 꼬인거당..


  CHARACTERSET TYPES_USED_IN

 ---------------------------------------- -------------

  AL16UTF16 NVARCHAR2

  AL16UTF16  NCHAR

  AL16UTF16  NCLOB

  KO16MSWIN949  VARCHAR2

  KO16MSWIN949 CHAR

  KO16MSWIN949  CLOB



 문자셋 변경 전 주의사항 

   - parallel_server가 true일 경우, false로 변경해야 한다.

   - parallel_server=true는 multi-instance database(OPS)환경에서 데이터베이스를 구동시키기위해 설정한 것이므로 

     false로 변경한 후, 문자셋을 설정해야 오류가 발생하지 않는다.



   SQL> show parameter parallel_server         //확인 방법                                                                                         


   NAME          TYPE    VALUE

  ------------------------------------ ----------- ------------------------------

   parallel_server              boolean    FALSE

   parallel_server_instances      integer    1



참고) parallel_server 파라미터값의 의미

        - 데이터베이스를 OPS환경에서 구동시키기 위한 parameter

        - single-instance database의 경우, false값을 설정

        - multi-instance database(OPS)의 경우, true값이 설정


2. 문자셋 변경하기

   - // 뒤에 설명을 달아두어 좀 지저분하지만 나중에도 알아보기 위해 설명을 달아놨다능..



   SQL> SHUTDOWN IMMEDIATE;   // 접속중인 세션이나 진행 중인 트랜잭션 모두 강제 종료

   Database closed.

   Database dismounted.

   ORACLE instance shut down.




   SQL> STARTUP MOUNT;    // 마운트 단계까지 오라클 시작

   Total System Global Area  536870912 bytes

   Fixed Size     2097696 bytes

   Variable Size   230690272 bytes

   Database Buffers   297795584 bytes

   Redo Buffers     6287360 bytes

   Database mounted.




   SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;  // 세션 제한 모드 활성화 (문자셋 변경 중 오류를 막기 위해)

   System altered.




   SQL> ALTER SYSTEM SET AQ_TM_PROCESSES = 0;   // 문자셋 변경 중 오류를 막기 위해 QueueMonitorCoordinator 비활성화 (자세한 내용은 아래참고)

   System altered.




   SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;   // job queue안의 job을 수행하지 않도록 설정 (문자셋 변경 중 오류를 막기 위해)

   System altered.



   SQL> ALTER DATABASE OPEN;     // 데이터 베이스 오픈

   System altered.




   SQL> col value new_value charset     // SELECT 쿼리 실행 시 결과값과 컬럼명을 같이 보여주라는 의미

   SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';   // NLS_CHARACTERSET 의 문자셋 확인

   VALUE

   --------------------------------------------------------------------------------

   KO16MSWIN949




   SQL> col value new_value ncharset

   SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_NCHAR_CHARACTERSET'; 

    //NLS_NCHAR_CHARACTERSET 확인

   VALUE

   --------------------------------------------------------------------------------

   AL16UTF16




   SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE & CHARSET;

   old   1: ALTER DATABASE CHARACTER SET INTERNAL_USE & CHARSET

   new   1: ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949


   Database altered.




   SQL> ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE & NCHARSET; 

   //문자셋 변경시, 데이터 손상 방지를 위한 검사를 건너뛰고 변경(INTERNAL_USE가 검사를 건너뛰겠다는 의미)

   old   1: ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE & NCHARSET

   new   1: ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16


   Database altered.

   



   SQL> SHUTDOWN IMMEDIATE; // 종료

   Database closed.

   Database dismounted.

   ORACLE instance shut down.




   SQL> STARTUP;  // 시작

   ORACLE instance started.


   Total System Global Area  536870912 bytes

   Fixed Size     2097696 bytes

   Variable Size   230690272 bytes

   Database Buffers   297795584 bytes

   Redo Buffers     6287360 bytes

   Database mounted.

   Database opened



   SQL> SHUTDOWN IMMEDIATE; // 종료

   Database closed.

   Database dismounted.

   ORACLE instance shut down.




   SQL> STARTUP;  // 시작

   ORACLE instance started.


   Total System Global Area  536870912 bytes

   Fixed Size     2097696 bytes

   Variable Size   230690272 bytes

   Database Buffers   297795584 bytes

   Redo Buffers     6287360 bytes

   Database mounted.

   Database opened

   

   


참고) aq_tm_processes


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

   -  오라클에서는 aq_tmp_processes를 0으로 설정하지 않는 것을 강력하게 권장하고 있다,

      0으로 설정할 경우, QueueMonitorCoordinator가 비활성화 되면서 오라클 스트림 사용 시 데이터베이스의 기준이 없어 

      심각한 문제가 발생할 수 있다고 한다. 




혹시나 나같이 헤매는 분들을 위해 최대한 자세히 남기려고 했지만.. 어렵다 ㅠㅠ 정말 너무 어렵다.

대부분 oracle사이트에서 찾은 것들이나 영어능력이 부족한 나이기에.. 혹시나 내용이 이상할 경우 oracle사이트를 찾아보시길 바란다..