Oracle

24 Mart 2016

Oracle Public Cloud'a Geçiş

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!


Çağatay ÇEBİ