Anasayfa » Oracle Dataguard Nedir ve Kurulum Adımları

Oracle Dataguard Nedir ve Kurulum Adımları

oracle_dataguard

Oracle Dataguard Nedir ve Kurulum Adımları konulu yazımızda, Oracle High Availability çözümlerinden olan Data Guard ve kulumu hakkında adımları anlatacağım. Oracle Data Guard, Oracle veritabanı sistemleri için yüksek erişilebilirlik (high availability), veri koruma (data protection) ve felaket kurtarma (disaster recovery) çözümüdür. Temel amacı, birincil (primary) veri tabanındaki verileri bir veya daha fazla yedek (standby) veri tabanına gerçek zamanlı ya da zaman gecikmeli olarak çoğaltmak ve olası kesintilerde veri kaybı olmadan sistemin çalışmaya devam etmesini sağlamaktır.

Prod veri tabanımızda sorun anında switchover yapabileceğimiz aynı lokasyonda veya FKM olarak başka bir lokasyonda konumlandırabileceğimiz bir çözümdür. Sorun anında hizmet kesintisi vermek yerine standby database e switchover yapıp minimum seviyede kesinti ile veri tabanımızın hizmet vermesini sağlamaktadır. Oracle in diğer database çözümlerinde olduğu gibi Dataguard da son derece stabil ve maximum seviyede koruma sağlamaktadır.

Standby veri tabanını physical, logical ve snapshot standby olarak konumlandırabiliriz.

Physical Standby: Redo log’lar fiziksel olarak uygulanır (blok blok aynı). En yaygın ve hızlı kurtarma sağlar.Primary veritabanının birebir fiziksel kopyasıdır.Veriler, redo log dosyaları blok seviyesinde uygulanarak senkronize edilir.Standby veritabanı “MOUNT” modunda çalışır ama istenirse “READ ONLY WITH APPLY” modunda da açılarak raporlama yapılabilir.En çok tercih edilen ve en güvenli senaryodur.

Logical Standby: Redo log’lar SQL ifadelerine dönüştürülerek uygulanır. Raporlama ve özel amaçlar için esneklik sağlar. Primary veri tabanındaki veriler, SQL cümlelerine dönüştürülerek standby üzerinde mantıksal olarak yeniden oluşturulur. Yapı ve içerik olarak benzerdir, ama fiziksel olarak birebir kopya değildir. Standby veritabanı açık (OPEN) durumda çalışır ve aynı anda raporlama, okuma, hatta veri işleme yapılabilir (sınırlı ölçüde). Primary ile aynı yapıya sahip olmak zorunda değildir (örneğin bazı tablolar hariç tutulabilir).Gelişmiş raporlama ve analitik işlemler yapılabilir. Kurtarma süresi daha uzundur ve karışıklıklara daha açıktır.

Snapshot Standby: Physical standby, geçici olarak snapshot standby’e dönüştürülebilir. Bu durumda standby veritabanı read-write olur, test/simülasyon yapılabilir. Daha sonra tekrar standby moda geçirilerek senkronize edilir. Physical standby veritabanının, geçici olarak read-write (okuma/yazma) moduna geçirilmiş halidir. Veri koruma geçici olarak devre dışı bırakılır, bu sayede: Geliştirme,Test, Upgrade denemeleri gibi işlemler yapılabilir.

Daha sonra tekrar physical standby moda döner ve geri kalan archive log’ları uygulayarak güncel hale gelir.

