Tuesday, December 3, 2013

Felaket Durumlarında Switchover Yapılması

Bu yazıda dataguard yapısında çalışan canlı sistemde switchover işlemi yapılacak, daha sonra database role ler eski haline getirilecek. Test işleminde switchover yapıldıktan sonra standby ın log_archive_dest_1'ine yazamama durumu ile karşılaşılıp çözümü gösterilecek.


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ündedir.

Bu dökümanda PRIMARY de oluşacak bir sıkıntı sebebiyle , SBY ye geçilmesi durumu anlatılacak. DEVSBY makinesinin durumu değişmeyecek. İşlem sırasında arşiv yollama yolu, PRIMARY den standbylara olduğu için ve PRIMARY-SBY dönüşümü olduğu için yeni arşiv yollama yolunun değiştiği görülecek. İşlem sonunda eski duruma geri dönülecek.

İlk duruma göz atalım:

PRIMARY:

Dataguard konfigürasyonunu kontrol ediyoruz. İlk durumda Success olmalı.

DGMGRL> connect sys@PRIMARY
Password:
Connected.
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>



Daha sonra archive işlemini kontrol ediyoruz, kimden kime archive loğlar gönderilecek. Burada standby makinelere service=SBY_ADI şeklinde parametreleri görmemiz gerekiyor. Log_Archive_dest_1  sunucunun kendi üzerindeki local archive dizini olmalı.


SQL > show parameter archive_dest

log_archive_dest_1      string      location=/data/archive/ valid_for=(all_logfiles,all_roles) db_unique_name=PRIMARY

log_archive_dest_2      string      service="SBY", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0  max_connections=1 reopen=300  db_unique_name="SBY" net_timeout=30, valid_for=(all_logfiles,primary_role)

log_archive_dest_3      string      service="DEVSBY", LGWR ASYNC NO AFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="DEVSBY" net_timeout=30, valid_for=(all_logfiles,primary_role)

Felaket durumlarında archive loglar kimden beklenilecek sorusuna cevap fal_server parametresi ile belirlenir. Her server için diğer makineler olası server konumundadır.

SQL> show parameter fal

NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string PRIMARY
fal_server                   string SBY, DEVSBY

Database in o an primary veya standby rolünde olduğunu ve o anki SCN değerine bakıyoruz. PRIMARY nin  open modda read write modunda olması gerekiyor, SBY nin open modda read only with apply ve DEVSBY nin mount modda olmasını bekliyoruz.

SQL > select log_mode,open_mode,database_role,current_scn,flashback_on from v$database;

LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN FLASHBACK_ON
------------ -------------------- ---------------- ----------- ------------
ARCHIVELOG   READ WRITE        PRIMARY          2130775 YES

SBY:

SQL > show parameter archive_dest

log_archive_dest_1      string      location="/data/archive/",
valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)

log_archive_dest_2      string      service="PRIMARY", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="PRIMARY" net_timeout=30, valid_for=(all_logfiles,primary_role)



SQL> show parameter fal

NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string SBY
fal_server                   string PRIMARY, DEVSBY


SQL> select log_mode,open_mode,database_role,current_scn,flashback_on from v$database

LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN FLASHBACK_ON
------------ -------------------- ---------------- ----------- ------------
ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY     2130863 YES

DEVSBY:

SQL > show parameter archive_dest

log_archive_dest_1      string      location="/data/archive/",  valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)

SQL> show parameter fal
NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string DEVSBY
fal_server                   string PRIMARY, SBY

SQL> select log_mode,open_mode,database_role,current_scn,flashback_on from v$database
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN FLASHBACK_ON
------------ -------------------- ---------------- ----------- ------------
ARCHIVELOG   MOUNTED           PHYSICAL STANDBY     2130832 YES


Switchover to SBY

Bu adımda PRIMARY den SBY ye switchover yapılması anlatılacak.  Sırası ile yine makineleri dolaşacağız.

PRIMARY:

