วันศุกร์ที่ 22 พฤษภาคม พ.ศ. 2558

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

ไม่มีความคิดเห็น:

แสดงความคิดเห็น