LOGICAL STANDBY DATABASE (DATA GUARD)

Daha önce Physical Standby Veritabanı ile ilgili örnekler yapmıştık, şimdi ise Logical Standby Veritabanı üzerinde örnekler yapmaya çalışacağız. Logical Standby veritabanı SQL APPLY yönetim ile çalışıyor, physical standby ise REDO APPLY yöntemi ile çalışıyordu. Yani primary tarafta yapılan her işlem için oluşan redo kayıtları, standby tarafında redo olarak işlenmeyece, sql haline çevrilecek ve sql apply işlemi yapılırarak primary ile standby eşitlemesi sağlanacaktır. Genellikle raporlama işlemleri için standby veritabanı kullanılmak istenirse logical standby tercih edilir.

Logical standby veritabanı read-write modda açılabilsede Data Guard tarafından işlennen tablolar read-only durumdadır. Logical standby tarafındaki tablolar üzerinde index ve materialized view oluşturulabilmektedir. Bu durum raporlama işlemleri için kullanışlı bir ortam sağlamaktadır.

Logical standby veritabanı ile primary veritabanı birebir aynı değildir. Oysa Physical standby kullanırken primary ile standby n bire bir aynı olduğunu söylemiştik. Aynı zamanda logical standby kullanıyor isek bazı veri türleri desteklemiyor, bunlar

  • BFILE
  • ROWIDUROWID
  • Collections (including VARRAYs and nested tables)
  • Objects with nested tables and REFs
  • Aşağıdaki Spatial Türleri Desteklemez:
    • MDSYS.SDO_GEORASTER
    • MDSYS.SDO_TOPO_GEOMETRY
  • User-Identity data types

Primary veritabanımızda aşağıdaki sorguyu çalıştırarak logical standby için desteklenmeyen tablomuz var mı ? Bakabiliriz.

SQL> select distinct owner, table_name from dba_logstdby_unsupported;

no rows selected

Bizim veritabanımız da desteklenmeyen bir tablo yok.

Primary veritabanında Tabloların satırlarının unique olarak tanımlanabileceğinden emin olalım, eğer bu durumun sağlanmadığı bir tablomuz var ise ya primary key oluşturalım veya RELY kısıtlaması koyalım.

SQL> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE;
OWNER                          TABLE_NAME
------------------------------ ------------------------------
ERPUSER                          EMPLOYEE_SALARY

SQL> ALTER TABLE EMPLOYEE_SALARY ADD PRIMARY KEY (EMPLOYEE_ID) RELY DISABLE;

Logical standby bir veritabanı oluşturabilmek için öncelikle physical standby oluşturmalıyız, sonra bu physical standby veritabanını logical standby veritabanına dönüştürmemiz gerekmektedir. Physical standby veritabanımız mevcut şimdi onu logical standby olarak ayarlayalım;

Physical Standby tarafında Redo Apply işlemini durduralım

SQL> alter database recover managed standby database cancel;

Database altered.

Primary veritabanımızı Logical standby desteklemesi için primary tarafında aşağıdaki paketi çalıştıralım

SQL> EXECUTE DBMS_LOGSTDBY.BUILD;

PL/SQL procedure successfully completed.

Yine primary veritabanımızda log miner oluşturacak aşaıdaki komutu çalıştıralım, bu komutu hem primary hem de standby tarafında çalıştırıalım.

SQL> alter database add supplemental log data (primary key, unique index) columns;

Şimdi Physical Standby Veritabanımızı kapatalım sonra mount modda tekrar açalım.

SQL> shu immediate;

SQL> startup mount;

Standby Veritabanımızı Logical Standby durumuna set edelim. DB_NAME parametresini değiştirecek ve yeni bir DBID oluşturacak komutu vereceğiz. Bizim için standby ismimiz RACDBSTB idi. Eğer Spfile ve ASM kullanıyorsak bu işlemleri aşağıdaki komut otomatik gerçekleştirecektir. Ancak pfie kullanıyorsak gidip pfile dan ilgili parametreleri değiştirmemiz gerek.