İlk başta PRIMARY üzerinde Oracle Enterprise Manager (EM) açık ise kapatılır. Daha sonra DGMGRL ye bağlanılır.

Dataguard yapısının ilk baştaki durumu:

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>

Switchover başlatılıyor.

DGMGRL> switchover to 'SBY';
Performing switchover NOW, please wait...
New primary database "SBY" is opening...
Operation requires shutdown of instance "MERKEZ" on database "PRIMARY"
Shutting down instance "MERKEZ"...
ORACLE instance shut down.
Operation requires startup of instance "MERKEZ" on database "PRIMARY"
Starting instance "MERKEZ"...
ORACLE instance started.
Database mounted.
Database opened.
Switchover succeeded, new primary is "SBY"

İşlem başarılı gözüküyor. Konfigürasyona tekrar bakalım.

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

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS
DGMGRL>

Değişiklik oldu şimdi parametrelere kontrol edelim:

PRIMARY:

SQL > show parameter archive_dest

log_archive_dest_1      string      location=/data/archive/ valid_for=(all_logfiles,all_roles) db_unique_name=PRIMARY
log_archive_dest_2      string      service="SBY", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="SBY" net_timeout=30, valid_for=(all_logfiles,primary_role)

SQL> show parameter fal
NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string PRIMARY
fal_server                   string SBY, DEVSBY

SQL> select log_mode,open_mode,database_role,current_scn,flashback_on from v$database
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN FLASHBACK_ON
------------ -------------------- ---------------- ----------- ------------
ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY     2151657 YES

PRIMARY şu an read only with apply moda geçti ve database rolü PHYSICAL STANDBY oldu. İşlem başarılı.   

SBY:

SBY makinesi artık primary rolüne sahip olduğuna archive logları ship etmesi gerekiyor.Database rolünün primary olduğunu ve read write moda geçtiğini görmemiz gerekiyor.

SQL > show parameter archive_dest

log_archive_dest_1      string      location="/data/archive/",      valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)
log_archive_dest_2      string      service="PRIMARY", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="PRIMARY" net_timeout=30, valid_for=(all_logfiles,primary_role)


log_archive_dest_3      string      service="DEVSBY", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="DEVSBY" net_timeout=30, valid_for=(all_logfiles, primary_role)

SQL> show parameter fal

NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string SBY
fal_server                   string PRIMARY, DEVSBY

SQL> select log_mode,open_mode,database_role,current_scn,flashback_on from v$database
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN FLASHBACK_ON
------------ -------------------- ---------------- ----------- ------------
ARCHIVELOG   READ WRITE        PRIMARY          2152169 YES

DEVSBY:

DEVSBY için herhangi bir değişiklik beklemiyoruz, aynı değerleri görmemiz gerekiyor.

SQL > show parameter archive_dest

log_archive_dest_1      string      location="/data/archive/",  valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)

SQL> show parameter fal
NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string DEVSBY
fal_server                   string SBY, PRIMARY

SQL> select log_mode,open_mode,database_role,current_scn,flashback_on from v$database
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN FLASHBACK_ON
------------ -------------------- ---------------- ----------- ------------
ARCHIVELOG   MOUNTED           PHYSICAL STANDBY     2151657 YES

Şimdi SBY makinesinde log switch yapalım, diğer makinelere archive logların ship edildiğini görmemiz gerekiyor.

SBY:

SQL> alter system switch logfile;

Şimdi alert loğda aşağıdaki hatayı aldık.

...
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance MERKEZ - Archival Error
ORA-16014: log 1 sequence# 176 not archived, no available destinations
ORA-00312: online log 1 thread 1: '/data/oradata/SBY/redo01.log'
...

!!!! DİKKAT !!!!

Archiving hang duruma geçti, şu an canlı bir sistem olsa redo log switch anı gelse makine kapanabilir. İşlemi iptal ediyoruz. Burada diğer makinelere erişim açık olduğu halde gönderememesi ilginç, log_archive_dest_X leri kontrol etmemiz gerekiyor.

