Home / MAKALELER / Veri Tabanı / 11gR2 de Physical Standby Database Kurulması

11gR2 de Physical Standby Database Kurulması

10gR2 için dataguard kurulumundan bahsetmiştik, şimdi aynı işlemleri 11gR2 için yapıp bir sonraki adımda da dgmgrl ile switcover failover işlemlerinden bahsetmeyi planlıyorum.  İlk yazımda bahsetmiş olduğum bazı tanım ve ön gereksinimler kısmına artık burada değinmiyorum.  10gR2 için dataguard kurulumundan bahsederken manuel kurulum yapmıştık. Dbf’ leri biz taşımıştık, initfile’ deki parametreleri biz edit ederek üzerinde değişiklikler yapmıştık. 11gR2 için dataguard kurulumunda bu adımların hiçbirini yapmayacağız. Rman’ i kullanarak tüm işi oracle’ a bırakarak nasıl yapacağımız üzerinde konuşacağız.

Kurulumuna başlamadan önce elimizdekilere bir bakalım.  2 tane işletim sistemi linux 5.5 olan sunucumuz, sunucuların birinde oracle 11gR2 database kurulu diğerinde ise sadece software kurulu durumda. Primary sunucumuzun SID=dg1, dataguard olacak olan database’ imizin SID’si dg2.

Bu özet bilgilerden sonra physical standby database’ imizi create etmeye başlayabiliriz ;

  • Primary database’ imizi force logging moda alıyoruz;

Alter database force logging

  • Primary database’ in archive modda olması gerekiyor.

Aşağıdaki script ile kontrol edebilirsiniz. Sonuç NOARCHIVELOG dönerse aşağıdaki adımları takip ederek archive moda alabilirsiniz.

select log_mode from v$database  ;

SHUTDOWN IMMEDIATE;

STARTUP MOUNT;

ALTER DATABASE ARCHIVELOG;

ALTER DATABASE OPEN;

–  archive ile ilgili iki önemli parametreyi set ediyoruz.

ALTER SYSTEM SET log_archive_format=’arch_%t_%s_%r_.arc’ SCOPE=spfile

ALTER SYSTEM SET log_archive_dest_1=’location=D:\arch’ SCOPE=spfile

  • Primary database’ inde yok ise bir password file create edilir;

orapwd file=PWDist.ora password=oracle entries=5 force=Y

  • Primary Database’ ine Standby Redo logların create ve configure edilmesi ;

Burada önerilen, primary database’ deki redo logların size’ ı ile standby için create edilecek redo log’ ların size’ larının aynı olmasıdır.  Kaç tane oluşturulacağını şu şekilde hesaplayabiliriz ;

Create Edilecek Standby Redo Log Sayısı = (maximum number of logfiles for each thread + 1) * maximum number of threads

Bir örnekle açıklayalım ;

Primary database’ indeki redo loglarımız,

SQL> select group#,THREAD#,BYTES,status from v$log;

GROUP#    THREAD#      BYTES STATUS

———- ———- ———- —————-

1          1   52428800 INACTIVE

2          1   52428800 INACTIVE

3          1   52428800 CURRENT

thread başına düşen log sayısı = 3

maximum number of thread = 1

Dolayısıyla create edilecek log sayısı = (3+1)*1 = 4

Bu örnek benim primary database’ im deki ile aynı dolayısıyla bende 4 tane standby redo logları create ediyorum.

ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 (‘c:\oracle10g\standby_redo\standby_redo04.log’) SIZE 50M

Database altered

ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 (‘c:\oracle10g\standby_redo\standby_redo05.log’) SIZE 50M

Database altered

ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 (‘c:\oracle10g\standby_redo\standby_redo06.log’) SIZE 50M

Database altered

ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 (‘c:\oracle10g\standby_redo\standby_redo07.log’) SIZE 50M

Database altered

Buradaki Group noları önemli, sıra ile devam etmesi gerekiyor, aralarda atlamalar olmayacak şekilde create ediyoruz.

Primary database’ ine standby redolog ları neden oluşturuyoruz sorusuna, dataguard kurulumunda aslında buna gerek yok ama kurulumdan sonra herhangi bir zamanda

gereklidir.

Standby redologlar create edildikden sonra aşağıdaki sorgu ile kontrol edebiliriz ;

SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG

GROUP#    THREAD#        SEQUENCE#    ARCHIVED       STATUS

——          ——-               ———                        ——–              ———-

4           0                      0                      YES                  UNASSIGNED

5           0                      0                      YES                  UNASSIGNED

6           0                      0                      YES                  UNASSIGNED

7           0                      0                      YES                  UNASSIGNED

4 rows selected

  • Primary database’ in initial parametrelerinin düzenlenmesi  ;

Redo logların transferi için primary database üzerinde bazı initial parametrelerinin düzenlenmesi gerekmektedir. Bunun yanısıra yine olası bir switchover durumunda hata alınmaması için (standby gibi davranabilmesi için)  bazı eklemelerinde yapılması faydalı olacaktır.

Bilmemiz gerekenler şunlar;

Primary database’ imin                           db_unique_name = dg1

Net_service_name = dg1

Standby database’ imin               db_unique_name = dg2

Net_service_name = dg2

Pfile’ de yapılacak olan değişiklerin bir kısmı zaten şu anki pfile’ inizde olan parametreler, kontrol etmeniz yeterli olacaktır.

DB_NAME, CONTROL_FILES, REMOTE_LOGIN_PASSWORDFILE  (exclusive olması gerekiyor), LOG_ARCHIVE_FORMAT (db archive modda olduğunda bu parametrede pfile’ inizde olacaktır.)

Aşağıdaki parametreleri ekliyoruz.

*.control_files=’/data/oracle/oradata/dg1/control01.ctl’,’/data/oracle/flash_recovery_area/dg1/control02.ctl’

*.db_name=’dg1′

*.DB_UNIQUE_NAME=dg1

*.log_archive_dest_1=’location=/data/oracle/arch’

*.log_archive_dest_state_1=’ENABLE’

*.log_archive_dest_state_2=’ENABLE’

*.log_archive_format=’arch_%t_%s_%r_.arc’

*.remote_login_passwordfile=’EXCLUSIVE’

*.LOG_ARCHIVE_CONFIG=’DG_CONFIG=(dg1,dg2)’

*.LOG_ARCHIVE_DEST_1=’LOCATION=/data/oracle/arch/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dg1′

*.LOG_ARCHIVE_DEST_2=’SERVICE=dg2 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dg2′

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE

*.LOG_ARCHIVE_MAX_PROCESSES=30

*.FAL_SERVER=dg2

*.DB_FILE_NAME_CONVERT=’dg2′,’dg1′

*.LOG_FILE_NAME_CONVERT=’/data/oracle/arch_dis/’,’/data/oracle/arch’,’/data/oracle/arch_dis/’,’/data/oracle/arch’

*.STANDBY_FILE_MANAGEMENT=AUTO STANDBY_FILE_MANAGEMENT=AUTO

Log_archive_process’ si 30 olarak set ettim ben, oracle’ ın standby için önermiş olduğu process sayısı 30’ dır. Daha azda yapabilirsiniz.

  • Hem primary sunucuda hemde standby tarafındaki listener ve tnsnames.ora dosyalarında aşağıdaki eklemeleri yapıp, listener servisini stop – start ediyoruz.

Tnsnames.ora doyasında her iki instance’ a ait bilgiler yer alacak şekilde düzenliyoruz.

DG2 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.3.145)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = dg2)

)

)

DG1 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.3.144)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = dg1)

)

)

Listener.ora dosyasınıda aşağıdaki satırları ekliyoruz.

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = dg1)

(GLOBAL_DBNAME = dg1)

(ORACLE_HOME = /data/oracle/11.2.0/dbhome_1)

)

(SID_DESC =

(SID_NAME = dg2)

(GLOBAL_DBNAME = dg2)

(ORACLE_HOME = /data/oracle/11.2.0/dbhome_1)

)

)

 

  • Standby tarafına profile dosyası üzerinde oracle_home, sid gibi değişiklikleri yaptıkdan sonra, orapwd dosyasını primary db’ olduğu sunucudan buraya kopyalıyoruz. Burada orapwdg1 ve orapwdg2 olacak şekilde iki tane passord file oluşturuyoruz. (orapwdg1 dosyası, switchover durumunda problem olmaması için)
  • Standby sunucuda $ORACLE_HOME/dbs klasörü altına manuel olarak (vi editörü ile) initdg2.ora dosyası create edip içerisine sadece DB_NAME=DG2 parametresini ekleyip kaydediyoruz.
  • Standby tarafında $ORACLE_BASE altına /admin/SID/admin klasörünü create ediyoruz.

