Data Guard Kurulumu (11G R2 on Solaris 10 x86_64)

Selamlar,

bu makalede Oracle Database 11G R2 için Data Guard konfigürasyonunu yapıcaz. Data Guard Oracle’ın en stabil ve konfigürasyonu en kolay replikasyon yöntemidir. Bu sayede X lokasyonundaki bir database Y lokasyonuna replike edilebilir ve bir felaket durumunda switchover yapılarak database replike edilen Y lokasyonundan hizmete açılabilir.

Data Guard’ın asıl amacı data protection’dır. Yani bizim X lokasyonundaki server’larımız deprem, sel, yangın gibi doğal afetler sonucu kullanılamaz hale gelebilir ve tüm data’larımız kaybolabilir. Data kaybolmasının önüne geçebilmek için database’imizi mutlaka başka bir lokasyona replike etmemiz gerekmektedir.

Data Guard aynı zamanda migration’larda da oldukça sık kullanılır. Downtime’ı çok kısa olduğu için (duruma göre 2-3 dakika ya da max 10dk) backup/restore’dan daha hızlı bir şekilde yeni server/storage’a migrate edilebilir.

Elimde single instance production database var (11.2.0.1). Data Guard kurulumuna başlamadan önce kurulumun yapılacağı ortamda software only rdbms kuruyorum, database create etmiyorum.

Data Guard adımları aşağıdaki gibi;

1. Öncelikle her iki tarafta da /etc/hosts dosyalarını ayarlıyorum.
[Primary]

bash-3.2# vi /etc/hosts
"/etc/hosts" [Read only] 6 lines, 93 characters
#
# Internet host table
#
::1 localhost
127.0.0.1 localhost
10.1.1.99 koop-primary loghost
10.1.1.100 koop-standby

[Standby]

bash-3.2# vi /etc/hosts
"/etc/hosts" [Read only] 6 lines, 94 characters
#
# Internet host table
#
::1 localhost
127.0.0.1 localhost
10.1.1.100 koop-standby loghost
10.1.1.99 koop-primary

2. [Primary] force logging kapalı ise aşağıdaki şekilde açıyorum.

SQL> SELECT force_logging FROM v$database;
FORCE_LOG
---------
NO

SQL> alter database force logging;
Database altered.

SQL> SELECT force_logging FROM v$database;
FORCE_LOG
---------
YES

3. [Primary] Data Guard için gerekli parametreleri set ediyorum.

SQL> alter system set log_archive_config ='dg_config=(koop,stdkoop)';
System altered.
SQL> alter system set log_archive_dest_2 = 'service=stdkoop async valid_for=(online_logfile,primary_role) db_unique_name=stdkoop';
System altered.
SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;
System altered.
SQL> alter system set log_archive_max_processes=30;
System altered.
SQL> alter system set fal_server=stdkoop;
System altered.
SQL> alter system set standby_file_management=auto;
System altered.

4. [Primary & Standby] /u01/app/oracle/product/11.2.0/network/admin/tnsnames.ora dosyasını aşağıdaki şekilde editliyorum.

KOOP =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = koop-primary)(PORT = 1521))
     (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = koop)
  )
 )
 
STDKOOP =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = koop-standby)(PORT = 1521))
     (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = stdkoop)
  )
 )

5. [Standby] Öncelikle netca ile listener create ediyorum ve /u01/app/oracle/product/11.2.0/network/admin/listener.ora dosyasına aşağıdaki satırları ekliyorum.
Not: Ben data guard’ı rman üzerinden duplicate komutu ile kuracağım için bunu yapmam gerekli. Duplicate komutunu çalıştırmak için listener ile her iki db’ye de auxiliary ile bağlanmam gerekli. Eğer RMAN üzerinden restore yapılacak ve elle konfigüre edilecekse bu adım geçilebilir.

