
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
ROWID
,UROWID
- Collections (including
VARRAY
s and nested tables) - Objects with nested tables and
REF
s - 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 :))
Bir yanıt yazın