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_2 = ''service=dg1 ASYNC
valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=dg1'' comment= ''''
scope=spfile
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area 471830528 bytes
Fixed Size 2214456 bytes
Variable Size 268436936 bytes
Database Buffers 192937984 bytes
Redo Buffers 8241152 bytes
allocated channel: stby
channel stby: SID=9 device type=DISK
contents of Memory Script:
{
backup
as copy current controlfile for standby auxiliary format '/data/oracle/oradata/dg2/dg2.ctl';
}
executing Memory Script
Starting backup at 16-APR-11
channel prmy1: starting datafile copy
copying standby control file
output file
name=/data/oracle/11.2.0/dbhome_1/dbs/snapcf_dg1.f tag=TAG20110416T194634
RECID=4 STAMP=748640795
channel prmy1: datafile copy complete, elapsed
time: 00:00:01
Finished backup at 16-APR-11
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
"/data/oracle/oradata/dg2/temp01.dbf";
switch
clone tempfile all;
set
newname for datafile 1 to
"/data/oracle/oradata/dg2/system01.dbf";
set
newname for datafile 2 to
"/data/oracle/oradata/dg2/sysaux01.dbf";
set
newname for datafile 3 to
"/data/oracle/oradata/dg2/undotbs01.dbf";
set
newname for datafile 4 to
"/data/oracle/oradata/dg2/users01.dbf";
backup
as copy reuse
datafile 1 auxiliary format
"/data/oracle/oradata/dg2/system01.dbf" datafile
2
auxiliary format
"/data/oracle/oradata/dg2/sysaux01.dbf" datafile
3
auxiliary format
"/data/oracle/oradata/dg2/undotbs01.dbf" datafile
4
auxiliary format
"/data/oracle/oradata/dg2/users01.dbf" ;
sql
'alter system archive log current';
}
executing Memory Script
executing command: SET NEWNAME
renamed tempfile 1 to
/data/oracle/oradata/dg2/temp01.dbf in control file
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting backup at 16-APR-11
channel prmy1: starting datafile copy
input datafile file number=00001
name=/data/oracle/oradata/dg1/system01.dbf
channel prmy2: starting datafile copy
input datafile file number=00002
name=/data/oracle/oradata/dg1/sysaux01.dbf
channel prmy3: starting datafile copy
input datafile file number=00003
name=/data/oracle/oradata/dg1/undotbs01.dbf
channel prmy4: starting datafile copy
input datafile file number=00004
name=/data/oracle/oradata/dg1/users01.dbf
output file
name=/data/oracle/oradata/dg2/users01.dbf tag=TAG20110416T194641
channel prmy4: datafile copy complete, elapsed
time: 00:00:03
output file
name=/data/oracle/oradata/dg2/undotbs01.dbf tag=TAG20110416T194641
channel prmy3: datafile copy complete, elapsed
time: 00:00:36
output file
name=/data/oracle/oradata/dg2/system01.dbf tag=TAG20110416T194641
channel prmy1: datafile copy complete, elapsed
time: 00:00:56
output file
name=/data/oracle/oradata/dg2/sysaux01.dbf tag=TAG20110416T194641
channel prmy2: datafile copy complete, elapsed
time: 00:00:56
Finished backup at 16-APR-11
sql statement: alter system archive log current
contents of Memory Script:
{
switch
clone datafile all;
}
executing Memory Script
datafile 1 switched to datafile copy
input datafile copy RECID=4 STAMP=748640857 file
name=/data/oracle/oradata/dg2/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=5 STAMP=748640857 file
name=/data/oracle/oradata/dg2/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=6 STAMP=748640857 file
name=/data/oracle/oradata/dg2/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=7 STAMP=748640857 file
name=/data/oracle/oradata/dg2/users01.dbf
Finished Duplicate Db at 16-APR-11
released channel: prmy1
released channel: prmy2
released channel: prmy3
released channel: prmy4
released channel: stby
RMAN>
Artık
dataguardımız hazır sayılır. Bize kalan sadece apply başlatmak için komutumuzu
çalıştırmak. Standby sunucusu üzerine gidip komutumuzu başlatalım;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY
DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
Database altered.
Artık
dataguardımız hazır sayılır. Şimdi primary ile karşılaştırıp kontrol edelim.
-- Çıkan logları kontrol etmek için;
SQL> SELECT
SEQUENCE#, FIRST_TIME, NEXT_TIME
2 FROM
V$ARCHIVED_LOG
3
ORDER BY SEQUENCE# desc;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- ---------
---------
98 16-APR-11 16-APR-11
98 16-APR-11 16-APR-11
97 16-APR-11 16-APR-11
97 16-APR-11 16-APR-11
96 16-APR-11 16-APR-11
96 16-APR-11 16-APR-11
95 16-APR-11 16-APR-11
95 16-APR-11 16-APR-11
94 16-APR-11 16-APR-11
94 16-APR-11 16-APR-11
93 16-APR-11 16-APR-11
-- Standby tarafında çıkan logların
durumunu kontrol etmek için;
SQL> SELECT SEQUENCE#,
FIRST_TIME, NEXT_TIME
FROM V$ARCHIVED_LOG
ORDER BY SEQUENCE# desc ;
SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
98 16-APR-11 16-APR-11
97 16-APR-11 16-APR-11
96 16-APR-11 16-APR-11
95 16-APR-11 16-APR-11
94 16-APR-11 16-APR-11
93 16-APR-11 16-APR-11
92 16-APR-11 16-APR-11
91 16-APR-11 16-APR-11
90 16-APR-11 16-APR-11
89 16-APR-11 16-APR-11
88 16-APR-11 16-APR-11
-- Standbyda
hangilerinin apply olduğunu görebilmek içinse;
SQL> SELECT SEQUENCE#,APPLIED
FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# desc ;
SEQUENCE# APPLIED
---------- ---------
98 IN-MEMORY
97 YES
96 YES
95 YES
94 YES
93 YES
92 YES
91 YES
90 YES
89 YES
88 YES
Çıkan tüm archiveların apply
olduğunu görebiliyoruz. 11gR2 için
dataguard kurulumunun adım adım nasıl
yapabileceğimizi ifade etmeye çalıştım.Umarım
faydalı olmuştur.
Hiç yorum yok:
Yorum Gönder