SID_LIST_LISTENER =
  (SID_LIST =
   (SID_DESC =
     (GLOBAL_DBNAME = stdkoop)
     (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
     (SID_NAME = stdkoop)
  )
 )

6. [Primary] parametre dosyasını standby tarafa atıyorum.

scp orapwkoop oracle@10.1.1.100:/u01/app/oracle/product/11.2.0/db_1/dbs/orapwstdkoop

7. [Primary] /u01/app/oracle/flash_recovery_area/backup/ dizinine backup başlatıyorum.

run {
allocate channel c1 type disk MAXPIECESIZE 16G format '/u01/app/oracle/flash_recovery_area/backup/dbf_%d_%a_%u_%s_%p.bkp';
allocate channel c2 type disk MAXPIECESIZE 16G format '/u01/app/oracle/flash_recovery_area/backup/dbf_%d_%a_%u_%s_%p.bkp';
allocate channel c3 type disk MAXPIECESIZE 16G format '/u01/app/oracle/flash_recovery_area/backup/dbf_%d_%a_%u_%s_%p.bkp';
allocate channel c4 type disk MAXPIECESIZE 16G format '/u01/app/oracle/flash_recovery_area/backup/dbf_%d_%a_%u_%s_%p.bkp';
backup as backupset tag "full_hot_backup" database;
backup current controlfile for standby format '/u01/app/oracle/flash_recovery_area/backup/for_standbyctlfile_%d_%a';
release channel c1;
allocate channel c1 type disk format '/u01/app/oracle/flash_recovery_area/backup/arc_%d_%a_%u_%s_%p.bkp';
change archivelog all validate;
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup archivelog all;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}

8. [Primary] aldığım backup’ları standby tarafa gönderiyorum ya da shared bir alana backup alabilirdim.

cd /u01/app/oracle/flash_recovery_area/backup/

scp * oracle@10.1.1.100:/u01/app/oracle/flash_recovery_area/backup/

9. [Primary] pfile create ediyorum ve aşağıdaki şekilde editleyip standby tarafa scp ile gönderiyorum.

SQL> create pfile='/export/home/oracle/standbypfile.ora' from spfile;
File created.
stdkoop.__db_cache_size=503316480
stdkoop.__java_pool_size=16777216
stdkoop.__large_pool_size=16777216
stdkoop.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
stdkoop.__pga_aggregate_target=536870912
stdkoop.__sga_target=754974720
stdkoop.__shared_io_pool_size=0
stdkoop.__shared_pool_size=201326592
stdkoop.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/stdkoop/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/stdkoop/control01.ctl','/u01/app/oracle/flash_recovery_area/stdkoop/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='koop'
*.db_unique_name='stdkoop'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=5368709120
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=stdkoopXDB)'
*.fal_server='koop'
*.log_archive_config='dg_config=(stdkoop,koop)'
*.log_archive_dest_2='service=koop async valid_for=(online_logfile,primary_role) db_unique_name=koop'
*.log_archive_format='%t_%s_%r.dbf'
*.log_archive_max_processes=30
*.memory_target=1286602752
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.db_file_name_convert='/u01/app/oracle/oradata/koop','/u01/app/oracle/oradata/stdkoop'
scp /export/home/oracle/standbypfile.ora oracle@10.1.1.100:/export/home/oracle/

10. [Standby] database’i nomount moda getirmeden önce yukarıdaki pfile’da bulunan dizinleri create ediyorum. Bu dizinler olmazsa zaten hata verecektir.

mkdir -p /u01/app/oracle/oradata/stdkoop
mkdir -p /u01/app/oracle/admin/stdkoop/adump
mkdir -p /u01/app/oracle/flash_recovery_area

11. [Standby] database2i nomount modda açıyorum.

oracle_rdbms-koop-standby $ sql
SQL*Plus: Release 11.2.0.1.0 Production on Mon Dec 15 15:02:42 2014
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup nomount pfile='/export/home/oracle/standbypfile.ora';
ORACLE instance started.
Total System Global Area 1286066176 bytes
Fixed Size 2210688 bytes
Variable Size 771753088 bytes
Database Buffers 503316480 bytes
Redo Buffers 8785920 bytes
SQL>

Manual Kurulum

Bu adıma kadar tüm işlemler aynı, ancak bu adımdan sonra 2 farklı yöntem ile ilerlenebilir. Bunlardan ilki manual kurulum. Manual kurulum için aşağıdaki adımları izliyorum.

12. [Standby] rman’e bağlanıp controlfile’ı restore ediyorum.

