در اوراکل نسخه 23ai امکان پیاده سازی قابلیت Transport Tablespace از طریق network به وجود آمد برای این کار باید از ابزار RMAN استفاده کرد و از طریق آن دیتافایلهای tablespace مورد نظر را از دیتابیس مبدا به دیتابیس مقصد منتقل کرد.
این کار با اجرای دستور RESTORE FOREIGN TABLESPACE در دیتابیس مقصد قابل انجام است با اجرای این دستور، حتی Metadata مربوط به TABLESPACE هم از طریق ایجاد فایل dump به دیتابیس مقصد منتقل خواهند شد و به صورت خودکار در این دیتابیس برخواهند گشت.
اجرای دستور RESTORE نیاز به مقدماتی دارد که در ادامه متن نحوه انجام آن را شرح خواهیم داد.
قصد داریم TABLESPACEای با نام TBS1 را از TehranPDB به EsfahanPDB ارسال کنیم:
'Source': TehranPDB 'Destination': EsfahanPDB
1: در قدم اول باید TABLESPACE را در حالت READ ONLY قرار دهیم:
--source SQL> alter session set container=TehranPDB; Session altered. SQL> ALTER TABLESPACE tbs1 READ ONLY; Tablespace altered.
2: کاربری را در دیتابیسهای source و destination ایجاد می کنیم هم نام و با پسورد مشابه:
-- source + destination SQL> create user c##usef identified by a; User created.
مجوزهای sysbackup و EXP_FULL_DATABASE را به این کاربر می دهیم(هم در source و هم در destination)
SQL> grant sysbackup to c##usef container=all; Grant succeeded. SQL> grant EXP_FULL_DATABASE to c##usef container=all; Grant succeeded.
از طریق این یوزر می توانیم در محیط rman به دیتابیس source وصل شویم:
RMAN> connect target "c##usef/a@TehranPDB AS SYSDBA" connect target * connected to target database: FREE:TEHRANPDB (DBID=1145898896) RMAN>
3: در هر دو سمت net serviceای با نامهای TehranPDB و EsfahanPDB ایجاد می کنیم:
TehranPDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.42)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = tehranpdb) ) ) EsfahanPDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.40)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ESFAHANPDB) ) )
4: برای گرفتن دامپ از Metadataی مربوط به tablespace باید PUBLIC DATABASE LINKای را در دیتابیس مقصد ایجاد کنیم:
--source SQL> alter session set container=tehranpdb; Session altered. SQL> create user usef identified by a; User created. SQL> grant dba to usef; Grant succeeded. --dest SQL> alter session set container=esfahanpdb; Session altered. SQL> SQL> CREATE PUBLIC DATABASE LINK linkMetDataDump CONNECT TO usef IDENTIFIED BY a USING 'TehranPDB'; Database link created.
5: در آخرین قدم باید دستور restore را در دیتابیس dest اجرا کنیم:
FOREIGN TABLESPACE: نام tablespaceای که قرار است از دیتابیس مبدا به مقصد ارسال شود.
FROM SERVICE: در این قسمت service name دیتابیس source را تنظیم می کنیم.
PLUGIN DBLINK: نام دیتابیس لینکی که در مرحله 4 ایجاد کردیم در این قسمت قرار می گیرد.
PLUGIN FILE: این پارامتر مشخص می کند دامپ ایجاد شده از متادیتا مربوط به tablespace در کدام مسیر قرار بگیرد.
RMAN> connect target "c##usef/a@EsfahanPDB AS SYSBACKUP" connect target * connected to target database: FREE:ESFAHANPDB (DBID=4273248419)
RMAN> RESTORE FOREIGN TABLESPACE tbs1 FORMAT 'tbs1%f.dbf' FROM SERVICE 'TehranPDB' PLUGIN FILE '/dump/tbs1_meta.dmp' PLUGIN DBLINK 'linkMetDataDump';
Starting restore at 13-FEB-24 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=283 device type=DISK Performing export of metadata for specified tablespaces... EXPDP> Starting "SYSBACKUP"."NET_EXP_?d_fjod": EXPDP> Master table "SYSBACKUP"."NET_EXP_?d_fjod" successfully loaded/unloaded EXPDP> ****************************************************************************** EXPDP> Dump file set for SYSBACKUP.NET_EXP_?d_fjod is: EXPDP> /dump/tbs1_meta.dmp EXPDP> ****************************************************************************** EXPDP> Datafiles required for transportable tablespace TBS1: EXPDP> /opt/oracle/oradata/FREE/1147EA9E8D360F5CE0630100007F17F4/datafile/o1_mf_tbs1_lwq bmrl1_.dbf EXPDP> /opt/oracle/oradata/FREE/1147EA9E8D360F5CE0630100007F17F4/datafile/o1_mf_tbs1_lwq bn2x5_.dbf EXPDP> /opt/oracle/oradata/FREE/1147EA9E8D360F5CE0630100007F17F4/datafile/o1_mf_tbs1_lwq bn8fm_.dbf EXPDP> Job "SYSBACKUP"."NET_EXP_?d_fjod" successfully completed at Tue Feb 13 19:15:41 2024 elapsed 0 00:00:17 Export completed channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: using network backup set from service TehranPDB channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring foreign file 26 to /opt/oracle/product/23c/dbhomeFree/dbs/tbs126.dbf channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: using network backup set from service TehranPDB channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring foreign file 27 to /opt/oracle/product/23c/dbhomeFree/dbs/tbs127.dbf channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: using network backup set from service TehranPDB channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring foreign file 28 to /opt/oracle/product/23c/dbhomeFree/dbs/tbs128.dbf channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 Performing import of metadata... IMPDP> Master table "SYSBACKUP"."TSPITR_IMP_FREE_DydF" successfully loaded/unloaded IMPDP> Starting "SYSBACKUP"."TSPITR_IMP_FREE_DydF": IMPDP> Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK IMPDP> Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK IMPDP> Job "SYSBACKUP"."TSPITR_IMP_FREE_DydF" successfully completed at Tue Feb 13 19:15:57 2024 elapsed 0 00:00:05 Import completed Finished restore at 13-FEB-24
با اجرای دستور فوق، tablespace جدیدی به نام tbs1 در دیتابیس esfahanPDB ایجاد می شود:
SQL> alter session set container=esfahanpdb; Session altered. SQL> select TABLESPACE_NAME,STATUS from dba_tablespaces where TABLESPACE_NAME='TBS1'; TABLESPACE_NAME STATUS ------------------------------ --------- TBS1 READ ONLY
در پایان این tablespace را در هر دو دیتابیس در حالت READ WRITE قرار می دهیم:
SQL> alter tablespace TBS1 READ WRITE; Tablespace altered.