Tuesday, December 3, 2013

Developer Erişim Durumlarında 2.Standby Veritabanının Kontrolü

Bu yazıda dataguard yapısında çalışan canlı sisteme developer erişiminin kontrollü bir şekilde verilmesi senaryosu uygulanacak. Bunun için bir 1 aktif ve 1 standby veritabanından oluşan sisteme 2. bir standby eklendiği varsayılıyor.  Aşağıda physical standby - snapshot standby geçişini göreceksiniz ve snapshot standby - physical standby geçişinde 2.standby makinesinin olası rol değişmeme problemiyle karşılaşıp çözümünü göreceğiz. 


Erişimden önce primary sunucu (PRIMARY) , 1.standby veritabınına (SBY) ve 2.standby veritabanına (DEVSBY) arşiv logları ship etmektedir. Normal çalışma zamanında PRIMARY read-write modda, SBY read only erişimde olacak, DEVSBY ise mount modda tutulacak.  Tüm standby makineleri open durumları ne olursa olsun, PHYSICAL STANDBY database rolünde.

DEVSBY makineye erişim durumlarında ise PRIMARY ile senkronize hale getirildikten sonra PHYSICAL STANDBY modundan SNAPSHOT STANDBY moda alınarak read-write şekilde açılacak. İşlemlerden önce PRIMARY üzerinde o anki konfigürasyona bakacak olursak:

PRIMARY :

$ dgmgrl
DGMGRL> connect sys@PRIMARY
..
DGMGRL> show configuration
Configuration - DGKONF
  Protection Mode: MaxPerformance
  Databases:
    PRIMARY - Primary database
    SBY - Physical standby database
    DEVSBY    - Physical standby database

Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
DGMGRL>

DEVSBY :

DEVSBY open duruma getirilir ve current_scn değeri ana makine ile aynı veya yakın olana kadar beklenilir. Makine open moda çekildiğinde alert logdan görüleceği gibi otomatik olarak senkron olmaya çalışacaktır. Eğer alert logda bir hareketlilik yoksa, PRIMARY üzerinde bir log switch tetiklenebilir veya DEVSBY üzerinde manuel senkronize aşağıdaki komutla yapılabilir.

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

DEVSBY şu an read only with apply durumda olması senkron edildiğini gösterir. Current_scn değeri PRIMARY ile yakın olduğunda convertion yapılmalıdır. Datanın eşit olması önemli değilse bu adım geçilebilir.


SQL> select log_mode,open_mode,database_role,current_Scn from v$database;
LOG_MODE     OPEN_MODE           DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY     1634072

Daha sonra ise primary üzerinde convertion aşağıdaki komutla başlatılır.

PRIMARY:

DGMGRL> convert database 'DEVSBY' to SNAPSHOT STANDBY;
Converting database "DEVSBY" to a Snapshot Standby database, please wait...
Database "DEVSBY" converted successfully
DGMGRL> DGMGRL> DGMGRL>

DGMGRL>
DGMGRL> show configuration
Configuration - DGKONF
  Protection Mode: MaxPerformance
  Databases:
    PRIMARY - Primary database
    SBY - Physical standby database
    DEVSBY    - Snapshot standby database

Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS

DEVSBY:

DEVSBY de artık veri girilebiliyor, database rolünün değiştiğini ve read only olmayan işlemler yapılabildiğini görebiliriz.

SQL> select log_mode,open_mode,database_role,current_Scn from v$database;
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
ARCHIVELOG   READ WRITE        SNAPSHOT STANDBY     1634712

SQL> create table test as select * from dba_objects;

Table created.

SQL> select count(*) from test;

  COUNT(*)
----------
     74560



Şimdi ana makinede log switch yapınca DEVSBY ye arşiv loğların ship edildiğini görmemiz gerekiyor. Bu adım gerekli değil sadece SNAPSHOT STANDBY moda geçince bile logların gönderildiğini görmemiz için.

DEVSBY:
[oracle@DEVSBY ~]$ ls -lhtr /data/archive/
….
-rw-r-----. 1 oracle oinstall  12M Oct 29 17:36 1_119_829858170.dbf
-rw-r-----. 1 oracle oinstall 2.5K Oct 29 17:41 1_121_829858170.dbf
-rw-r-----. 1 oracle oinstall 341K Oct 29 17:41 1_120_829858170.dbf

Bu arada PRIMARY üzerinde log switch tetiklenir.

PRIMARY:
SQL> alter system switch logfile; -- en az 3 kere yapılsa iyi olur.

DEVSBY:

[oracle@DEVSBY ~]$ ls -lhtr /data/archive/
….
rw-r-----. 1 oracle oinstall  46K Oct 29 16:04 1_118_829858170.dbf
-rw-r-----. 1 oracle oinstall  12M Oct 29 17:36 1_119_829858170.dbf
-rw-r-----. 1 oracle oinstall 2.5K Oct 29 17:41 1_121_829858170.dbf
-rw-r-----. 1 oracle oinstall 341K Oct 29 17:41 1_120_829858170.dbf
-rw-r-----. 1 oracle oinstall 310K Oct 29 17:48 1_122_829858170.dbf
-rw-r-----. 1 oracle oinstall 1.5K Oct 29 17:48 1_123_829858170.dbf
-rw-r-----. 1 oracle oinstall 3.0K Oct 29 17:48 1_124_829858170.dbf
-rw-r-----. 1 oracle oinstall 1.0K Oct 29 17:48 1_125_829858170.dbf