RMAN> restore standby controlfile from '/u01/app/oracle/flash_recovery_area/backup/for_standbyctlfile_KOOP_866376143';

13. [Standby] rman’e bağlanı restore ve ardından recover işlemini başlatıyorum.

run{
 configure device type disk parallelism 4 backup type to backupset;
 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;
 };

13. [Standby & Primary] Restore işlemi tamamlandıktan sonra her iki database’e de standby log’ları ekliyorum.

alter database add standby logfile ('/u01/app/oracle/oradata/stdkoop/standby_redo01.log') size 50m;
alter database add standby logfile ('/u01/app/oracle/oradata/stdkoop/standby_redo02.log') size 50m;
alter database add standby logfile ('/u01/app/oracle/oradata/stdkoop/standby_redo03.log') size 50m;

14. [Standby] sqlplus ile bağlanıp replikasyonu başlatıyorum.

alter database recover managed standby database using current logfile disconnect;

Duplicate Komutu ile Kurulum

ikinci yöntem ise duplicate komutu ile tüm restore ve recover işlemleri otomarik yapıyor. Bu yöntemin tek dezavantajı rman’e bağlanırken her iki database’e de bağlanmanız gerekiyor. Eğer sys şifresi elinizde yoksa veya ulaşması zor ise bu yöntem pek kullanışlı olmuyor.

12. [Standby] rman’e bağlanıp restore’u başlatıyorum. Burada target database’imiz her zaman primary ve auxiliary olarak bağlandığımız database’imiz ise standby side olmalı.
NOT: Duplicate komutu backup’dan öncelikle standby controlfile’ı dönüyor sonra ise restore işlemini başlatıyor.

rman target sys/0racle@koop auxiliary sys/0racle@stdkoop
run{
 configure device type disk parallelism 4 backup type to backupset;
 allocate auxiliary channel ch1 device type disk;
 allocate auxiliary channel ch2 device type disk;
 allocate auxiliary channel ch3 device type disk;
 allocate auxiliary channel ch4 device type disk;
 DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
 };
using target database control file instead of recovery catalog
old RMAN configuration parameters:
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
new RMAN configuration parameters:
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
new RMAN configuration parameters are successfully stored

allocated channel: ch1
channel ch1: SID=19 device type=DISK

allocated channel: ch2
channel ch2: SID=20 device type=DISK

allocated channel: ch3
channel ch3: SID=21 device type=DISK

allocated channel: ch4
channel ch4: SID=22 device type=DISK

Starting Duplicate Db at 15-DEC-14

contents of Memory Script:
{
 restore clone standby controlfile;
}
executing Memory Script

Starting restore at 15-DEC-14

channel ch1: starting datafile backup set restore
channel ch1: restoring control file
channel ch1: reading from backup piece /u01/app/oracle/flash_recovery_area/backup/for_standbyctlfile_KOOP_866376143
channel ch1: piece handle=/u01/app/oracle/flash_recovery_area/backup/for_standbyctlfile_KOOP_866376143 tag=STANDBY_CONTROLFILE
channel ch1: restored backup piece 1
channel ch1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/stdkoop/control01.ctl
output file name=/u01/app/oracle/flash_recovery_area/stdkoop/control02.ctl
Finished restore at 15-DEC-14

contents of Memory Script:
{
 sql clone 'alter database mount standby database';
}
executing Memory Script

sql statement: alter database mount standby database