Oracle DataGuard 3 Farklı Protection Modes da çalışır:

  • Maximum Protection: Bu seviyede hiçbir veri kaybı olmaması sağlanır. Birincil veri tabanında oluşan redo log dosyası eş zamanlı olarak en az bir ikincil veri tabanına kopyalanıp işlenmelidir. Eğer bir sorun olur da ikincil veri tabanına işlenemez ise birincil veri tabanı otomatik kapatılır. Bu modda senkron (SYNC) ve AFFIRM (disk yazımı beklenir) kullanılır. En büyük dezavantajı Yüksek erişilebilirlik riske girebilir (standby bozulursa primary kapanır).
  • Maximum Availability: Bu seviye de maksimum Protection da olduğu gibi sıfır veri kaybı hedeflenir, fakat hata durumunda veri tabanı kapatılmaz. SYNC + AFFIRM ile çalışır (standby yazmadan commit yapılmaz). Eğer standby sunucu geçici olarak erişilemezse, Oracle geçici olarak SYNC bağlantıyı askıya alır ve LGWR işlemleri sadece primary üzerinde tamamlamaya devam eder. Hata düzelince (örneğin standby tekrar erişilebilir olunca), redo gönderimi senkron olarak devam eder.
  • Maximum Performance:Bu seviye varsayılan seviyedir ve birincil veri tabanın performansında azalma olmadan koruma sağlar. Redo verisi, standby’a asenkron (ASYNC) şekilde gönderilir. LGWR, standby’dan onay beklemeden commit işlemini tamamlar. Genellikle en yaygın kullanılan moddur, çünkü uygulama performansına etkisi çok azdır. Log dosyalarının aktarılmasında sorun olursa sorun düzeldikten sonra kalınan yerden işleme devam edilir.

Buraya kadar dataguard ile ilgili bilinmesi gereken genel bilgileri paylaştıktan sonra kurulum adımlarına geçebiliriz. Kurulum senaryomuz da 2 node lu bir RAC sistemimize FKM sunucusu olarak aynı yada farklı bir lokasyon için Maximum Performance mode da Physical Standby kuracağız. Kurulum mimarimiz ve ip bilgileri aşağıdaki görselde verilmiştir.

Dataguard kurulumu ve yapılandırması

Standby veri tabanı için single instance kurulup database software kurulumu yapıyoruz. Database create işlemi yapılmaz. DNS sunucumuz var ise dns e hostname tanımlamalarını yapıyoruz. DNS sunucumuz yok ise hosts dosyasına aşağıdaki bilgileri ekliyoruz.

Database software versiyonları minor olarak proddan farklı olsa da standby çalışır fakat versionların prod la aynı olması en doğru kurulumdur. Örneğin prod 19.14 ise standby’inde 19.14 olması önerilir. Şu an bizim kurulum örneğimizde prod ortam 19.14 olup standby sunucu içinde database software kurup 19.14 e Release Upgrade yapıp aynı seviyeye getirdim.

  • Prod tarafında log_mode archivelog kontrolü:

İşletim Sistemi ve Veritabanı kurulum işlemlerimizi tamamladıktan sonra “Oracle DataGuard” kurulumuna başlayabiliriz. Kurulum adımlarındaki komutların hangi sunucuda çalıştırıldığı belirtilmiştir. Öncelikle Birincil veri tabanımızda işlemleri yapıyoruz. Veri tabanımızın “ArchiveLog” modunun açık olması gerekiyor eğer kapalıysa aşağıdaki işlemlerle açıyoruz.

SQL> select log_mode from v$database;
NOARCHIVELOG

Veritabanlarını kapatıyoruz.

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

Veri tabanımızı “mount” modda açıp “ARCHIVELOG” moda alıyoruz.

SQL> startup mount;
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size                  2235208 bytes
Variable Size             641729720 bytes
Database Buffers          419430400 bytes
Redo Buffers                5541888 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.

Veri tabanımızı açıyoruz.

SQL> alter database open;
Database altered.

Tekrar sorguladığımızda “ARCHIVELOG” modda olduğunu görüyoruz.

SQL> select log_mode from v$database;   
LOG_MODE
------------
ARCHIVELOG
  • Oracle Password (orapw) Dosyasının Standby Sunucuya Kopyalanması

Production ortamdaki pasword file dosyası standby sunucusuna kopyalanır.  orapw dosyası ASM de değilse aşağıdaki komutla kontrol edebilirsiniz.

[oracle@rac1 ~]$ srvctl config database -d oramg
[oracle@rac1 ~]$ scp +DATA/ORAMG/PASSWORD/pwdoramg.264.1108200097 oracle@192.168.36.170:/u01/app/oracle/product/19c/db_1/dbs/