log_Archive_dest_1 de şöyle yazıyor. Yani standby rolünde isem buraya yazılsın, şu an kendisi primary olduğu için yazmıyor.

log_archive_dest_1      string      location="/data/archive/",      valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)

Hang durumda olan log switchi iptal ediyoruz.

SQL> alter system switch logfile;
^Calter system switch logfile
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation

Burada log_archive_dest_1 parametresini düzeltmemiz gerekiyor. O lokasyon için tüm rollerde archive yazsın dememiz lazım veya standby isen yaz kısmını kaldırmamız gerekiyor. Biz PRIMARY makinesindeki gibi tüm rollerde yazsın yapacağız.

SQL>
alter system set log_Archive_dest_1='location=/data/archive/  valid_for=(all_logfiles,all_roles) db_unique_name=SBY';

System altered.

SQL> show parameter archive_dest
NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
log_archive_dest_1      string      location=/data/archive/ valid_for=(all_logfiles,all_roles) db_unique_name=SBY

Log switch işlemini tekrar başlattık ,ancak log switch işlemi yine dondu, SBY deki instance ı restart etmek gerekiyor, bu yüzden önce standby makineleri sonra SBY yi kapatıyorum, sonra SBY yi açmaya çalışacğaım.

SBY ,açılırken aşağıdaki hatayı verdi.

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

SQL> startup mount
ORA-16033: parameter LOG_ARCHIVE_DEST_4 destination cannot be the same as parameter LOG_ARCHIVE_DEST_1 destination
SQL> show parameter archive_dest
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 76 Serial number: 39

Burada parametrelerin ezilmesi durumu olduğunu anlıyorum, spfile dan pfile a geçerek parametrelerin durumuna bakmam gerekiyor.

SQL> create pfile from spfile;
File created.

Şimdi pfile dan archive_dest parametrelerine bakacağaım.

*.log_archive_dest_1='location=/data/archive/ valid_for=(all_logfiles,all_roles) db_unique_name=SBY'
*.log_archive_dest_2='service="PRIMARY"','LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="PRIMARY" net_timeout=30','valid_for=(all_logfiles,primary_role)'
*.log_archive_dest_3='service="DEVSBY"','LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="DEVSBY" net_timeout=30','valid_for=(all_logfiles,primary_role)'
MERKEZ.log_archive_dest_4='location="/data/archive/"',' valid_for=(STANDBY_LOGFILE,STANDBY_ROLE)'
*.log_archive_dest_4=''
*.log_archive_dest_state_1='ENABLE'
MERKEZ.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_dest_state_3='ENABLE'
MERKEZ.log_archive_dest_state_4='ENABLE'

Gördüğümüz gibi log_archive_Dest_4 ü eklemiş, burada log_Archive_dest_1 ve log_Archive_dest_4 çakıştığı için hata aldık ama yine de log_Archive_Dest_4 de standby isen yaz demiş, bu noktada elle müdahale edip bundan kurtulmamız gerekiyor.

İlk önce elle log_Archive_dest_4 ü silip, öyle spfile oluşturup açmayı deneyeceğim.
Elle initSBY.ora yı düzeltelim, fazla satırları kaldıralım. Ve mount moda alıp kontrol edelim.

SBY:

SQL> create spfile from pfile;

SQL> startup mount
ORACLE instance started.

Total System Global Area 1.4965E+10 bytes
Fixed Size            2242912 bytes
Variable Size           1.0905E+10 bytes
Database Buffers  4026531840 bytes
Redo Buffers               31297536 bytes
Database mounted.

SQL> show parameter archive_dest

NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
log_archive_dest_1      string      location=/data/archive/ valid_for=(all_logfiles,all_roles) db_unique_name=SBY

Sorun yok gibi , open duruma getirip diğer standby lara geçip tekrar log switchi deneyeceğim.
Şu an için hata durumu yok.