contents of Memory Script:
{
 set newname for tempfile 1 to
 /u01/app/oracle/oradata/stdkoop/temp01.dbf;
 switch clone tempfile all;
 set newname for datafile 1 to
 /u01/app/oracle/oradata/stdkoop/system01.dbf;
 set newname for datafile 2 to
 /u01/app/oracle/oradata/stdkoop/sysaux01.dbf;
 set newname for datafile 3 to
 /u01/app/oracle/oradata/stdkoop/undotbs01.dbf;
 set newname for datafile 4 to
 /u01/app/oracle/oradata/stdkoop/users01.dbf;
 set newname for datafile 5 to
 /u01/app/oracle/oradata/stdkoop/example01.dbf;
 restore
 clone database
 ;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/stdkoop/temp01.dbf in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 15-DEC-14

channel ch1: starting datafile backup set restore
channel ch1: specifying datafile(s) to restore from backup set
channel ch1: restoring datafile 00003 to /u01/app/oracle/oradata/stdkoop/undotbs01.dbf
channel ch1: restoring datafile 00005 to /u01/app/oracle/oradata/stdkoop/example01.dbf
channel ch1: reading from backup piece /u01/app/oracle/flash_recovery_area/backup/dbf_KOOP_866376143_03pq8049_3_1.bkp
channel ch2: starting datafile backup set restore
channel ch2: specifying datafile(s) to restore from backup set
channel ch2: restoring datafile 00001 to /u01/app/oracle/oradata/stdkoop/system01.dbf
channel ch2: reading from backup piece /u01/app/oracle/flash_recovery_area/backup/dbf_KOOP_866376143_01pq8048_1_1.bkp
channel ch3: starting datafile backup set restore
channel ch3: specifying datafile(s) to restore from backup set
channel ch3: restoring datafile 00002 to /u01/app/oracle/oradata/stdkoop/sysaux01.dbf
channel ch3: restoring datafile 00004 to /u01/app/oracle/oradata/stdkoop/users01.dbf
channel ch3: reading from backup piece /u01/app/oracle/flash_recovery_area/backup/dbf_KOOP_866376143_02pq8048_2_1.bkp
channel ch1: piece handle=/u01/app/oracle/flash_recovery_area/backup/dbf_KOOP_866376143_03pq8049_3_1.bkp tag=FULL HOT BACKUP
channel ch1: restored backup piece 1
channel ch1: restore complete, elapsed time: 00:00:25
channel ch3: piece handle=/u01/app/oracle/flash_recovery_area/backup/dbf_KOOP_866376143_02pq8048_2_1.bkp tag=FULL HOT BACKUP
channel ch3: restored backup piece 1
channel ch3: restore complete, elapsed time: 00:01:05
channel ch2: piece handle=/u01/app/oracle/flash_recovery_area/backup/dbf_KOOP_866376143_01pq8048_1_1.bkp tag=FULL HOT BACKUP
channel ch2: restored backup piece 1
channel ch2: restore complete, elapsed time: 00:01:15
Finished restore at 15-DEC-14

contents of Memory Script:
{
 switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy RECID=2 STAMP=866389871 file name=/u01/app/oracle/oradata/stdkoop/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=3 STAMP=866389871 file name=/u01/app/oracle/oradata/stdkoop/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=4 STAMP=866389871 file name=/u01/app/oracle/oradata/stdkoop/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=5 STAMP=866389871 file name=/u01/app/oracle/oradata/stdkoop/users01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=6 STAMP=866389871 file name=/u01/app/oracle/oradata/stdkoop/example01.dbf
Finished Duplicate Db at 15-DEC-14
released channel: ch1
released channel: ch2
released channel: ch3
released channel: ch4

RMAN> exit

13. [Standby & Primary] Restore işlemi tamamlandıktan sonra her iki database’e de standby log’ları ekliyorum.

alter database add standby logfile ('/u01/app/oracle/oradata/stdkoop/standby_redo01.log') size 50m;
alter database add standby logfile ('/u01/app/oracle/oradata/stdkoop/standby_redo02.log') size 50m;
alter database add standby logfile ('/u01/app/oracle/oradata/stdkoop/standby_redo03.log') size 50m;

14. [Standby] sqlplus ile bağlanıp replikasyonu başlatıyorum.

alter database recover managed standby database using current logfile disconnect;

Monitoring

Data Guard replikasyonunu monitor etmek için burdaki makaleyi okuyabilirsiniz. Aşağıdaki komut ile apply edilen log’ları görebilirsiniz.

[Standby] aşağıdaki sorgu ile replikasyonu izleyebilirim. Bu sorgunun sonucunda sürekli APPLIED=YES görmek istiyoruz.

set linesize 300
alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS';
select sequence#, thread#, first_time, next_time, applied from v$archived_log;

archive

Data Guard kurulumunu tamamladık. Bundan sonra data guard ile ilgili oluşabilecek hataları alert.log’lardan izleyebilirsiniz. Ek olarak her gün replikasyon durumunu yukarıda sorgu ile kontrol edebilirsiniz.

Kolay gelsin.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s