오라클 설치 후, 데이터 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를 다시 한다. (이 방법 말고, 해결책이 있으면 댓글 달아주세요.)
'Database > Oracle' 카테고리의 다른 글
Oracle DB Dump (exp/imp 이용) (0) | 2024.03.18 |
---|---|
ORA-12638 신용 검색에 실패 했습니다. 에러 해결 (0) | 2024.01.28 |
ORA-24324, ORA-01041 서비스 처리 초기화, 내부오류. hostdef (0) | 2024.01.15 |
ORA-12514 리스너에 등록되지 않았습니다.(해결) (0) | 2024.01.14 |
Oracle Pivot, UnPivot (0) | 2023.09.29 |