ORACLE dump import

Daily/Prog 2021. 7. 22. 00:14

 

초보 오라클러가 오라클 데이터를 덤프받아 import 하며 간만에 크게 삽질한 과정을 적어본다. (난 도대체 언제까지 초보일껀가?) impdp 과정에서 오류나는 tablespace 열심히 만들고, 그 외에 유독 눈에 띄는 오류들이 있었다.

 

ora-12899: value too large for column actual x maximum n

 

아니 똑같은 스키마에 덤프 떠서 고대로 넣는데 먼 소린고... 

 

무시하다가 나중에 데이터를 확인했는데 같은 테이블에서도 어떤 컬럼은 한글이 깨지고 어떤 컬럼은 안깨지고... Mysql 에서도 테이블 별로 인코딩 설정은 가능하지만, 컬럼 별로 깨지고 안깨진다? 오라클 초보자로서는 당최 이해할 수가 없었는데 검색을 조금 해보니 알 것 같았다. KO16MSWIN949 의 2바이트짜리 한글들이 AL32UTF8 의 3바이트 한글로 넘어오면서 컬럼값이 넘친 것이니 인코딩 문제는 맞다. 아니 오라클 깔면 기본으로 UTF8 쓰게 되어 있는데 굳이 바꿔 가지고 이렇게들 피곤하게 할까잉...

 

오라클에서 인코딩 관련 설정 2개 / 언어 관련 설정 2개를 찾았다.

 

SELECT name, value$
FROM sys.props$
WHERE name IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

or

SELECT * 
FROM NLS_DATABASE_PARAMETERS 
WHERE PARAMETER IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

--NLS_LANGUAGE AMERICAN
--NLS_TERRITORY AMERICA
--NLS_CHARACTERSET AL32UTF8
--NLS_NCHAR_CHARACTERSET AL16UTF16

 

NLS_CHARACTERSET : char / varchar 데이터타입에서 사용하는 문자셋

NLS_VCHAR_CHARACTERSET  : nchar / nvarchar 데이터타입에서 사용하는 문자셋

 

 

역시 덤프 받아온 운영DB 와 NLS_CHARACTERSET 이 달랐고, varchar 의 한글만 문제가 발생한 것이다. KO16MSWIN949 로 인코딩 변경이 필요했다.

 

 

SQL> update props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET';
SQL> commit;
SQL> shutdown immediate;
SQL> startup;

 

인터넷에서 대충 검색 해보고 뙇! 역시 천재라고 잠시 생각했지만, update 하면서 인코딩 값에 오타가 들어갔었는지 습관적으로 커밋은 했는데 startup 에 실패했다. 그 일순간의 오타로 오라클을 재설치까지 했다.ㅋㅋ nomount 하고 어쩌구 저쩌구 하면 가능하다고는 하는데, 난 모르겠고 빨리 재설치를 빨리 하는 것이 더 이득인 상황. 어짜피 이미 깨진 한글 다시 넣으려면 테이블들 다 확인해서 drop 을 하던 truncate 를 하던 해야 할 상황이었는데, 재설치가 빠르지... 라는 타협을 하고서는 ./deinstall ㅋㅋ 역시 뭔 프로그램이던 삭제는 참 빨라. $ORACLE_HOME 이랑 oradata 디렉토리도 비워주고 재설치 고고.

 

이번엔 미리 NLS_CHARACTERSET 인코딩 설정하고, profile 에 NLS_LANG 도 맞춰주고... impdp 뙇!

 

ORA-39006: internal error
ORA-39065: unexpected master process exception in DISPATCH
ORA-00600: internal error code, arguments: [kokle_lob2lob13:input mismatch], [1], [], [], [], [], [], []
ORA-39097: Data Pump job encountered unexpected error -600

 

아씨... 이럼 완전 나가린데...

 

한참 삽질 끝에 구글신이 도와주긴 했는데 이해는 안간다. NLS_CHARACTERSET 랑 DB internal 캐릭터셋이 따로 노는겨? 왜 둘다 바꿔줘야 하는겨? ㅡ.ㅡ 테스트 해보니 아래 방법이 NLS_CHARACTERSET 까지 확실하게 바뀌니, 아래 방법을 추천하는 걸로...

 

SQL> shutdown immediate;
SQL> startup mount;
SQL> alter system enable restricted session;
SQL> alter system set job_queue_processes=0;
SQL> alter database open;
SQL> alter database character set internal_use KO16MSWIN949;
SQL> shutdown immediate;
SQL> startup;

 

alter database character set internal_use <- 요기가 포인트!

 

아무튼 긴~ 삽질끝에 덤프질 해결~


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,