SQL> alter database recover to logical standby racdbstb;

Database altered.

Şimdi veritabanımız bir encarnasyon noktası oluşturarak açalım.

SQL> ALTER DATABASE OPEN RESETLOGS;
SQL> show parameter db_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      RACDBSTB

Logical Standby Veritabanı disk disizn yapısı primary tarafından farklı ise, yeni data file eklendiğinde hata alma durumu oluşabilir, bunun önünce geçmek için DDL komutlarının logical standby tarafında çalışmasını engelleyebiliriz.

SQL> execute_dbms_logstby.skip('ALTER TABLESPACE');

Her şey yolunda gittiyse artık SQL Apply işlemini başlatabiliriz.

SQL> alter database start logical standby apply immediate;

Database altered.

SQL> ALTER SESSION SET NLS_DATE_FORMAT  = 'DD-MON-YY HH24:MI:SS';

Session altered.

SQL> COLUMN STATUS FORMAT A60
SQL> SELECT EVENT_TIME, STATUS, EVENT FROM DBA_LOGSTDBY_EVENTS ORDER BY EVENT_TIMESTAMP, COMMIT_SCN, CURRENT_SCN;

EVENT_TIME         STATUS
------------------ ------------------------------------------------------------
EVENT
--------------------------------------------------------------------------------
18-JAN-21 13:11:52 ORA-16237: SGA specified for Logical Standby is too small


18-JAN-21 13:11:52 ORA-16222: automatic Logical Standby retry of last action


18-JAN-21 13:11:52 ORA-16237: SGA specified for Logical Standby is too small

SGA ve PGA set edilmemiş durumda, hesaplamalarımız yapıp set edip tekrar açalım veritabanını.

SQL> SELECT EVENT_TIME, STATUS, EVENT FROM DBA_LOGSTDBY_EVENTS ORDER BY EVENT_TIMESTAMP, COMMIT_SCN, CURRENT_SCN;

EVENT_TIME         STATUS
------------------ -------------------------------------------
EVENT
-----------------------------------------------------------------------
18-JAN-21 13:11:52 ORA-16237: SGA specified for Logical Standby is too small


18-JAN-21 13:11:52 ORA-16222: automatic Logical Standby retry of last action


18-JAN-21 13:11:52 ORA-16237: SGA specified for Logical Standby is too small



EVENT_TIME         STATUS
------------------ ---------------------------------------------------
EVENT
----------------------------------------------------------------------
18-JAN-21 13:31:47 ORA-16128: User initiated stop apply successfully completed


18-JAN-21 13:36:50 ORA-16111: log mining and apply setting up


18-JAN-21 13:36:50 Apply LWM 1868219, HWM 1868219, SCN 1871354

Test edelim primary tarafta FRKDBA schemasında TEST_LGSTB adında bir tablo oluşturup içerisine bir satır veri ekleyip commit edelim.

SQL> show user;
USER is "FRKDBA"
SQL> create table TEST_LGSTB
  2  (id number primary key,
  3  adi varchar2(64),
  4  bolum number
  5  );

Table created.

SQL> insert into TEST_LGSTB values
  2  (1,'FARUK',2);

1 row created.

SQL> commit;

Commit complete.

SQL>

Şimdi standby tarafına yaptığımız değişiklikler anlık gidiyor mu? Sorgulayalım.

SQL> select * from FRKDBA.TEST_LGSTB;

        ID ADI
---------- ----------------------------------------------------------------
     BOLUM
----------
         1 FARUK
         2

Evet başarılı görünüyor.

Şimdi primary tarafında KAMIL isminde bir satır ekleyelim veritabanına ve primary tarafında sorgulayalım tekrar

SQL> select * from FRKDBA.TEST_LGSTB;

        ID ADI
---------- ----------------------------------------------------------------
     BOLUM
----------
         2 KAMIL
         2

         1 FARUK
         2

Kamil’de geldi :))