Transportable Tablespace
การย้ายข้อมูลใน tablespace ข้าม database สามารถทำได้หลายวิธี เช่น การ export-import datapump การใช้ RMAN หรือการ Transportable Tablespace แต่ละวิธีมีข้อดีข้อเสียแตกต่างกัน
Transportable Tablespace เป็นวิธีการหนึ่งในการย้าย tablespace ข้าม database ซึ่งเป็นการย้ายข้อมูลที่มีข้อมูลขนาดใหญ่มากๆได้
*ข้อจำกัดของการทำวิธีนี้ก็พอมีบ้างต้องเข้าไปดูใน Oracle document เองแต่ตอนนี้เราลองทำแบบง่ายๆกันดูก่อน
ขั้นตอน
1. เราต้องเช็คดูก่อนว่า endian-format ของ OS เราคืออะไร ถ้าต้นทางกับปลายทางเป็น endian-format คนละแบบเราต้องเพิ่มขั้นตอนในการ convert endian-format ให้ตรงกับปลายทางก่อน
เราสามารถเช็คได้โดยดูจาก
2. ตัวอย่างนี้จะลอง transport จาก linux x86 64bit ไป windows x86 64bit นะครับ
และได้ลองสร้าง tablespace , user , table , data ขึ้นมา (character set เดียวกันและไม่มี referential constraint ข้าม tablespace กันถ้ามีต้องเอาไปทุก tablespace ที่เกี่ยวข้อง พวกนี้เป็นข้อจำกัดเช่นกัน)
[oracle@kitti-rac1 12.1.0.2]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Wed May 13 16:52:49 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
SQL> create tablespace kitti_tablespace datafile '+DATA' size 20M;
Tablespace created.
SQL> create user kitti identified by kitti default tablespace kitti_tablespace;
User created.
SQL> grant connect,resource to kitti;
Grant succeeded.
SQL> conn kitti/kitti
Connected.
SQL> create table kitti_table (id number);
create table kitti_table (id number)
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'KITTI_TABLESPACE'
SQL> conn sys as sysdba
Enter password:
Connected.
SQL> alter user kitti quota unlimited on kitti_tablespace;
User altered.
SQL> conn kitti/kitti
Connected.
SQL> create table kitti_table (id number);
Table created.
SQL> begin for i in 1..10 loop
2 insert into kitti_table
3 values(i);
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> select count(*) from kitti_table;
COUNT(*)
----------
10
3. เราสามารถเช็คดูก่อนได้ว่า tablespace ที่เราจะ transport นั้นมีอะไรเกี่ยวข้องกับ tablespace อื่นบ้างเช่น foreign key , partition table
exec dbms_tts.transport_set_check('KITTI_TABLESPACE',TRUE);
4. หลังจากเรา execute package นั้นเราสามารถตรวจสอบได้ว่ามีอะไรผิดข้อกำหนดของการทำ transport tablespace บ้างด้วยการ query TRANSPORT_SET_VIOLATIONS view
SQL> select * from transport_set_violations;
no rows selected
ในกรณีนี้คือไม่มีอะไรเกี่ยวข้องกับ tablespace อื่น
5. เช็คดูว่า data files ของ tablespace ที่เราจะ transport อยู่ที่ไหน
SQL> set line 200
SQL> column file_name format a60
SQL> select file_name,tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
------------------------------------------------------------ ------------------------------
+DATA/KITTIRAC/DATAFILE/system.291.877176309 SYSTEM
+DATA/KITTIRAC/DATAFILE/sysaux.290.877176235 SYSAUX
+DATA/KITTIRAC/DATAFILE/undotbs1.293.877176385 UNDOTBS1
+DATA/KITTIRAC/DATAFILE/users.292.877176383 USERS
+DATA/KITTIRAC/DATAFILE/undotbs2.299.877177477 UNDOTBS2
+DATA/KITTIRAC/DATAFILE/example.298.877176481 EXAMPLE
+DATA/KITTIRAC/DATAFILE/kitti_tablespace.303.879612809 KITTI_TABLESPACE
7 rows selected.
* เนื่องจากตัวอย่างนี้ endian-format เป็น Little เหมือนกันจึงไม่จำเป็นต้องทำการ convert แต่ถ้าไม่เหมือนกันต้องเข้า RMAN แล้วสั่ง RMAN> convert tablespace ... to platform ...
6. ปรับเป็น read only
SQL> alter tablespace kitti_tablespace read only;
Tablespace altered.
7. สั่ง expdp แล้วใส่ transport_tablespaces เป็นชื่อ tablespace ที่เราต้องการจะ transport
[oracle@kitti-rac1 ~]$ expdp system directory=DATA_PUMP_DIR dumpfile=tts_kitti_t
ablespace.dmpdp nologfile=y transport_tablespaces=kitti_tablespace
Export: Release 12.1.0.2.0 - Production on Wed May 20 17:54:42 2015
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Password:
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** directory=DATA_PUMP_DIR dumpfile=tts_kitti_tablespace.dmpdp nologfile=y transport_tablespaces=kitti_tablespace
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/u01/app/oracle/product/12.1.0.2/rdbms/log/tts_kitti_tablespace.dmpdp
******************************************************************************
Datafiles required for transportable tablespace KITTI_TABLESPACE:
+DATA/KITTIRAC/DATAFILE/kitti_tablespace.303.879612809
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at Wed May 20 18:01:24 2015 elapsed 0 00:05:50
8. เนื่องจากเครื่องตัวอย่างใช้ Storage เป็น ASM จึงต้องทำการคัดลอกไฟล์ไปเป็น File system ธรรมดาก่อน
[oracle@kitti-rac1 ~]$ asmcmd
ASMCMD> pwd
+
ASMCMD> cd DATA/KITTIRAC/DATAFILE/
ASMCMD> cp kitti_tablespace.303.879612809 /home/oracle/kitti_tablespace.dbf
copying +DATA/KITTIRAC/DATAFILE/kitti_tablespace.303.879612809 -> /home/oracle/kitti_tablespace.dbf
ASMCMD>
9. เอา dump and data fileมาไว้ที่เครื่องปลายทาง
10. ที่เครื่องต้นทางเราสามารถปรับโหมด tablespace ให้เป็น read write ได้เลย
SQL> alter tablespace kitti_tablespace read write;
Tablespace altered.
11. สร้าง user ที่เครื่องปลายทางเพื่อเป็นเจ้าของ objects ใน tablespace ที่จะเอามาลงก่อน
SQL> create user kitti identified by kitti;
User created.
12. impdp metadata dump file ลงไปที่เครื่องปลายทางพร้อมระบุ data file path ที่เราเอามาได้เลย
C:\Users\kitti_l>impdp system@KITTIPDB1 directory=expdp dumpfile=tts_kitti_table
space.dmpdp transport_datafiles='E:\app\kitti_l\oradata\KITTICDB\C6C93CD0450942D
2A5D8FD20333D6397\DATAFILE\KITTI_TABLESPACE.DBF'
Import: Release 12.1.0.2.0 - Production on Fri May 22 13:51:29 2015
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Password:
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit
Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
ions
Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Source time zone is +00:00 and target time zone is -05:00.
Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/********@KITTIPDB1 dire
ctory=expdp dumpfile=tts_kitti_tablespace.dmpdp transport_datafiles='E:\app\kitt
i_l\oradata\KITTICDB\C6C93CD0450942D2A5D8FD20333D6397\DATAFILE\KITTI_TABLESPACE.
DBF'
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at Fri May 22
13:52:01 2015 elapsed 0 00:00:29
13. ทดลอง Query data จากเครื่องปลายทางจะพบว่ามี data เหมือนกับเครื่องต้นทาง
SQL> select count(*) from kitti_table;
COUNT(*)
----------
10