728x90
반응형
SMALL
728x90
반응형
LIST
728x90
반응형
SMALL
오라클 설치 후, 데이터 Import까지 하여 잘 사용하고 있었으나, 문자열을 아스키코드로 변환하는 과정에서,
과거 오라클을 설치했을 때와 다른 아스키코드 값이 나와 확인해 보니,
Characterset이 다르게 설정되었다는 것을 알게 되었다.
Characterset을 변경하는 방법 및 변경 과정에서 ORA-12721 에러가 발생하였는데,
이 모든 것들의 해결법을 알아보도록 하자.
이 작업을 하기 전에 데이터 Backup을 받아 놓도록 하자.
(Characterset을 바꾸면 이미 저장되어 있는 한글 데이터는 깨질 수 있다.)

 

■ 쿼리를 통하여 아스키 값 확인

-- 아래 쿼리 실행을 통하여, 과거 설치된 버전과 현재 설치된 버전 아스키 값 확인

select ascii('가나다')

 from dual

왼쪽: 과거 / 오른쪽: 현재

 

■ 아스키 값이 다르게 나오는 경우 먼저 Characterset을 확인

-- 아래 쿼리를 실행

select *

 from sys.props$

where name in ('NLS_NCHAR_CHARACTERSET', 'NLS_CHARACTERSET')

 

-- 실행 결과

-- 이전에 설치했던 Characterset 확인

-- NLS_CHARACTERSET이 다르다.

 

■ Characterset 변경

1. 명령 프롬프트(cmd) 창 실행하여 아래 구문을 차례대로 실행한다.

2. sqlplus / as sysdba

3. update props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET';

4. commit;

5. Characterset을 다시 확인하면, 아래 이미지와 바뀐 것을 볼 수 있다.

6. 아스키 값을 확인했던 쿼리를 다시 실행해 보면 아직 바뀌지 않은 것을 볼 수 있다. 서비스로 들어가서 아래 표시된 부분을 재시작한다.

    (sqlplus에서 shutdown immediate; startup;으로도 가능)

    그러면 아스키 값이 변경된 것을 확인할 수 있다.

7. 이후, 문제는 SQL편집 툴에서 테이블 목록을 열면 아래와 같은 메시지가 발생한다.

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

    ORA-06553: PLS-553: 알 수 없는 문자 집합 이름입니다

8. 아래 쿼리를 실행하여 몇 가지를 확인해 보자.

-- 아래 쿼리를 실행

select distinct

           nls_charset_name(charsetid) characterset,

           decode(type#, 1, decode(charsetform, 1, 'varchar2',

                                                                           2, 'nvarchar2',

                                                                           'unknown'),

                                    9, decode(charsetform, 1, 'varchar',

                                                                            2, 'nchar varying',

                                                                           'unknown'),

                                    96, decode(charsetform, 1, 'char',

                                                                              2, 'nchar',

                                                                             'unknown'),

                                    112, decode(charsetform, 1, 'clob',

                                                                                2, 'nclob',

                                                                               'unknown')

                       ) types_used_in

  from sys.col$

where charsetform in (1, 2) and type# in (1, 9, 96, 112)

order by characterset

 

-- 실행 결과 (이쪽에는 Characterset이 바뀌지 않았음)

 

■ ORA-06552, ORA-06553 해결방법

1. sqlplus로 접속하여, 아래 순서대로 실행한다.

2. shutdown immediate;

3. startup mount;

4. ALTER SYSTEM ENABLE RESTRICTED SESSION;

5. ALTER SYSTEM SET AQ_TM_PROCESSES = 0;

6. ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;

7. ALTER DATABASE OPEN;

8. col value new_value charset

9. SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

10. ALTER DATABASE CHARACTER SET INTERNAL_USE & CHARSET;

11. shutdown immediate;

12. startup;

13. 여기까지 작업을 진행하면 에러를 해결할 수 있다.

 

※ 10번에서 [ORA-12721 다른 세션이 활성일 때는 실행할 수 없는 작업] 에러가 나오는 경우 해결책

  - 명령 프롬프트를 관리자 권한으로 실행하여 다시 진행한다. (여기까지만 해서 해결됨)

  - 그래도 안 되는 경우 shutdown immediate; startup; 진행 후, 다시 명령 프롬프트를 관리자 권한으로 실행하여 다시 진행해 본다.

 

■ 마지막으로 데이터 확인

1. Characterset을 변경하기 전 한글 데이터가 이미 존재하는 경우, 한글이 깨지는지 확인한다.

2. 한글이 깨지면, Import를 다시 한다. (이 방법 말고, 해결책이 있으면 댓글 달아주세요.)

728x90
반응형
LIST

+ Recent posts