Günümüzün trend konularından biri bulut... Nasıl geçerim, nasıl çalışır, ne gibi problemler çıkar, neye dikkat etmem lâzım? Çekincelerimize bağlı olarak soruları çoğaltabiliriz. Yabancı bir ortamın yarattığı tedirginliği anlıyorum. Fakat söz konusu Oracle Cloud olunca, pek bir yabancılık çekmiyorsunuz.
Mesai bitti, akşam eve geldim. Lokalde bir veritabanı oluşturdum. Dosyaları kopyaladım ve sadece tek bir komutla, veritabanımı buluta taşıdım. Yaptığım iş bununla da sınırlı değildi. Buluta geçerken, Single Instance çalışan veritabanını, RAC olacak şekle getirdim. Kopyalamayı ve 27 aylık oğlumun bilgisayar kullanmak için benimle kavga etmesini saymazsak, bütün süreç birkaç dakikayı geçmedi. Bulut ortamındaki iki node'lu RAC sistemi kurmam ise, bir saat civarında bir zaman aldı.
Veritabanı yönetmemişseniz, bu rakamlar fazla bir şey ifade etmeyebilir. Fikir vermesi açısından şunu söyleyebilirim: Haftalar sürecek bir operasyonu, bir saat gibi kısa bir zamana sığdırmaktan bahsediyoruz. Bu dramatik azalmayı iki şeye borçluyuz. Birincisi, 12c veritabanıyla birlikte 'Multitenant' adında yeni bir mimariyle tanıştık. Bu opsiyon, bizi daha esnek hâle getirmekle kalmadı, rutin işlerimizi de inanılmaz ölçüde kolaylaştırdı. (Konuyla ilgili daha fazla bilgi için 12c DÖNEMİ veritabanı dünyasına neler vaat ediyor? isimli yazıma bakabilirsiniz.) İkinci önemli konu ise, Oracle'ın bulut yaklaşımıyla ilgili. Tamamen bulutta, tamamen kendi veri merkezinizde veya hibrid (karma) bir yapıda olabilirsiniz. Hangi ortamı, nasıl kullanıyor olursanız olun, aynı tecrübe ve bilgi birikimleriniz geçerlidir. Yeni zorluklar ve sorunlarla boğuşmanız gerekmez.
Şimdi bu işi nasıl yapacağımıza gelelim. Testim için, lokaldeki sunucumda yeni bir veritabanı oluşturacağım. Bu veritabanı içinde, yeni bir tablespace, yeni bir kullanıcı ve son olarak DUMMY_TABLE isimli bir tablo yaratacağım.
-- CDB1 ISIMLI CONTTAINER ALTINDA DUMMYDB ISIMLI -- PLUGGABLE VERITABANI OLUSTURULUR CDB1:SQL> create pluggable database DUMMYDB admin user dummy_admin identified by welcome1 roles = (DBA) FILE_NAME_CONVERT=('/u02/app/oracle/oradata/CDBA/pdbseed/', '/media/SharedFS/DUMMYDB/'); -- Pluggable database created. CDB1:SQL> SHOW PDBS CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDB MOUNTED 4 DUMMYDB MOUNTED -- VERITABANINI ACIP, ICINDE YENI BIR TABLESPACE TANIMLIYORUZ CDB1:SQL> alter pluggable database DUMMYDB open read write; CDB1:SQL> alter session set container=DUMMYDB; CDB1:DUMMYDB:SQL> CREATE TABLESPACE TBS_01 DATAFILE '/media/SharedFS/DUMMYDB/tbs_01.dbf' SIZE 5M AUTOEXTEND ON NEXT 1M MAXSIZE 10G; -- DATAFILE'LAR KONTROL EDILIYOR CDB1:DUMMYDB:SQL> select name from v$datafile; NAME ------------------------------------------ /u02/app/oracle/oradata/CDBA/undotbs01.dbf /media/SharedFS/DUMMYDB/system01.dbf /media/SharedFS/DUMMYDB/sysaux01.dbf /media/SharedFS/DUMMYDB/tbs_01.dbf -- DUMMYDB ALTINDA LOKAL BIR KULLANICI OLUSTURUYORUZ CDB1:DUMMYDB:SQL> CREATE USER RQUSER IDENTIFIED BY WELCOME1; GRANT RESOURCE TO RQUSER; ALTER USER rquser QUOTA UNLIMITED ON TBS_01; -- RQUSER ALTINDA BIR TABLO OLUSTURUP, SORGULUYORUZ CDB1:DUMMYDB:SQL> CREATE TABLE RQUSER.DUMMY_TABLE TABLESPACE TBS_01 AS SELECT * FROM DBA_OBJECTS; CDB:DUMMYDB:SQL> SELECT COUNT(*) FROM RQUSER.DUMMY_TABLE; COUNT(*) ---------- 90936
12c ile birlikte gelen Multitenant mimarinin, büyük esneklik getirdiğinden bahsetmiştim. Bir container içinden istediğimiz pluggable veritabanını söküp, bir başka container'e bağlayabiliyoruz. Bunun için yaptıklarımızsa, sadece birkaç komuttan ibaret. Sökülecek veritabanını kapatıp, mevcut durumunu bir XML dosyasına aşağıdaki gibi döküyoruz.
-- ONCE KOK (CONTAINER) VERITABANINA DONUYORUZ CDB1:DUMMYDB:SQL> ALTER SESSION SET CONTAINER=CDB$ROOT; CDB1:SQL> alter pluggable database DUMMYDB close immediate; -- XML DOSYASINA PLUGGABLE VERITABANIYLA ILGILI BILGILER AKTARILIYOR CDB1:SQL> alter pluggable database DUMMYDB unplug into '/media/SharedFS/DUMMYDB/dummydb.xml'; -- ISTENIRSE CONTAINER VERITABANINDAN DUMMYDB TANIMINI DA SILINEBILIYOR CDB1:SQL> drop pluggable database DUMMYDB keep datafiles; SQL> SHOW PDBS CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDB MOUNTED
Artık, Oracle bulut ortamına dosya taşımaya hazırız. Maalesef evimde kısıtlı bir network hattım var ve olabildiğince efektif olmam lâzım. Bu yüzden dosyaları sıkıştırıp, kopyalama esnasında da bazı ek parametreler kullanıyorum. (Sıkıştırılmış bir veri setinin tekrar sıkıştırılması pek mümkün olmasa da, denediğime pişman değilim. Internet hattımın limitlerine yakın bir hızda yükleme gerçekleşti.)
# PLUGGABLE VERITABANINA AIT DOSYALARIN OLDUGU KLASORU SIKITIRALIM $ zip -r DUMMYDB.zip DUMMYDB $ ls -lh DUMMYDB.zip -- -rw-rw-r-- 1 ccebi ccebi 144M Mar 24 18:40 DUMMYDB.zip # DOSYA PAKETINI SSH PROTOKOLU UZERINDEN TRANSFER EDELIM scp -i mykey -c arcfour -o Compression=yes -o \ CompressionLevel=6 DUMMYDB.zip \ oracle@XXX.XXX.XXX.XXX:/u04/TEST -- DUMMYDB.zip 100% 143MB 83.0KB/s 29:28
Veritabanımıza ait dosyalar, bulut üzerinde çalışan RAC sistemimize taşındı. Taşınan dosyaları açıp, CDBA adındaki veritabanına bağlayacağız. Dosya sistemi olarak, aşağıda da göreceğiniz gibi ACFS kullanılıyor.
[oracle@racdb1 TEST]$ unzip DUMMYDB.zip Archive: DUMMYDB.zip creating: DUMMYDB/ inflating: DUMMYDB/system01.dbf inflating: DUMMYDB/dummydb.xml inflating: DUMMYDB/tbs_01.dbf inflating: DUMMYDB/sysaux01.dbf [oracle@racdb1 ~]$ df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/xvdb3 ext4 16G 5,3G 9,6G 36% / tmpfs tmpfs 7,3G 629M 6,7G 9% /dev/shm /dev/xvdb1 ext4 477M 157M 291M 36% /boot /dev/xvdc1 ext4 69G 20G 46G 31% /u01 /dev/asm/data-492 acfs 15G 5,8G 9,3G 39% /u02 /dev/asm/fra-360 acfs 11G 1,4G 9,7G 12% /u03 /dev/asm/redo-324 acfs 19G 8,4G 11G 44% /u04
Transfer ettiğimiz dosyaları kullanıp, tek bir komutla pluggable veritabanını ayağa kaldıracağız. Fakat herhangi bir uyumsuzluk var mı, dikkat edilmesi gereken bir durum olur mu diye önceden bu süreci test etmeliyiz. Bunun için de aşağıdaki komutu kullanıyoruz.
set serveroutput on DECLARE compatible BOOLEAN := true; BEGIN compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY( pdb_descr_file => '/u04/TEST/DUMMYDB/dummydb.xml'); if compatible then DBMS_OUTPUT.PUT_LINE('Is pluggable DUMMYDB compatible? YES'); else DBMS_OUTPUT.PUT_LINE('Is pluggable DUMMYDB compatible? NO'); end if; END; / Is pluggable DUMMYDB compatible? YES
PL/SQL bloğuna göre bir sorun çıkmayacak. Yine de aşağıdaki sorguyu çalıştırıp, kontrol etmek doğru olur.
set lines 220 pages 50 trim on; column time format a19 column name format a5 column cause format a12 column type format a9 column line format 99 column message format a48 column status format a10 justify right column action format a29 select line, to_char(time,'DD.MM.YYYY HH24:MI:SS') AS TIME, name, cause, type, message, lpad(status,10) as status, action from PDB_PLUG_IN_VIOLATIONS order by line, time; LINE TIME NAME CAUSE TYPE MESSAGE STATUS ACTION ---- ------------------- ----- ------------ --------- ------------------------------------------------ ---------- ----------------------------- 1 24.03.2016 19:30:05 DUMMY OPTION WARNING Database option RAC mismatch: PDB installed vers PENDING Fix the database option in th DB ion NULL. CDB installed version 12.1.0.2.0. e PDB or the CDB 1 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter processes mismatch: Previous 300 C PENDING Please check the parameter in DB urrent 400 the current CDB 2 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter sga_max_size mismatch: Previous 2G PENDING Please check the parameter in DB Current 6G the current CDB 3 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter sga_target mismatch: Previous 2G C PENDING Please check the parameter in DB urrent 6G the current CDB 4 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter compatible mismatch: Previous '12. PENDING Please check the parameter in DB 1.0.2.0' Current '12.1.0.2' the current CDB 5 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter archive_lag_target mismatch: Previ PENDING Please check the parameter in DB ous 1800 Current 0 the current CDB 6 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter inmemory_size mismatch: Previous 2 PENDING Please check the parameter in DB 56M Current 1536M the current CDB 7 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter open_cursors mismatch: Previous 30 PENDING Please check the parameter in DB 0 Current 1000 the current CDB 8 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter parallel_degree_policy mismatch: P PENDING Please check the parameter in DB revious 'AUTO' Current 'MANUAL' the current CDB 9 24.03.2016 19:30:05 DUMMY Parameter WARNING CDB parameter pga_aggregate_target mismatch: Pre PENDING Please check the parameter in DB vious 390M Current 3840M the current CDB
Uyarı gelen konulara baktığımızda, bir sıkıntı olmayacağını söyleyebilirim. Artık Pluggable veritabanını yeni yuvasına bağlayabiliriz. Yapılacak işlem, aşağıda gördüğünüz tek bir komuttan ibaret. Fakat daha iyi anlatmak niyetiyle bu komutu biraz detaylandırdım. Buradaki parametrelere birer birer değinirsek:
CDBA:SQL> CREATE PLUGGABLE DATABASE CLOUDDB using '/u04/TEST/DUMMYDB/dummydb.xml' MOVE SOURCE_FILE_NAME_CONVERT=('/media/SharedFS/DUMMYDB/','/u04/TEST/DUMMYDB/') FILE_NAME_CONVERT=('/u04/TEST/DUMMYDB/','/u02/app/oracle/oradata/DUMMYDB/'); CDBA:SQL> alter pluggable database CLOUDDB open instances=ALL; CDBA:SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDB READ WRITE NO 4 CLOUDDB READ WRITE NO -- VERITABANI ICINE GIRIP, DUMMY TABLOYU SORGULUYORUZ CDBA:SQL> alter session set container=CLOUDDB; CDBA:SQL> select count(*) from RQUSER.DUMMY_TABLE; COUNT(*) ---------- 90936
Girdiğimiz tek komutla, veritabanımızı, yeni container'a bağladık. Aynı zamanda, single instance'dan 'cluster' yapıya da geçmiş olduk. Hazır yeri gelmişken, RAC ortamda pluggable veritabanı nasıl yönetilir, onunla ilgili birkaç komut da paylaşayım.
-- BUTUN INSTANCE'LAR UZERINDE CLOUDDB VERITABANI KAPATILIYOR CDBA:SQL> alter pluggable database CLOUDDB CLOSE IMMEDIATE instances=ALL; -- SADECE cdba1 INSTANCE'I UZERINDE PLUGGABLE DATABASE ACILIYOR CDBA:SQL> alter pluggable database CLOUDDB open instances=('cdba1'); CDBA:SQL> select inst_id, con_id, name, open_mode from gv$pdbs where con_id=4 ORDER BY 1; INST_ID CON_ID NAME OPEN_MODE ---------- ---------- ------------------------------ ---------- 1 4 CLOUDDB READ WRITE 2 4 CLOUDDB MOUNTED CDBA:SQL> alter pluggable database CLOUDDB open instances=('cdba2'); Pluggable database altered. CDBA:SQL> select inst_id, con_id, name, open_mode from gv$pdbs where con_id=4 ORDER BY 1; INST_ID CON_ID NAME OPEN_MODE ---------- ---------- ------------------------------ ---------- 1 4 CLOUDDB READ WRITE 2 4 CLOUDDB READ WRITE -- RAC UZERINDE BIR IKI EK KOMUT CDBA:SQL> alter pluggable database CLOUDDB open instances=('cdba2'); CDBA:SQL> ALTER PLUGGABLE DATABASE CLOUDDB close immediate instances=ALL EXCEPT('cdba1'); CDBA:SQL> ALTER PLUGGABLE DATABASE CLOUDDB open read write instances=ALL;
Çalışmayı tamamlayınca, aşağıdaki gibi CLOUDDB veritabanını kaldırabiliriz.
SQL> ALTER PLUGGABLE DATABASE CLOUDDB close immediate instances=ALL; SQL> drop pluggable database CLOUDDB including datafiles; SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 MYPDB READ WRITE NO
Oracle Public Cloud (DBaaS) üzerinde, pluggable database müthiş bir esneklik sağlıyor. Taşıma, geri dönme veya bulut üzerinde karma çalışma... bunların hepsi mümkün. En güzel yanı da, ek bir öğrenme maliyeti gerektirmemesi. Şayet 12c'yi biraz kurcaladıysanız, Oracle Public Cloud kullanımına hazırsınız demektir!