(rman komutunu çalıştırdığınızda eksik create edilmiş olan bir lokasyon var ise hata verecektir, böyle bir durumda standbydaki oradata lokasyonu silip primary tarafında rman’ e tekrar connect olup komutu tekrar başlatabilirsiniz.)

  • Yine standby tarafında $ORACLE_BASE altına /oradata/SID klasörünü create ediyoruz.
  • Standby database’ ini nomount moda alıyoruz.
[oracle@betadataguard2 admin]$ sqlplus “/as sysdba”

SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 17 00:26:05 2011

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production

SQL> startup nomount pfile=$ORACLE_HOME/dbs/initdg2.ora;

ORACLE instance started.

Total System Global Area  217157632 bytes

Fixed Size                  2211928 bytes

Variable Size             159387560 bytes

Database Buffers           50331648 bytes

Redo Buffers                5226496 bytes

SQL>

  • Primary sunucusu üzerinden Rman’ e connect olup komutumuzu çalıştırıyoruz.
[oracle@betadataguard1 standby_kurulum]$ rman

Recovery Manager: Release 11.2.0.1.0 – Production on Sat Apr 16 19:45:51 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

RMAN> connect target sys

target database Password:

connected to target database: DG1 (DBID=1729884635)

RMAN> connect auxiliary sys@dg2

auxiliary database Password:

connected to auxiliary database: DG2 (not mounted)

Çalıştıracağımız komutumuz ;

run {

allocate channel prmy1 type disk;

allocate channel prmy2 type disk;

allocate channel prmy3 type disk;

allocate channel prmy4 type disk;

allocate auxiliary channel stby type disk;

duplicate target database for standby from active database

spfile

parameter_value_convert ‘dg1′,’dg2′

set db_unique_name=’dg2′

set db_file_name_convert=’/dg1/’,’/dg2/’

set log_file_name_convert=’/dg1/’,’/dg2/’

set control_files=’/data/oracle/oradata/dg2/dg2.ctl’

set log_archive_max_processes=’5′

set fal_client=’dg2′

set fal_server=’dg1′

set standby_file_management=’AUTO’

set log_archive_config=’dg_config=(dg1,dg2)’

set log_archive_dest_2=’service=dg1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=dg1′

;

}

Scriptin outputu ;

RMAN> run {

2>      allocate channel prmy1 type disk;

3>      allocate channel prmy2 type disk;

4>      allocate channel prmy3 type disk;

5>      allocate channel prmy4 type disk;

6>      allocate auxiliary channel stby type disk;

7>      duplicate target database for standby from active database

8>      spfile

9>              parameter_value_convert ‘dg1′,’dg2′

10>             set db_unique_name=’dg2′

11>             set db_file_name_convert=’/dg1/’,’/dg2/’

12>             set log_file_name_convert=’/dg1/’,’/dg2/’

13>             set control_files=’/data/oracle/oradata/dg2/dg2.ctl’

14>             set log_archive_max_processes=’5′

15>             set fal_client=’dg2′

16>             set fal_server=’dg1′

17>             set standby_file_management=’AUTO’

18>             set log_archive_config=’dg_config=(dg1,dg2)’

19>             set log_archive_dest_2=’service=dg1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=dg1′

20>      ;

21>      }

using target database control file instead of recovery catalog

allocated channel: prmy1

channel prmy1: SID=34 device type=DISK

allocated channel: prmy2

channel prmy2: SID=1169 device type=DISK

allocated channel: prmy3

channel prmy3: SID=33 device type=DISK

allocated channel: prmy4

channel prmy4: SID=1167 device type=DISK

allocated channel: stby

channel stby: SID=10 device type=DISK

Starting Duplicate Db at 16-APR-11

contents of Memory Script:

{

backup as copy reuse

targetfile  ‘/data/oracle/11.2.0/dbhome_1/dbs/orapwdg1′ auxiliary format

‘/data/oracle/11.2.0/dbhome_1/dbs/orapwdg2′   targetfile

‘/data/oracle/11.2.0/dbhome_1/dbs/spfiledg1.ora’ auxiliary format

‘/data/oracle/11.2.0/dbhome_1/dbs/spfiledg2.ora’   ;

sql clone “alter system set spfile= ”/data/oracle/11.2.0/dbhome_1/dbs/spfiledg2.ora””;

}

executing Memory Script

Starting backup at 16-APR-11

Finished backup at 16-APR-11

sql statement: alter system set spfile= ”/data/oracle/11.2.0/dbhome_1/dbs/spfiledg2.ora”

contents of Memory Script:

{

sql clone “alter system set  audit_file_dest =

”/data/oracle/admin/dg2/adump” comment=

”” scope=spfile”;

sql clone “alter system set  db_unique_name =

”dg2” comment=

”” scope=spfile”;

sql clone “alter system set  db_file_name_convert =

”/dg1/”, ”/dg2/” comment=

”” scope=spfile”;

sql clone “alter system set  log_file_name_convert =

”/dg1/”, ”/dg2/” comment=

”” scope=spfile”;

sql clone “alter system set  control_files =

”/data/oracle/oradata/dg2/dg2.ctl” comment=

”” scope=spfile”;

sql clone “alter system set  log_archive_max_processes =

5 comment=

”” scope=spfile”;

sql clone “alter system set  fal_client =

”dg2” comment=

”” scope=spfile”;

sql clone “alter system set  fal_server =

”dg1” comment=

”” scope=spfile”;

sql clone “alter system set  standby_file_management =

”AUTO” comment=

”” scope=spfile”;

sql clone “alter system set  log_archive_config =

”dg_config=(dg1,dg2)” comment=

”” scope=spfile”;

sql clone “alter system set  log_archive_dest_2 =

”service=dg1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=dg1” comment=

”” scope=spfile”;

shutdown clone immediate;

startup clone nomount;

}

executing Memory Script

sql statement: alter system set  audit_file_dest =  ”/data/oracle/admin/dg2/adump” comment= ”” scope=spfile

sql statement: alter system set  db_unique_name =  ”dg2” comment= ”” scope=spfile

sql statement: alter system set  db_file_name_convert =  ”/dg1/”, ”/dg2/” comment= ”” scope=spfile

sql statement: alter system set  log_file_name_convert =  ”/dg1/”, ”/dg2/” comment= ”” scope=spfile

sql statement: alter system set  control_files =  ”/data/oracle/oradata/dg2/dg2.ctl” comment= ”” scope=spfile

sql statement: alter system set  log_archive_max_processes =  5 comment= ”” scope=spfile

sql statement: alter system set  fal_client =  ”dg2” comment= ”” scope=spfile

sql statement: alter system set  fal_server =  ”dg1” comment= ”” scope=spfile

sql statement: alter system set  standby_file_management =  ”AUTO” comment= ”” scope=spfile

sql statement: alter system set  log_archive_config =  ”dg_config=(dg1,dg2)” comment= ”” scope=spfile

sql statement: alter system set  log_archive_dest_

About Kamil Turkyilmaz

1979 Tokat/Zile doğumluyum. Yıldız Teknik Üniversitesi 1997 - 2001 mezunuyum ancak 1998 yılından itibaren IT sektöründe, 2000 yılından bu yanada Oracle üzerine çalışmaktayım. 2005 yılına kadar oracle database'i üzerine yazılmış olan kimi uygulamalara software support hizmeti, sonrasında ise oracle veritabanı yöneticiliği olmak üzere yaklaşık 12 yıldır sektör içerisindeyim. Oracle' ın hemen hemen tüm ürünlerinin kurulumu, konfigurasyonu, yönetimi konusundaki çalışmalarıma özel bir bankada oracle dba olarak devam etmekteyim. Aynı zamanda kimi bilişim sitelerinde yazarlık yapıyorum, bunun yanısıra bu alandaki deneyim ve tecrübelerimi daha fazla kullanıcıyla paylaşabilmek adına bir de oracle blog yazarıyım.

İlginizi Çekebilir

SQL Server ile Veri Şifreleme

Bilgi teknolojilerinde verinin güvenliği çok kritik bir öneme sahiptir. Önemli verileri korumak için ekstra bir …

Bir Cevap Yazın