Password dosyası yoksa aşağıdaki komutla oluşturabilirsiniz.

[oracle@rac1 ~]$ orapwd file=orapwORADG password=test entries=5
  • tnsnames.ora Dosyalarının Yapılandırılması

Hem Primary (PROD) hem de Standby (STB) sunucularında tnsnames.ora dosyasına karşılıklı bağlantı bilgileri eklenmelidir:

rac1,rac2,oradg sunucularında tnsnames.ora aşağıdaki gibi düzenliyoruz.
oracle@oradg:$ vi /u01/app/oracle/product/19.0.0/dbhome/network/admin/tnsnames.ora
ORAMG =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oramg)(UR=A)
    )
  )

ORADG =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oradg)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oradg)(UR=A)
    )
  )
  • Standby Sunucuda listener.ora Dosyasının düzenlenmesi

Standby sunucuda listener.ora dosyasına aşağıdaki satırlar eklenmelidir:

[oracle@oradg ~]$ vi /u01/app/oracle/product/19.0.0/dbhome/network/admin/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradg.localdomain)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = oradg)
      (ORACLE_HOME = /u01/app/oracle/product/19c/db_1)
      (SID_NAME = oradg)
    )
  )
  • Standby Sunucuda sqlnet.ora Dosyasının düzenlenmesi
[oracle@oradg ~]$ vi /u01/app/oracle/product/19.0.0/dbhome/network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
SQLNET.EXPIRE_TIME=2
SQLNET.ALLOWED_LOGON_VERSION_CLIENT =8
SQLNET.ALLOWED_LOGON_VERSION_SERVER =8
SQLNET.USE_ZERO_COPY_IO=0
  • Listener Stop ve Start
[oracle@oradg ~]$ lsnrctl stop
[oracle@oradg ~]$ lsnrctl start
[oracle@oradg ~]$ lsnrctl status
  • TNS bağlantı testlerinin yapılması:
[oracle@rac1 ~]$ tnsping oradg

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 04-JUL-2022 13:36:53

Copyright (c) 1997, 2019, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradg)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oradg)(UR=A)))
OK (10 msec)
[oracle@rac2 ~]$ tnsping oradg

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 04-JUL-2022 13:36:59

Copyright (c) 1997, 2019, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradg)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oradg)(UR=A)))
OK (0 msec)
[oracle@oradg ~]$ tnsping oramg

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 04-JUL-2022 13:37:05

Copyright (c) 1997, 2019, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.36.140)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oramg)(UR=A)))
OK (20 msec)
  • Standby da adump dizini oluşturuyoruz
oracle@oradg:$ mkdir -p /u01/app/oracle/admin/ORADG/adump
  • Standby logfile oluşturulması:

Prod ortamda Standby veri tabanımız için standby redo log’larını oluşturuyoruz. Standby redo log’ların boyutlarının mevcut online redo log’ların boyutlarıyla aynı olması gerekmektedir.

Bu dosyalar, Primary veritabanından gelen redo verilerinin RFS (Remote File Server) tarafından yazılmasını sağlar.RAC veya Single Instance fark etmeksizin, eğer fiziksel standby kuruluyorsa standby redo log’lar zorunludur.Bu log dosyaları olmadan real-time apply (anlık veri işleme) çalışmaz.Eğer Data Guard yapılandırmasında Maximum Protection ya da Maximum Availability gibi modlar seçilmişse, SRL olmazsa veritabanı hata verir.

Standby Redo Log Oluşturma Kuralları:

Her online redo log grubu için en az bir standby redo log grubu olmalıdır.

Oracle’ın önerisi:
(Online redo log grup sayısı × RAC node sayısı) + 1 kadar standby redo log oluşturun.

Örnek: 2 Node’lu RAC Sistemde her node’da 3 online redo log grubunuz olduğunu varsayarsak:

  • 3 grup × 2 node = 6 grup
  • 6 + 1 = 7 standby redo log grubu oluşturmanız önerilir.