Developerların işi bittiğinde ,yapılan işlemleri geriye almakla uğraşmamız gerekmiyor. DEVSBY yi tekrar PHYSICAL STANDBY moda geçirince yapılan işlemler kendiliğinden kaybolacak.

PRIMARY:

DGMGRL> convert database 'DEVSBY' to physical standby;
Converting database "DEVSBY" to a Physical Standby database, please wait...
Operation requires shutdown of instance "MERKEZ" on database "DEVSBY"
Shutting down instance "MERKEZ"...
Database closed.
Database dismounted.
ORACLE instance shut down.
Operation requires startup of instance "MERKEZ" on database "DEVSBY"
Starting instance "MERKEZ"...
Unable to connect to database
ORA-12545: Connect failed because target host or object does not exist
Failed.
Warning: You are no longer connected to ORACLE.

Please complete the following steps and reissue the CONVERT command:
      start up and mount instance "MERKEZ" of database "DEVSBY"

Bazen DEVSBY de instance i başlatamıyor. Burada DEVSBY de elle startup etmemiz gerekiyor.

DEVSBY:

SQL> startup
ORACLE instance started.

Total System Global Area 7482626048 bytes
Fixed Size            2242912 bytes
Variable Size           3388999328 bytes
Database Buffers  4076863488 bytes
Redo Buffers               14520320 bytes
Database mounted.
Database opened.
SQL> SELECT LOG_MODE,OPEN_MODE,DATABASE_ROLE,CURRENT_SCN FROM V$DATABASE;
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
ARCHIVELOG   READ WRITE        SNAPSHOT STANDBY     1635716


DİKKAT !!!
Ancak gördüğümüz gibi hala SNAPSHOT STANDBY modda , dgmgrl üzerinde kontrol edelim

PRIMARY:
DGMGRL> show configuration     

Configuration - DGKONF

  Protection Mode: MaxPerformance
  Databases:
    PRIMARY - Primary database
    SBY - Physical standby database
    DEVSBY    - Snapshot standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DİKKAT !!!

Burada da SNAPSHOT STANDB modda olduğunu gördük, bunun sebebi yaptığım testlerde öğrendiğim gibi eğer convertion işlemi DEVSBY open modda ise bu şekilde yanlış oluyor. DEVSBY yi mount moda çekip , işlemi yaparsak sorun düzelecek.

DEVSBY:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 7482626048 bytes
Fixed Size            2242912 bytes
Variable Size           3388999328 bytes
Database Buffers  4076863488 bytes
Redo Buffers               14520320 bytes
Database mounted.
SQL> SELECT LOG_MODE,OPEN_MODE,DATABASE_ROLE,CURRENT_SCN FROM V$DATABASE;

LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
ARCHIVELOG   MOUNTED           SNAPSHOT STANDBY           0

PRIMARY:

DGMGRL> show configuration

Configuration - DGKONF
  Protection Mode: MaxPerformance
  Databases:
    PRIMARY - Primary database
    SBY - Physical standby database
    DEVSBY    - Snapshot standby database
      Warning: ORA-16782: instance not open for read and write access

Fast-Start Failover: DISABLED

Configuration Status:
WARNING

DGMGRL> convert database 'DEVSBY' to physical standby;
Converting database "DEVSBY" to a Physical Standby database, please wait...
Operation requires shutdown of instance "MERKEZ" on database "DEVSBY"
Shutting down instance "MERKEZ"...
Database closed.
Database dismounted.
ORACLE instance shut down.
Operation requires startup of instance "MERKEZ" on database "DEVSBY"
Starting instance "MERKEZ"...
Unable to connect to database
ORA-12545: Connect failed because target host or object does not exist
Failed.
Warning: You are no longer connected to ORACLE.
Please complete the following steps to finish the convert command:
      start up and mount instance "MERKEZ" of database "DEVSBY"

Burada DEVSBY yi elle startup etmemiz gerekiyor.

DEVSBY:

SQL> startup
ORACLE instance started.

Total System Global Area 7482626048 bytes
Fixed Size            2242912 bytes
Variable Size           3388999328 bytes
Database Buffers  4076863488 bytes
Redo Buffers               14520320 bytes
Database mounted.
Database opened.
SQL> SELECT LOG_MODE,OPEN_MODE,DATABASE_ROLE,CURRENT_SCN FROM V$DATABASE;

LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
ARCHIVELOG   READ ONLY         PHYSICAL STANDBY     1634472

SQL> SELECT LOG_MODE,OPEN_MODE,DATABASE_ROLE,CURRENT_SCN FROM V$DATABASE

LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY     1636368

PRIMARY:

DGMGRL> show configuration

Configuration - DGKONF

  Protection Mode: MaxPerformance
  Databases:
    PRIMARY - Primary database
    SBY - Physical standby database
    DEVSBY    - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

DİKKAT !!!

Bu aşamadan sonra DEVSBY shutdown edilip, mount moda alınarak sorgu gönderimine kapatılmalıdır. Yoksa developer erişimi devam edecektir.

DEVSBY:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 7482626048 bytes
Fixed Size            2242912 bytes
Variable Size           3388999328 bytes
Database Buffers  4076863488 bytes
Redo Buffers               14520320 bytes
Database mounted.

SQL> SELECT LOG_MODE,OPEN_MODE,DATABASE_ROLE,CURRENT_SCN FROM V$DATABASE;
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
ARCHIVELOG   MOUNTED           PHYSICAL STANDBY     1640886

SQL> create table test2 as select * from dba_objects;
create table test2 as select * from dba_objects
*
ERROR at line 1:

ORA-01109: database not open

No comments :

Post a Comment