Transportable tablespace trong Oracle Database

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:

  1. 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.
  2. 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

Datalinks.vn

Hello các bạn, tôi là Dương Nguyễn (DuoDBA - https://www.youtube.com/@DuoDBA) tác giả của blog này. Mong muốn được chia sẻ kiến thức và kinh nghiệm về cơ sở dữ liệu với những người đam mê và quan tâm đến lĩnh vực này. Tôi có tổ chức các khoá Coaching về #OracleDatabase và luyện thi #OCP thường xuyên, các bạn muốn có người đồng hành thì alo tôi nhé. Call/Zalo: 0765 871 888. Thanks you !.....
0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận