Transportable tablespace trong Oracle Database là một tính năng cho phép bạn di chuyển một hoặc nhiều tablespace từ cơ sở dữ liệu này sang cơ sở dữ liệu khác một cách hiệu quả và nhanh chóng. Đây là một phương pháp lý tưởng để di chuyển khối lượng dữ liệu lớn giữa các cơ sở dữ liệu, đặc biệt khi việc xuất và nhập dữ liệu thông qua các phương pháp truyền thống như export/import sẽ mất nhiều thời gian.
Transportable tablespace được Oracle giới thiệu từ Oracle 8i.
Transportable tablespace trong Oracle Database
Các Điểm Chính Về Transportable Tablespace:
- Di Chuyển Dữ Liệu Nhanh Chóng:
- Thay vì xuất và nhập dữ liệu, bạn chỉ cần sao chép các tệp dữ liệu (datafiles) từ cơ sở dữ liệu nguồn sang cơ sở dữ liệu đích. Điều này giúp tiết kiệm thời gian và giảm khối lượng công việc.
- Các Bước Chính:
- Tạo tablespace hoặc xác định tablespace để di chuyển: tạo tablespace mới hoặc tablespace có sẵn cho việc di chuyển
- Chuyển Thành Chế Độ Chỉ Đọc: Để đảm bảo dữ liệu không bị thay đổi trong quá trình di chuyển => chuyển đổi tablespace sang chế độ read only
- Xuất Metadata: Sử dụng Oracle Data Pump để xuất siêu dữ liệu của tablespace.
- Sao Chép Tệp Dữ Liệu: Sao chép các tệp dữ liệu từ máy chủ nguồn đến máy chủ đích (sao chép các datafile).
- Nhập Metadata: Sử dụng Data Pump để nhập siêu dữ liệu vào cơ sở dữ liệu đích.
- Chuyển Thành Chế Độ Đọc-Ghi: Khi tablespace đã được nhập vào cơ sở dữ liệu đích => chuyển đổi thành chế độ đọc ghi
Giả sử chúng ta đang có 2 database như sau: duodb và onedb cùng nằm trên 1 server
Chúng ta có tablespace test_tbs nằm trên duodb và là database nguồn, chúng ta cần transport tablespace này sang bên database onedb gọi là tablespace đích:
Trên DuoDB: thực hiện tạo tablespace và user test, tạo bảng test_tab sau đó insert data vào trong bảng này:
CONN / AS SYSDBA SELECT name from v$database; CREATE TABLESPACE test_data DATAFILE '/u01/app/oracle/oradata/DUODB/datafile/datafile_tbs_test.dbf' SIZE 10M AUTOEXTEND ON NEXT 1M; CREATE USER test_user IDENTIFIED BY oracle DEFAULT TABLESPACE test_data TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON test_data; GRANT CREATE SESSION, CREATE TABLE TO test_user; CONN test_user/oracle CREATE TABLE test_tab ( id NUMBER, description VARCHAR2(50), CONSTRAINT test_tab_pk PRIMARY KEY (id) ); INSERT /*+ APPEND */ INTO test_tab (id, description) SELECT level, 'Description for ' || level FROM dual CONNECT BY level <= 10000; COMMIT; select count(*) from test_tab;
Thực hiện kiểm tra dữ liệu ràng buộc, khi transport tablespace thì yêu cầu tablespace không có ràng buộc nào với các đối tượng khác:
CONN / AS SYSDBA EXEC SYS.DBMS_TTS.TRANSPORT_SET_CHECK(ts_list => 'TEST_DATA', incl_constraints => TRUE);
Kiểm tra thông tin đảm bảo:
SELECT * FROM transport_set_violations;
Đưa tablespace về READ ONLY:
ALTER TABLESPACE test_data READ ONLY;
Thực hiện export metadata của tablespace:
CONN / AS SYSDBA CREATE OR REPLACE DIRECTORY temp_dir AS '/tmp/'; GRANT READ, WRITE ON DIRECTORY temp_dir TO system;
Thoát khỏi SQLplus trở về hệ điều hành:
exit;
expdp system/oracle directory=temp_dir transport_tablespaces=test_data dumpfile=test_data.dmp logfile=test_data_exp.log
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/tmp/test_data.dmp
******************************************************************************
Datafiles required for transportable tablespace TEST_DATA:
/u01/app/oracle/oradata/DUODB/datafile/datafile_tbs_test.dbf
Copy datafile của tablespace này và dumpfile vừa tạo ở bên trên sang server đang chạy database mới: bạn có thể sử dụng FTP hoặc SCP hoặc ứng dụng nào tuỳ thích để copy file này.
Ở đây tôi thực hiện trên cùng 1 server nên có thể cách thức copy datafile và dumpfile sẽ khác khi chúng ta thực hiện trên 2 server khác nhau nhưng về cơ bản là chúng ta cần copy file từ nguồn sang đích để thực hiện import vào database mới.
cd /home/oracle mkdir onedb ls -l cp /tmp/test_data.dmp /home/oracle/onedb cp /u01/app/oracle/oradata/DUODB/datafile/datafile_tbs_test.dbf /u01/app/oracle/oradata/ONEDB/datafile/datafile_tbs_test.dbf
Sau đó chúng ta mở lại tablespace trên database nguồn:
sqlplus / as SYSDBA ALTER TABLESPACE test_data READ WRITE;
Trên CSDL đích OneDB:
export ORACLE_SID=onedb sqlplus / as sysdba SELECT name from v$database;
Kiểm tra tablespace:
select TABLESPACE_NAME from dba_tablespaces;
Tạo user:
CONN / AS SYSDBA CREATE USER test_user IDENTIFIED BY oracle; GRANT CREATE SESSION, CREATE TABLE TO test_user;
Tạo đường dẫn:
CONN / AS SYSDBA CREATE OR REPLACE DIRECTORY temp_dir AS '/home/oracle/onedb'; GRANT READ, WRITE ON DIRECTORY temp_dir TO system;
Thực hiện import medata:
exit;
impdp userid=system/oracle directory=temp_dir dumpfile=test_data.dmp logfile=test_data_imp.log transport_datafiles='/u01/app/oracle/oradata/ONEDB/datafile/datafile_tbs_test.dbf'
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Master table “SYSTEM”.”SYS_IMPORT_TRANSPORTABLE_01″ successfully loaded/unloaded
Starting “SYSTEM”.”SYS_IMPORT_TRANSPORTABLE_01″: userid=system/******** directory=temp_dir dumpfile=test_data.dmp logfile=test_data_imp.log transport_datafiles=/u01/app/oracle/oradata/ONEDB/datafile/datafile_tbs_test.dbf
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/STATISTICS/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 Tue Sep 10 09:06:09 2024 elapsed 0 00:00:24
Mở lại tablespace:
ALTER TABLESPACE test_data READ WRITE;
Test dữ liệu:
SELECT tablespace_name, plugged_in, status FROM dba_tablespaces WHERE tablespace_name = 'TEST_DATA'; select TABLESPACE_NAME from dba_tablespaces; conn test_user/oracle select * from test_tab; select count(*) from test_tab;
Done !!!
Chúc các bạn thành công