یکی از قابلیتهای جدید نسخه 12cR2، جابجایی(relocate) انلاین pdb از یک cdb به cdb دیگر می باشد. این کار مشابه ویژگی pdb hot clone می باشد که قبلا در مورد ان مطلبی ارائه شد(ایجاد انلاین pdb به صورت از راه دور)، با این تفاوت که در ویژگی pdb relocate، بعد از انجام عملیات کپی، pdb از بانک مبدا حذف خواهد شد و امکان باز بودن این pdb در هر دو cdb، ان هم در یک زمان وجود نخواهد داشت.
البته؛ همانطور که می دانید؛ روش دیگری هم برای جابجایی یک pdb به cdb دیگر وجود دارد که از طریق plug/uplug کردن ان pdb امکان پذیر خواهد شد ولی روش plug/unplug معایبی را به همراه دارد که یکی از این معایب، از دسترس خارج شدن سرویس هر چند برای مدت زمان کوتاه می باشد در صورتی که ویژگی relocate pdb، این ایراد را برطرف خواهد کرد و بدون هرگونه downtimeای، جابجایی را امکان پذیر خواهد کرد.
در ادامه بعد از طی چند مرحله، pdbsource را از cdb1 به cdb2 منتقل می کنیم.
مرحله اول: در ابتدا وضیعت cdb1 را به لحاظ archivelog mode بررسی می کنیم و بعد از ان، common userای را برای اتصال از راه دور(از طریق cdb2) ایجاد می کنیم و مجوز لازم را به این user، اهدا می کنیم:
*. برای استفاده از قابلیت relocate pdb باید هر دو بانک در حالت archivelog قرار داشته باشند و همچنین Local Undo هم فعال شده باشد.
–cdb1
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDBSOURCE READ WRITE NO
SQL> SELECT log_mode FROM v$database;
LOG_MODE
————
ARCHIVELOG
SQL> SELECT property_name, property_value FROM database_properties
WHERE property_name=’LOCAL_UNDO_ENABLED’;
PROPERTY_NAME PROPERTY_VALUE
——————– ——————–
LOCAL_UNDO_ENABLED TRUE
SQL> select c.con_id, c.name con_name, t.tablespace_name, t.contents, t.status from v$containers c, cdb_tablespaces t where c.con_id=t.con_id and t.tablespace_name like ‘%UNDO%’
CON_ID CON_NAME TABLESPACE CONTENTS STATUS
———- ————— ———- ———- ———
1 CDB$ROOT UNDOTBS1 UNDO ONLINE
3 PDBSOURCE UNDOTBS1 UNDO ONLINE
SQL> create user c##usef identified by a;
User created.
SQL> GRANT DBA, SYSOPER, CREATE PLUGGABLE DATABASE TO c##usef CONTAINER=ALL;
Grant succeeded.
مرحله دوم: در این مرحله، database linkای را برای اتصال به cdb1 در cdb2 ایجاد می کنیم:
-تنظیم فایل tnsnames.ora:
[oracle@cdb2 ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora
cdb1=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cdb1_host)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(sid=cdb1)
)
)
-ایجاد database link:
–cdb2
SQL> create public database link linkcdb1 connect to c##usef identified by a using ‘cdb1’;
Database link created.
-تست dblink:
–cdb2
SQL> select sysdate from dual@linkcdb1;
SYSDATE
———
26-JUN-18
مرحله سوم: بعد از ایجاد database link، قصد داریم عملیات relocate را استارت بزنیم منتها قبل از انجام عمل جابجایی، تراکنشی را در cdb1 اجرا کرده و در حالت انتظار قرار می دهیم تا بعد از جابجایی، سرنوشت ان را بررسی کنیم:
–cdb1
SQL> alter session set container=PDBSOURCE;
Session altered.
SQL> create table tbl(name varchar2(9));
Table created.
SQL> insert into tbl values(‘USEF’);
1 row created.
دقت کنید که دستور درج، بدون هرگونه commit یا rollbackای رها شده است.
با دستور زیر در cdb2، جابجایی را انجام می دهیم:
–cdb2
SQL> CREATE PLUGGABLE DATABASE PDBSOURCE FROM PDBSOURCE@linkcdb1 RELOCATE;
Pluggable database created.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDBSOURCE MOUNTED
4 PCDB2 MOUNTED
بعد از ایجاد این pdb در cdb2، تغییرات را ثبت می کنیم:
–cdb1
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
3 PDBSOURCE READ WRITE NO
SQL> commit;
Commit complete.
در مرحله بعد، وضیعت این رکورد را در cdb2 مشاهده خواهیم کرد.
مرحله چهارم: قرار دادن pdb در حالت open و حذف خودکار این pdb در cdb2:
–cdb2
SQL> alter pluggable database PDBSOURCE open;
Pluggable database altered.
–cdb1(alert log)
2018-06-26T13:03:18.777140+04:30
PDBSOURCE(3):Process termination requested for pid 19566 [source = rdbms], [info = 2] [request issued by pid: 20638, uid: 502]
2018-06-26T13:03:18.826842+04:30
PDBSOURCE(3):KILL SESSION for sid=(133, 35712):
PDBSOURCE(3): Reason = PDB close immediate
PDBSOURCE(3): Mode = KILL HARD FORCE -/-/-
PDBSOURCE(3): Requestor = USER (orapid = 77, ospid = 20638, inst = 1)
PDBSOURCE(3): Owner = Process: USER (orapid = 67, ospid = 19566)
PDBSOURCE(3): Result = ORA-0
2018-06-26T13:03:19.827895+04:30
Pluggable database PDBSOURCE closed
PDBSOURCE(3):JIT: pid 20638 requesting stop
PDBSOURCE(3):Buffer Cache flush started: 3
PDBSOURCE(3):Buffer Cache flush finished: 3
2018-06-26T13:03:20.441008+04:30
PDBSOURCE(3):While transitioning the pdb 3 to clean state, clearing all its abort bits in the control file.
Pluggable database PDBSOURCE closed
2018-06-26T13:03:21.775715+04:30
Deleted Oracle managed file /u01/18c_oradata/CDB1/6F875C60DB4A469EE0530488200A1465/datafile/o1_mf_temp_fm3vbp23_.dbf
Deleted Oracle managed file /u01/18c_oradata/CDB1/6F875C60DB4A469EE0530488200A1465/datafile/o1_mf_undotbs1_fm3vbp22_.dbf
Deleted Oracle managed file /u01/18c_oradata/CDB1/6F875C60DB4A469EE0530488200A1465/datafile/o1_mf_sysaux_fm3vbp21_.dbf
Deleted Oracle managed file /u01/18c_oradata/CDB1/6F875C60DB4A469EE0530488200A1465/datafile/o1_mf_system_fm3vbp20_.dbf
با مشاهده وضیعت pdbها در cdb1، خواهیم دید که خبری از pdbsource در این cdb نمی باشد:
–cdb1
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
———- —————————— ———- ———-
2 PDB$SEED READ ONLY NO
همچنین، رکوردی که بعد از جابجایی، commit شده بود، به cdb2 منتقل شده است:
–cdb2
SQL> alter session set container=PDBSOURCE;
Session altered.
SQL> select * from tbl;
NAME
———
USEF