Aslında başlık pluggable olarak create edilmiş olan database’ leri unpluggable hale getirmek ve sonrasında farklı bir container altına (ki bu aynı container de olabilir) tekrar pluggable olarak taşımak olmalıydı ama o zaman da başlık olmaktan da çıkardı herhalde 🙂
Çalışmış olduğunuz kurumda oracle instance sayınız fazla ise ve 12c kullanıyorsanız (henüz 12c upgrade’ lerinin tamamlandığını düşünmemekle beraber en azından yakın bir gelecekde bu bahsetmiş olduğum durum oluşmuş olacak) konsolide etmiş olduğunuz kimi database’ lerinizi farklı container db’ ler altına taşımanız gerekeceği durumlar oluşacaktır. Bu tarz durumda bu işlemi nasıl yapabiliriz onu test ediyor olacağız.
Testimiz için iki tane container db oluşturdum; T1 container db içerisinde 2 tane pluggable database var. T2 ise container db ama içerisinde herhangi bir pluggable db bulunmamakta, şimdi T1 altındaki pluggable database’ lerimizi farklı yöntemler ile T2 altına taşımaya çalışalım ;
T1 altındaki database’ lerimize bakalım;
1 2 3 4 5 6 7 |
SQL> SELECT name, open_mode from v$pdbs ; NAME OPEN_MODE ------------------------------ ---------- PDB$SEED READ ONLY PDBT11 READ WRITE PDBT12 READ WRITE |
Pdbt11 pluggable database ile başlayalım. Öncelikle database’ i kapatıyoruz ;
1 2 |
SQL> alter pluggable database pdbt11 close immediate; Pluggable database altered. |
Database’ i unplug hale getirip drop ediyoruz;
1 2 3 4 5 |
SQL> alter pluggable database pdbt11 unplug into '/u01/sq/ora_3/oracle/pdbt11.xml'; Pluggable database altered. SQL> drop pluggable database pdbt11 keep datafiles; Pluggable database dropped. |
Pluggable database’ leri select ettiğimiz de artık pdbt11’ i görmememiz gerekiyor. Pluggable database’ i drop ederken bir kritik nokta keep datafiles parametresidir. Mevcut datafile’ leri taşıyacağımız container içerisinde database’ i taşırken kullanacağımız için keep datafiles parametresi ile drop ediyor olmamız gerekiyor.
Şimdi yeni container db’ ye eklemeden önce compatible parametresini check ederek ekleyebilmemizin önünde bir engel olup olmadığını check edebiliriz ;
Yeni container database’ imize connect oluyoruz ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[oracle@redhat70 ~]$ export ORACLE_SID=t2 [oracle@redhat70 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Mon Jun 22 13:23:31 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, OLAP, Advanced Analytics and Real Application Testing options SQL> set serveroutput on SQL> DECLARE 2 compatible BOOLEAN := FALSE; 3 BEGIN 4 compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY( 5 pdb_descr_file => '/u01/sq/ora_3/oracle/pdbt11.xml'); 6 if compatible then 7 DBMS_OUTPUT.PUT_LINE('Is pluggable PDBT11 compatible? YES'); 8 else DBMS_OUTPUT.PUT_LINE('Is pluggable PDBT11 compatible? NO'); 9 end if; 10 END; 11 / Is pluggable PDBT11 compatible? YES PL/SQL procedure successfully completed. SQL> |
Yeni container database’ ine taşımamız için engel bir durum yok. Bundan sonraki süreçde pluggable database’ i eklerken 3 farklı methotdan birini seçebiliriz ;
• Nocopy option
• Copy option,
• As clone move option
• NOCOPY Option ;
Nocopy opsiyonu ile taşıma yaptığımız da source datafile’ leri orjinal lokasyonlarında kalacak şekilde kullanılmaya devam edilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
SQL> create pluggable database t2_plug_nocopy using '/u01/sq/ora_3/oracle/pdbt11.xml' 2 NOCOPY 3 TEMPFILE REUSE; Pluggable database created. SQL> col pdb_name format a15; SQL> col status format a20; SQL> select pdb_name, status from cdb_pdbs where pdb_name='T2_PLUG_NOCOPY'; PDB_NAME STATUS --------------- -------------------- T2_PLUG_NOCOPY NEW SQL> select open_mode from v$pdbs where name='T2_PLUG_NOCOPY'; OPEN_MODE ---------- MOUNTED |
Pluggable database’ imizi yeni container db üzerinde açıyoruz;
1 2 |
SQL> alter pluggable database T2_PLUG_NOCOPY open read write ; Pluggable database altered. |
• Copy option
Bu opsiyon ile orjinal datafile’ lerin bir kopyası alınarak belirtmiş olduğumuz yeni lokasyona copy edilir ve bundan sonrasında da bu lokasyonlardaki datafile’ ler kullanılmaya devam edilecektir.
İlk olarak burda da database’ i kapatmakla başlıyoruz ;
1 2 |
SQL> alter pluggable database pdbt12 close immediate; Pluggable database altered. |
Unplug ediyoruz;
1 2 |
SQL> alter pluggable database pdbt12 unplug into '/u01/sq/ora_3/oracle/pdbt12.xml'; Pluggable database altered. |
Drop ediyoruz;
1 2 |
SQL> drop pluggable database pdbt12 keep datafiles; Pluggable database dropped. |
Yeni container db üzerinde create edelim ;
Taşıma önce compatible açısından bir problem olup olmadığını check edelim ;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SQL> DECLARE 2 compatible BOOLEAN := FALSE; 3 BEGIN 4 compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY( 5 pdb_descr_file => '/u01/sq/ora_3/oracle/pdbt12.xml'); 6 if compatible then 7 DBMS_OUTPUT.PUT_LINE('Is pluggable PDBT11 compatible? YES'); 8 else DBMS_OUTPUT.PUT_LINE('Is pluggable PDBT11 compatible? NO'); 9 end if; 10 END; 11 / Is pluggable PDBT11 compatible? YES PL/SQL procedure successfully completed. |
Copy opsiyonu ile yeni container üzerinde create edelim ;
1 2 3 4 |
SQL> create pluggable database pdb_plug_copy using '/u01/sq/ora_3/oracle/pdbt12.xml' 2 COPY 3 FILE_NAME_CONVERT=('/u02/oradata/t1/dbf/t1','/u03/oradata/t2/T2_PLUG_COPY'); Pluggable database created. |
Kontrollerimizi yapalım ;
1 2 3 4 5 6 7 8 9 10 |
SQL> select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_COPY'; PDB_NAME STATUS --------------- -------------------- PDB_PLUG_COPY NEW SQL> select open_mode from v$pdbs where name='PDB_PLUG_COPY'; OPEN_MODE ---------- MOUNTED |
Mounted modda ki pluggable database’ i açalım ;
1 2 |
SQL> alter pluggable database PDB_PLUG_COPY open read write ; Pluggable database altered. |
• As clone move option
Bu opsiyon ilede aynı datafile’ leri kullanarak ikinci bir database oluşturmak için bu opsiyonu kullanabiliriz ;
1 2 |
SQL> create pluggable database t2_as_clone AS CLONE using '/u01/sq/ora_3/oracle/pdbt12.xml' MOVE FILE_NAME_CONVERT=('/u02/oradata/t1/dbf/t1','/u03/oradata/t2/dbf/t2_as_clone'); Pluggable database created. |
Kontrollerimizi yapalım ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SQL> col pdb_name format a15; SQL> col status format a20; SQL> select pdb_name, status from cdb_pdbs where pdb_name='T2_AS_CLONE'; PDB_NAME STATUS --------------- -------------------- T2_AS_CLONE NEW SQL> select open_mode from v$pdbs where name='T2_AS_CLONE'; OPEN_MODE ---------- MOUNTED SQL> alter pluggable database T2_AS_CLONE open read write; Pluggable database altered. |
Bu işlemleri yapabilmek için must olan bir takım kriterler bulunmaktadır. Bunlardan bir tanesi source ile target ortam aynı endian formata sahip olmalıdır. İkinci olarak yine source ve target database ‘lerinde aynı database opsiyonların kurulu olması gerekmektedir.
Böylelikle 3 opsiyon ile pluggable database’ lerimizi nasıl unplug edebileceğimizden ve nasıl farklı bir container db üzerine taşıyabileceğimiz den bahsetmiş olduk.