Not: THREAD 1 ve THREAD 2, RAC node’larınızın thread numaralarıdır. Her node’un redo işleme thread’i farklıdır.

  • Log file oluşturulmazsa real time yazma işlemi devam etmez archive logların gelmesini bekler. Delay süresi girilecekse ve switchover yapılmayacaksa bu adıma ihtiyaç yoktur. Fakat ilerde switchover olması ihtimaline karşı her node için proddaki boyutu ile logfile lar oluşturuyoruz.

Mevcuttaki boyut kontrol edilip aşağıdaki gibi prodda logfile oluşturuyoruz.

SQL>select BYTES from v$log 
SQL>
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 10 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 11 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 13 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 14 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 15 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 16 SIZE 200M;
  • Production veri tabanından pfile oluşturulup standby sunucuya kopyalıyoruz
SQL> create pfile='/tmp/initORADG.ora' from spfile;
[oracle@rac1 ~]$ scp /tmp/initORADG.ora oracle@192.168.36.170:/u01/app/oracle/product/19.0.0/dbhome/dbs/initORADG.ora
  • Standby sunucuya aktarılan pfile dosyasında aşağıdaki değişiklikleri yapıyoruz. db_unique_name parametresinin proddan farklı olması gerekiyor unique bir isim verilip aşağıdaki gibi düzenliyoruz. Ayrıca prod ortamda kullandığınız spesifik başka ayarlar varsa onlarıda standby sunucuya uygun olarak set edilmesi gerekiyor.
oracle@oradg:$  vi /u01/app/oracle/product/19.0.0/dbhome/dbs/initORADG.ora
*.audit_file_dest='/u01/app/oracle/admin/ORADG/adump'
*.db_name='ORAMG'
*.db_unique_name='ORADG'
*.db_recovery_file_dest='+FRA'
*.db_recovery_file_dest_size=60g
*.db_create_file_dest='+DATA'
*.db_create_online_log_dest_1='+REDO'
*.db_create_online_log_dest_2='+DATA'	
  • Standby database aşağıdaki komutla nomount modda başlatıyoruz:
SQL> startup nomount pfile='/u01/app/oracle/product/19.0.0/dbhome/dbs/initORADG.ora';
Backup and Recovery

Standby tarafına verileri dublicate komutu veya backup and recovery komutu ile aktarabiliriz. Biz bu örneğimizde backup and recovery adımları ile yapacağız. Yani prod ortamdan backup alıp standby sunucuya restore yapıp data sonra dataguard ı başlatacağız. Bu işlem için prod ve standby için mount edilen diske rman üzerinden backup alıyoruz.

oracle@rac1:~$ rman target /
run
{
ALLOCATE CHANNEL CH1 DEVICE TYPE DISK;
ALLOCATE CHANNEL CH2 DEVICE TYPE DISK;
ALLOCATE CHANNEL CH3 DEVICE TYPE DISK;
ALLOCATE CHANNEL CH4 DEVICE TYPE DISK;
BACKUP AS BACKUPSET DATABASE FORMAT '/backup/FULL/FULL_%U;
BACKUP AS BACKUPSET ARCHIVELOG ALL not backed up 1 times FORMAT '/backup/ARCH/ARCH_%U';
BACKUP CURRENT CONTROLFILE FORMAT '/backup/CONTROLFILE/cf_%U';
RELEASE CHANNEL CH1;
RELEASE CHANNEL CH2;
RELEASE CHANNEL CH3;
RELEASE CHANNEL CH4;
}
  • Standby sunucuda control file restore işlemi:

Prodda aldığımız Controlfile’ı aşağıdaki komutla standby database e restore ediyoruz.

oracle@rac1:~$ rman target /
run 
	{
	allocate channel t1 type DISK;
	RESTORE controlfile from '/backup/CONTROLFILE/cf_20241115-07';
	release channel t1;
	}

Standby de Control file restore edildikten sonra Veri tabanı aşağıdaki komutla mount ediyoruz:

SQL> alter database mount;
  • Standby Veri tabanını aşağıdaki komutlarla restore ediyoruz:
