/* TTS(Transportable TableSpace)를 이용함으로써 다른 플랫폼 간의 다른 DB끼리 테이블스페이스를 이동할 수 있다. 데이터베이스를 다른 플랫폼으로 이동시키기 위해, V$TRANSPORTABLE_PLATFORM 뷰에서 endian format을 미리 체크해야 할 필요가 있다. */
[노드2]
CREATE TABLESPACE tbs_migrate_01 DATAFILE '/tmp/tbs_migrate01.dbf' SIZE 10M;
CREATE USER usr_migrate_01 IDENTIFIED BY asdf0930k;
GRANT CONNECT, RESOURCE, EXP_FULL_DATABASE, UNLIMITED TABLESPACE TO usr_migrate_01;
conn usr_migrate_01/asdf0930k
CREATE TABLE usr_migrate_01.tbl_migrate_01
TABLESPACE tbs_migrate_01
AS
SELECT *
FROM dba_objects
WHERE rownum <= 100;
/* 두 노드의 OS가 같다면, V$TRANSPORTABLE_PLATFORM 뷰에서 endian format를 체크할 필요가 없을 것이다. DBMS_TTS.TRANSPORT_SET_CHECK 프로시저를 사용해 해당 테이블스페이스가 self_contained 테이블스페이스 (다른 테이블스페이스와 의존관계가 거의 없는 상태) 인지 확인한다. */
/* DBMS_TTS.TRANSPORT_SET_CHECK 프로시저를 사용해 self_contained 테이블스페이스인지 확인하고, TRANSPORT_SET_VIOLATIONS 뷰를 통해서 TTS에 violation이 있는지 여부를 확인한다. */
/* self-contained 테이블스페이스인지 확인한다. */
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('tbs_migrate_01', TRUE);
SELECT * FROM transport_set_violations;
/* 비 self-contained 형식의 테이블 작성 */
CREATE TABLE usr_migrate_01.tbl_self_contained (id NUMBER)
PARTITION BY RANGE(id)
(PARTITION one VALUES LESS THAN (100) TABLESPACE tbs_migrate_01,
PARTITION two VALUES LESS THAN (1000) TABLESPACE users);
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('tbs_migrate_01',TRUE);
SELECT * FROM TRANSPORT_SET_VIOLATIONS;
ALTER TABLE usr_migrate_01.tbl_self_contained MOVE PARTITION two TABLESPACE tbs_migrate_01;
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('tbs_migrate_01',TRUE);
SELECT * FROM TRANSPORT_SET_VIOLATIONS;
/* 이제 테이블스페이스를 read only모드로 바꾸고, metadata를 export할 것이다. DBA_DIRECTORIES 뷰로 덤프파일을 export하기 위한 디렉토리를 확인한다. */
/* 노드 간 nfs를 configure */
참고: https://yooliberalhouse.tistory.com/50
1-8 Server Configuration - Management of NFS-mounted file system
NFS: Network File System, 지정한 상대방과의 네트워킹을 통해 보다 안전한 파일 공유가 가능 실습 환경: Oracle Database 19.3.0 서버 노드: 192.168.56.25 클라이언트 노드: 192.168.56.26 난이도: ★★★★☆ 문제 1
yooliberalhouse.tistory.com
ALTER TABLESPACE tbs_migrate_01 READ ONLY;
CREATE DIRECTORY export AS '/nfs_folder';
SELECT * FROM dba_directories;
$ expdp system/asdf0930k dumpfile=migrate_01.dmp directory=export transport_tablespaces=tbs_migrate_01
[노드1]
난이도: ★★★☆☆
문제 1: first virtual machine에 테이블스페이스를 생성하고 테이블을 생성해라. 이 테이블스페이스를 second virtual machine에 옮기고, 테이블을 쿼리해보라. (15분)
[노드1]
[노드2]
$ impdp system/asdf0930k dumpfile=exp01.dmp directory=export transport_datafiles=/nfs_folder/exporttbs
SELECT count(*) FROM exporttbs01;
난이도: ★★★☆☆
문제 2: Windows OS에 테이블스페이스를 생성하고 테이블을 생성해라. linux 플랫폼으로 테이블스페이스를 옮겨라. (8분)
/* 그냥 테이블스페이스를 export하기 전에 RMAN에서 CONVERT DATAFILE 작업을 한번 더 거친다고 생각하면 편하다. */
/* 현재 플랫폼 상태와 endian 확인 */
SELECT db.name, db.platform_name, trp.endian_format
FROM v$database db, v$transportable_platform trp
WHERE db.platform_name = trp.platform_name;
/* transportable한 플랫폼 리스트 확인 */
select platform_name, endian_format
from v$transportable_platform;
/* 데이터파일의 플랫폼 endian 모드를 바꿀 수 있다. 본 실습에서는 HP-UX를 사용하지 않는 상태이므로 당연히 에러가 발생한다. */
CONVERT DATAFILE '/tmp/tbs_migrate01.dbf' TO platform="Linux x86 64-bit" FROM platform="HP-UX IA (61-bit)" format='/tmp/convert01.dbf';
$ expdp system/asdf0930k dumpfile=migrate_01.dmp directory=export transport_tablespaces=tbs_migrate_01
난이도: ★★★☆☆
문제 3: linux OS 환경에서 돌아가는 데이터베이스에 두 테이블스페이스를 생성하여라. 그리고 Windows OS 환경에서 돌아가는 virtual machine으로 옮기고, 데이터베이스에 plug하여라. (8분)
/* CONVERT DATAFILE 작업은 [노드2]에서 impdp 후에 진행할 수도 있다. */