oracle import
**** import시 오류가 많다 *****
- export 한 db와 import 할 db의 캐릭터셋이 달라 임포트시 에러가 날 경우가 많다.
이럴때는 양쪽 db의 캐릭터셋을 확인해 봐야한다.
1. characterset 확인. sys 계정으로 sqlplus 접속
select * from sys.propS$ where name like 'NLS_CHARACTERSET';
2. 다를 경우 변경
update sys.props$ set value$='KO16WIN949' where name='NLS_CHARACTERSET';
**** 오라클이 다른버전일 경우 ****
- import 한 오라클이 9i 이고 export해야할 오라클이 10g 또는 11g 일경우
exp-00003 에러가 발생한다.
1. export 되야할 오라클10g 에서 오라클9i로 붙어 import dump 해야한다.
- 위의 경우처럼 오라클9i 로 붙어서 export 했는데 import 시 에러가 난다.
2. 적은 데이터의 경우는 exp 후 imp 되는지 확인
큰 데이터가 안되는 경우는 테이블스페이스 용량이 부족하거나. 데이터양이 많을 경우 에러가 난다.
오라클 9i의 에러라고 한다. 데이터를 나눠서 올리는게 마음편하다.
I. import 순서
1) 테이블스페이스 생성
CREATE TABLESPACE TS_FWCMS2 DATAFILE 'D:\oracle\product\10.2.0\oradata\orcl\TS_FWCMS2.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M DEFAULT STORAGE (INITIAL 4K NEXT 128K MINEXTENTS 1 PCTINCREASE 0);
--TS_FWCMS2 테이블스페이스를 생성한다. -- REUSE 옵션은 파일을 재사용 CREATE TABLESPACE TS_FWCMS2 DATAFILE 'D:\oracle\product\10.2.0\oradata\orcl\TS_FWCMS2.dbf' SIZE 100M REUSE AUTOEXTEND ON NEXT 100M DEFAULT STORAGE (INITIAL 4K NEXT 128K MINEXTENTS 1 PCTINCREASE 0); |
2) 사용자생성(디펄트 테이블스페이스 지정)
CREATE USER FWCMS2 IDENTIFIED BY FWCMS2 DEFAULT TABLESPACE TS_FWCMS2;
-- 사용자 생성 ID/PW : FWCMS2/FWCMS2 -- default tablespace 지정 |
3) 사용자 에게 권한 부여
GRANT RESOURCE, CONNECT , EXP_FULL_DATABASE, IMP_FULL_DATABASE TO FWCMS2;
--FWCMS2 사용자에게 리소스, 연결, 백업/복구 권한을 부여 |
4) imp 실행
imp FWCMS2/FWCMS2 file='DnewProjectfwcms2db_backup\bk_20130610.dmp' fromuser=DNECVOTE2013 touser=FWCMS2 ignore=y
-- 백업 파일 지정하여 import 한다. -- ignore=y 옵션으로 에러를 무시하면 기존테이블스페이스가 없으면 default tablespace로 간다. |
II) 오류사항
1) 테이블스페이스 존재 오류
IMP-00003: ORACLE 오류 959이(가) 발생했습니다. ORA-00959: 테이블스페이스 'POLICE2012'이(가) 존재하지 않습니다. |
1. Table
alter table 테이블명 move tablespace 테이블스페이스명;
특정 테이블 스페이스에서 일괄적으로 뽑고 싶을때(user_segment로 조회해도됨)
select 'alter table ' ||table_name|| ' move tablespace 테이블스페이스명;' from user_tables
where table_name ='테이블명'
and tablespace_name ='';
2. Partiton Table
alter table 테이블명 move partition 테이블스파티션명 tablespace테이블스페이스명;
일괄적으로 뽑을시...
select 'alter table ' || table_name || ' move partition '||partition_name || ' tablespace 테이블스페이스명;' from user_tab_partitions
3. Index
alter index 인덱스명 rebuild tablespace 테이블스페이스명;
일괄적으로 뽑고 싶을때
select 'alter index '||index_name ||' rebuild tablespace 테이블스페이스명;' from user_indexes
where table_name ='테이블명';
clob칼럼 인덱스 이동
SELECT * FROM user_indexes WHERE tablespace_name ='POLICE2012'; 검색한후..
alter table 테이블명 move lob ( clob칼럼명1,clob칼럼명2,clob칼럼명3) store as ( tablespace 옮겨갈테이블스페이스) ;
2) 문자셋에 오류
IMP-00019: ORACLE 12899 오류로 인하여 행이 거부되었습니다 IMP-00003: ORACLE 오류 12899이(가) 발생했습니다. ORA-12899: "FWCMS2"."COMTNMENUINFO"."PIC" 열에 대한 값이 너무 큼(실제: 114, 최대값: 100) |
--> 9i에서 사용하는KO16MSWIN949, AL16UTF16 보다 사용되는 바이트가 더 많게 되어 변환하면서 데이터가 삽입될때에 필드사이즈보다 크게 변환되는 경우가 발생하기 때문이다.
10g 데이터베이스 서버에 9i 디비를 넣으려고 할때 기본 문자집합을 변경하여import 수행하는것도 방법이다. 물론 기본 문자집합을 변경하면 10g에서 사용하던 디비는 깨지게 된다. 10g에서 사용하던 디비와 새로 import 되는 디비가 동시에 사용되지 않는다면, 서로 다른 문자집합으로 디비에 저장해놓았다가 사용하려는 디비에 맞추어 문자집합을 설정하는것도 방법이 되겠다. 물론 개발테스트로 적합한 방법이지.. 운영서버에서는 삼가하는것이 좋겠다.
UTF8은 유니코드를 구현한Character Set 중에 가변결이 인코딩 방식을 택하고 있는 Character Set이다. 가변 길이를 위해 일종의 플래그 비트를 각 바이트마다 포함시켜야 하다보니, 한 글자를표현하는데 필요한 바이트의 길이가 최대 3바이트(AL32UTF의 경우 6바이트)까지 늘어날 수 있다.
i). 9i 에서 사용되는 문자집합으로 변경하고 임포트 수행한다. 임포트한 후 서비스 재시작함.
UPDATE SYS.PROPS$ SET VALUE$='KO16MSWIN949' WHERE NAME='NLS_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='AL16UTF16' WHERE NAME='NLS_NCHAR_CHARACTERSET';
ii). 10g의 문자집합으로 변경
UPDATE SYS.PROPS$ SET VALUE$='AL32UTF8' WHERE NAME='NLS_CHARACTERSET';
UPDATE SYS.PROPS$ SET VALUE$='AL16UTF16' WHERE NAME='NLS_NCHAR_CHARACTERSET';
아래는 테스트 해 봐야함...
From User A to user B 로 [동일 디비내에서 다른 유저로 이관 ] Import 되어지는 유저의Default Tablespace 와 상관없이 Export 되어질때의 Tablespace 로Import 된다. FROMUSER=USER_A(USER_A_TS) TOUSER=USER_B(USER_B_TS) 환경에서Import 를 진행 하면, USER_A_TS 로 IMPORT 되어진다. 1. USER_A 의 User Level 로Export 진행 2. 2.1USER_B 의USER_A_TS, USER_B_TS 의 QUOTA 를 체크 USER_A_TS - QUOTA 를 "0" 으로 SELECT * FROM DBA_TS_QUOTAS where username = 'USER_B'; ALTER USER USER_B QUOTA 0 ON TABLESPACE USER_A_TS; 2.2 RESOUCE ROLE 이 있다면 REVOKE UNLIMITED TABLESPACE 하라. SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE='USER_B'; REVOKE UNLIMITED TABLESPACE from USER_B ; 3. USER_A_TS 에 대해서 더이상 권한이 없음을 확인 하라 CREATE TABLE JUNK (A NUMBER) TABLESPACE <USER_A_TS>;
4. Import 수행 5. 권한 원복 수행 ALTER USER <userB> QUOTA nn ON TABLESPACE <USER_A_TS>;
!! 테스트 하진 않았지만, 요점은 원래의 Tablespace 가 있어야 한다는 것으로 보여진다. 있지만, 권한이 없다면 USER_B 의 Default Tablespace 로 Import 되어질것으로 예상된다. |
위의 것도 안될 경우... (이걸로 해결하는 것도 좋음....양이 적을경우)
해당 오류나는 테이블과 필드를 늘려준 후 exp 받아 imp를 실행한다.
ALTER TABLE COMTNMENUINFO MODIFY PIC VARCHAR2(256); ALTER TABLE TB_FOREIGNADMIN MODIFY EMAIL VARCHAR2(256); [출처] oracle imp시 오류들 해결법......|작성자 시골사람 |
'ORACLE 관련' 카테고리의 다른 글
특수 문자를 검색시 LIKE ESCAPE 사용 (0) | 2018.01.15 |
---|---|
문자 치환 함수 replace 함수 (0) | 2015.02.28 |
[스크랩] Orange에서 접속시 ora-01017 Invalid username/password;logon denied Error (0) | 2014.10.19 |