oracle@oradg:~$ rman target /
run{
ALLOCATE CHANNEL CH1 DEVICE TYPE DISK;
ALLOCATE CHANNEL CH2 DEVICE TYPE DISK;
ALLOCATE CHANNEL CH3 DEVICE TYPE DISK;
ALLOCATE CHANNEL CH4 DEVICE TYPE DISK;
restore database;
recover database;
RELEASE CHANNEL CH1;
RELEASE CHANNEL CH2;
RELEASE CHANNEL CH3;
RELEASE CHANNEL CH4;
}

Standby sunucuda Restore işlemi tamamlandıktan sonra spfile oluşturulup geçerli olabilmesi için db kapatıp mout modda açıyoruz.

SQL> create spfile from pfile;

	File created.
SQL> shu immediate;
	ORA-01109: database not open
	
	
	Database dismounted.
	ORACLE instance shut down.
	
SQL> startup mount;
  • Aşağıdaki adımları kontrol edilip standby da set ediyoruz.
SQL>
alter system set log_archive_config='DG_CONFIG=(ORAMG,ORADG)' scope=BOTH;
alter system set LOG_ARCHIVE_DEST_3= 'SERVICE=ORADG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=ORADG' scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_3=DEFER scope=BOTH;
alter system set FAL_SERVER= ORAMG scope=BOTH;
alter system set FAL_CLIENT= ORADG scope=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.dbf' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=8 scope=BOTH;
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE scope=BOTH;
alter system set control_files='+DATA/ORADG/CONTROLFILE/current.265.1185103413' scope=spfile;

Aşağıdaki adımları kontrol edilip prod da set ediyoruz.

SQL>
alter system set log_archive_config='DG_CONFIG=(ORAMG,ORADG)' scope=BOTH;
alter system set LOG_ARCHIVE_DEST_3= 'SERVICE=ORADG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=ORADG' scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_3=ENABLE scope=BOTH;
alter system set FAL_SERVER= ORADG scope=BOTH;

Aşağıdaki komutlarla standby database role physical standby’a çevrilip kontrolü yapıyoruz:

SQL> ALTER DATABASE OPEN READ ONLY;
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
SQL> select name, open_mode, database_role from v$database;
  • Standby suncuda MRP servisini aşağıdaki komutla başlatıyoruz:
SQL>alter database recover managed standby database using CURRENT LOGFILE DISCONNECT FROM SESSION;

Standby sunucumuzun geriden gelmesini istersek LOG_ARCHIVE_DEST_3 parametresini aşağıdaki gibi delay süresi verip archive loglardan gecikmeli olarak çalışması sağlanabiliriz.

alter system set LOG_ARCHIVE_DEST_3= 'SERVICE=ORADG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=ORADG NOAFFIRM optional compression=enable reopen=300 net_timeout=30 delay=180' scope=both;

Delay süresi belirlersek MRP servisini aşağıdaki gibi çalıştırıyoruz.


SQL>  alter database recover managed standby database using archived logfile disconnect from session;

Standby tarafında aşağıdaki komutlarla MRP servisinin durumu gecikme durumu apply süresi gibi kontroller yapıyoruz:

SELECT name, value, time_computed FROM v$dataguard_stats;
select max(sequence#) from v$archived_log where applied='YES';
SELECT process, status, group#, thread#, sequence#, block# FROM v$managed_standby order by process, group#, thread#, sequence#;

Oracle Dataguard Nedir ve Kurulum Adımları konulu yazımızda Oracle Dataguard Nedir ve Kurulum Adımları tamamladık. Database sistemimizin yüksek erişilebilirlik (high availability), veri koruma (data protection) ve felaket kurtarma (disaster recovery) senaryoları için hazır hale getirmiş olduk. Kurulum işlemleri test ortamlarında yapılmış olup sistem ihtiyaçlarınızı ve mevcut kaynaklarınıza göre parametrelere dikkat ederek kurulum yapmanız gerekmektedir.

Oracle ile ilgili diğer yazılarımız için tıklayınız.

Oracle Dataguard Resmi Dökümantasyon için tıklayınız.

More Reading

Post navigation

Leave a Comment

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir