Oracle 50일차

[원격 expdp / 로컬 impdp]

db1의 schema를 copydb에서 원격 expdp후 로컬 impdp 진행

1. 유저랑 테이블 생성 – oel7 db1에서

-- 만든 유저가 너무 많아서 좀 삭제함. copydb 쪽도
select * from dba_users;
drop user itwill2 cascade;
drop user itwill3 cascade;
drop user itwill4 cascade;
drop user hhh cascade;

-- 불필요한 tablespace 삭제. copydb 쪽도
select * from dba_tablespaces;
drop tablespace test01 including contents and datafiles;
drop tablespace test02 including contents and datafiles;
drop tablespace test03 including contents and datafiles;

-- 새 유저 생성
create user itwill2 identified by oracle
quota unlimited on users;
grant create session to itwill2;

-- 테이블 생성
create table itwill2.expdp_test4(no number);
insert into itwill2.expdp_test4 values(10);
insert into itwill2.expdp_test4 values(20);
insert into itwill2.expdp_test4 values(30);
commit;

2. 원격 expdp – copy copydb에서

schema mode로

expdp system/oracle@oel7 dumpfile=expdp_test4.dmp logfile=expdp_test4.log directory=datapump schemas=itwill2

** 근데 exp명령어랑 다르게 원격 expdp를 copy에서 입력하면 oel7쪽에 덤프파일이 생긴다.
그래서 tns alias를 사용하는 방식을 사용하지 않는다.

** 따라서 다른 dblink(network_link)를 사용하는 방식을 사용해야 한다.
copydb에서 db1으로 연결해놓은 dblink 이름을 사용해야됨.

expdp system/oracle dumpfile=expdp_test4.dmp logfile=expdp_test4.log directory=datapump schemas=itwill2 NETWORK_LINK=DBLINK_DB1

3. 로컬 impdp

impdp system/oracle dumpfile=expdp_test4.dmp logfile=expdp_test4.log directory=datapump

4. 데이터 조회

select * from itwill2.expdp_test4;

[원격 impdp]

expdp를 하지 않고 os를 거치지 않고 DB수준에서 원격 impdp가 가능하다.
-> dump file을 만들지 않기 때문에 보안수준이 높아진다.

1. 유저랑 테이블 생성 – oel7 db1에서

-- 새 유저 생성
create user itwill3 identified by oracle
quota unlimited on users;

-- 테이블 생성
create table itwill3.impdp_test1(no number);
insert into itwill3.impdp_test1 values(10);
insert into itwill3.impdp_test1 values(20);
insert into itwill3.impdp_test1 values(30);
commit;

2. 원격 impdp – copy쪽에서 진행

copy->db1쪽으로 뚫린 dblink를 이용해서 DB레벨에서 데이터가 바로 들어오는 느낌.

impdp system/oracle logfile=impdp_test1.log directory=datapump network_link=dblink_db1 schemas=itwill3
-- logfile옵션 생략 시 자동생성 : import.log

3. 데이터 조회

select * from itwill3.impdp_test1;

[한쪽에만 존재하는 tablespace 원격 impdp]

** constraints, indexes, 권한만 impdp된다. – 권한의 경우에는 table descript에 명시가 되어있어서 옮겨짐.
** synonyms, view는 같은 해당 테이블스페이스에 저장공간(segment) 할당받지 않는 객체라 impdp가 안됨.

1. tablespace 생성 (test01) – oel7 db1에서

CREATE TABLESPACE test01
DATAFILE '/home/oracle/oradata/db1/test01.dbf' 
SIZE 50M AUTOEXTEND ON MAXSIZE 1G;

2. scott user의 test01 tablespace에 대한 quota 부여

ALTER USER scott QUOTA UNLIMITED ON test01;

3. table 생성 (scott.impdp_test2) 및 데이터 입력

create table scott.impdp_test2(no number, name varchar(10)) tablespace test01;
insert into scott.impdp_test2 values(1, 'aa');
insert into scott.impdp_test2 values(2, 'bb');
insert into scott.impdp_test2 values(3, 'cc');
commit;

4. 기타 오브젝트 생성

-- 1. pk (no) 생성
alter table scott.impdp_test2 add constraint impdp_test2_pk_no primary key (no);

-- 2. not null (name) 생성
ALTER TABLE scott.impdp_test2 MODIFY name NOT NULL;

-- 3. index 생성 (name)
create index scott.impdp_test2 on scott.impdp_test2 (name);

-- 4. view 생성
create view scott.view_impdp_test2
as
select * from scott.impdp_test2;

-- 5. synonym 생성
-- public synonym
create public synonym public_impdp_test2 for scott.impdp_test2 ;
-- private synonym : scott계정에서 수행해야됨.
create synonym private_impdp_test2 for scott.impdp_test2;

5. 권한 부여

grant select on scott.impdp_test2 to hr;

6. 원격 impdp 수행 – copy에서

impdp system/oracle tablespaces=test01 network_link=dblink_db1 directory=datapump
--
Processing object type TABLE_EXPORT/TABLE/TABLE
ORA-39083: Object type TABLE:"SCOTT"."IMPDP_TEST2" failed to create with error:
ORA-00959: tablespace 'TEST01' does not exist

** copydb쪽에 tablespace가 없어서 아무것도 impdp 안됨.
** 해결방법 2가지
1. test01 tablespace 만들기.
2. remap_tablespace 옵션 사용하기.

impdp system/oracle tablespaces=test01 remap_tablespace=test01:users network_link=dblink_db1 directory=datapump
--
Starting "SYSTEM"."SYS_IMPORT_TABLESPACE_01":  system/******** tablespaces=test01 remap_tablespace=test01:users network_link=dblink_db1 directory=datapump
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 64 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
. . imported "SCOTT"."IMPDP_TEST2"                            3 rows
Processing object type TABLE_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_TABLESPACE_01" successfully completed at Fri Dec 20 12:53:55 2024 elapsed 0 00:00:15

7. 데이터 조회

select * from scott.impdp_test2;  -- 됨
select * from dba_constraints where table_name='IMPDP_TEST2';  -- 됨
select * from dba_indexes where table_name='IMPDP_TEST2';  -- 됨
select * from dba_synonyms where table_name='IMPDP_TEST2';  -- 안됨
select * from dba_views where view_name='VIEW_IMPDP_TEST2';  -- 안됨
select * from dba_tab_privs where table_name='IMPDP_TEST2';  -- 됨

** constraints, indexes, 권한만 impdp된다. – 권한의 경우에는 table descript에 명시가 되어있어서 옮겨짐.
** synonyms, view는 같은 해당 테이블스페이스에 저장공간(segment) 할당받지 않는 객체라 impdp가 안됨.

** 결론
– exp/imp는 target DB에 적재 대상의 tbs가 없을 경우 테이블 소유자의 default tbs에 저장. 에러X.
– datapump는 target DB에 적재 대상의 tbs가 없을 경우 에러 발생.
해결법 1) target DB에 똑같은 이름의 tbs 생성.
해결법 2) remap_tablespace 옵션을 사용하여 다른 tbs에 적재.

[parallel을 사용한 datapump 적재]

1. parallel 없이 expdp 수행

time expdp system/oracle directory=datapump dumpfile=full.dmp full=y job_name=full
--
real    1m14.057s
user    0m0.027s
sys     0m0.048s

2. job 모니터링

select sid, serial#, target_desc as 작업명,
       sofar as "경과시간(s)",
       totalwork as "총 수행시간(s)"
from v$session_longops
where lower(target_desc) like '%full%';

3. parallel 사용 expdp 수행

time expdp system/oracle directory=datapump dumpfile=full2.dmp full=y job_name=full2 parallel=4
--
real    1m13.382s
user    0m0.043s
sys     0m0.185s

Leave a Comment