İlk önce diğer standbyları açıyorum. Daha sonra SBY üzerinde log switch tetikliyorum.

SQL> alter database open;
Database altered.

SQL> alter system switch logfile

System altered.

SQL> r
  1* alter system switch logfile

System altered.

SQL> r
  1* alter system switch logfile

System altered.

Hata yok ve diğer standby makinelerde archivelogların geldiğini ve işlendiğinin görebiliyorum.
Şimdi tekrar geriye dönelim.

DEVSBY:

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

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS
DGMGRL>
DGMGRL> switchover to 'PRIMARY';
Performing switchover NOW, please wait...
New primary database "PRIMARY" is opening...
Operation requires shutdown of instance "MERKEZ" on database "SBY"
Shutting down instance "MERKEZ"...
ORACLE instance shut down.
Operation requires startup of instance "MERKEZ" on database "SBY"
Starting instance "MERKEZ"...
ORACLE instance started.
Database mounted.
Database opened.
Switchover succeeded, new primary is "PRIMARY"

Switchover işlemi başarılı diyor, konfigürasyonu kontrol ediyorum.

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>

Şimdi PRIMARY makinesi tekrar primary durumunda, ilk başta yaptığımız gibi parametreleri kontrol ederek herşeyin ilk baştaki gibi olduğunu görmemiz gerekiyor.

SBY:

SQL> show parameter archive_dest

log_archive_dest_1      string      location=/data/archive/ valid_for=(all_logfiles,all_roles) db_unique_name=SBY

log_archive_dest_2      string      service="PRIMARY", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="PRIMARY" net_timeout=30, valid_for=(all_logfiles,primary_role)

SQL> show parameter fal
NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string SBY
fal_server                   string PRIMARY, DEVSBY

SQL> select log_mode,open_mode,database_role,current_scn,flashback_on from v$database
LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN FLASHBACK_ON
------------ -------------------- ---------------- ----------- ------------
ARCHIVELOG   READ ONLY WITH APPLY PHYSICAL STANDBY     2175676 YES

  

SBY makinesisn database rolünün tekrar PHYSICAL STANDBY olduğunu gördük.

PRIMARY:

SQL> select log_mode,open_mode,database_role,current_scn,flashback_on from v$database;

LOG_MODE     OPEN_MODE         DATABASE_ROLE    CURRENT_SCN
------------ -------------------- ---------------- -----------
FLASHBACK_ON
------------------
ARCHIVELOG   READ WRITE        PRIMARY          2175690
YES

SQL> show parameter fal
NAME                         TYPE   VALUE
------------------------------------ ----------- --------------------------
fal_client                   string PRIMARY
fal_server                   string SBY, DEVSBY

SQL> show parameter archive_dest

log_archive_dest_1      string      location=/data/archive/ valid_for=(all_logfiles,all_roles) db_unique_name=PRIMARY

log_archive_dest_2      string      service="SBY", LGWR ASYNC  NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300db_unique_name="SBY" net_timeout=30, valid_for=(all_logfiles,primary_role)

log_archive_dest_3      string      service="DEVSBY", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="DEVSBY" net_timeout=30, valid_for=(all_logfiles, primary_role)

Herşey yolunda gibi, şimdi log switch yaparak kontrol yapalım


SQL> alter system switch logfile;

System altered.

SQL> r
  1* alter system switch logfile

System altered.

SQL> r
  1* alter system switch logfile

System altered.

SQL> r
  1* alter system switch logfile

System altered.

Sorun yok.

!!!! DİKKAT !!!!

SBY üzerinde log_archive_dest_1 için valid_for=(all_logfiles,all_roles) ifadesi sizi şaşırtmasın, kendi üzerinde archive üretemez standby makine, aşağıdaki hata alınır.

SQL> alter system switch logfile;
alter system switch logfile
             *
ERROR at line 1:
ORA-16000: database open for read-only access


No comments :

Post a Comment