24 Haziran 2011 Cuma

Dataguard Tarafındaki Datafile ler Nasıl Rename Edilir


Dataguard ortamları çoğu zaman donamım  gereksinimleri bakımından production ile birebir olamıyabiliyor (ki uygulamaların birçoğuda bu şekilde) gerek memory gerekse disk kapasiteleri bakımından dataguardın bağlı bulunduğu sunucular productiondan geride oluyor. Durum böyle olunca dataguard tarafını kontrol etmeden production ortamına eklenen datafile’ ler, DG tarafında create edilemediğinden hata alınıyor,  sonrasında MRP processesi artık DG tarafında çalışmadığından senkronizasyon duruyor.  Bu tarz bir durumla karşılaştığımızda neler yapmamız gerekeceğinden bahsetmek istiyorum.
Öncelikle böyle bir durumla karşılaştığımızda alert logda alacağımız hatayı görelim ;
Thu Jun 16 12:08:18 2011
MRP0: Background Managed Standby Recovery process started (test)
Managed Standby Recovery not using Real Time Apply
MRP0: Background Media Recovery terminated with error 1111
Thu Jun 16 12:08:23 2011
Errors in file /u01/oracle/test/bdump/test_mrp0_8661.trc:
ORA-01111: name for data file 32 is unknown – rename to correct file
ORA-01110: data file 32: /oracle/10g/dbs/UNNAMED00032′
ORA-01157: cannot identify/lock data file 32 – see DBWR trace file
ORA-01111: name for data file 32 is unknown – rename to correct file
ORA-01110: data file 32: /oracle/10g/dbs/UNNAMED00032′
Logdan da görüleceği üzere 32 nolu dbf, prod ortamına create edilmiş ancak ordaki dizin DG tarafında olmadığı için (benim örneğimde dizin var ama klasör yoktu)  bu datafile’ i dbf altına UNNAMED olarak atayarak MRP processesini sonlandırmış. Burada yapmamız gereken bu datafile’ leri prod ortamdan bağlı bulunduğu tablespace’ leri backup moda alarak DG tarafına kopyalamak ve rename etmek olacak. Adım adım gidelim ;
Production ortamda ;
Datafile’ in hangi tablespace’ e ait ise o tablespace’ i backup moda alıyorum.
ALTER TABLESPACE deneme BEGIN BACKUP;
Sonra ilgili dbf’ i DG tarafına scp (rcp veya ftp)  ile DG tarafına kopyalalıyoruz. Primary tarafındaki işlemlerin aksamaması için kopyalama biter bitmez Production da tablespace’ i backup moddan çıkartıyoruz.
ALTER TABLESPACE deneme END BACKUP;
Primary tarafındaki işimiz bu kadar, sonrasında DG tarafında recover işlemini durduruyoruz;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
DG’ da file management parametresini manual olacak şekilde set ediyoruz.
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=MANUAL;
Database mount modda değilse, kapatıp mount modda açıyoruz;
STARTUP MOUNT;
Hatalı olan dbf’i rename ediyoruz;
ALTER DATABASE RENAME FILE ‘/u01/ oradata/test01.dbf’ TO ‘/u01/oradata/standby/test01.dbf’;
Ve apply işlemini başlatabiliriz artık ;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
BU şekilde hatalı olarak oluşturulmuş başka datafile’ ler var ise sırası ile tüm datafile’ ler için aynı işlemler tekrar edilmelidir. Sorunlu datafile’ lerin listesi DG tarafına
Select name from v$datafile ;
Sorgusu ile select edildiğinde ilk hata veren dbf ‘ e ait bilgiler görüntülenecektir. Birini düzelttikden sonra apply başlatıldığında bu sefer diğeri için aynı hatayı verecek dolayısıyla yukarıdaki script artık ikinci hatalı olan datafile’ i gösteriyor olacaktır.
Production tarafında herhangi bir rename işlemi yapmadık , ki bunun nasıl yapılması  gerektiğinden daha önce bahsetmiştim.



Kamil TÜRKYILMAZ 

9 Haziran 2011 Perşembe

CRONTAB: You are not Authorized to Use Cron. Sorry.


Crontab dba’ lerin kimi zaman eli ayağı olmaktadır. Crontab, windows’ daki schedule task gibi düşünülebilir, OS seviyesinde, bir takım işlerimizi joblara bağlamak istersek crontab’ dan faydalanırız. Crontab ile ilgili sık kullanılan komutların bazıları ve açıklamaları aşağıdaki gibidir;
crontab -e         = Crontab dosyasını editlemenizi yani joblarınızı tanımlamanızı sağlar,  Eğer daha önce hiç tanımlanmamışsa bu bu komutla create edebilirsiniz.
crontab -l          = Crontab içerisine tanımlanmış olan tüm jobları görüntüleminizi sağlar.
crontab -r         = Crontab dosyasını tamamiyle siler.
crontab -v         = Crontab dosyasını en son hangi userın editlediğini gösterir.
Crontab –e  dediğinizde aşağıdaki bir hata mesajı alırsanız, bu bulunduğunuz userın crontab’ ı editlemesine yetkisi olmadığı anlamına gelir.
”crontab: you are not authorized to use cron.  Sorry.”
Hangi user için crontab’ a yetki vermek istiyorsanız, yapmanız gerekenler;
Root userı ile sisteme bağlanıyoruz,
vi komutu ile /usr/lib/cron/cron.allow dosyasını editleyip içerisine istediğimiz kullanıcı adını yazıp kaydedip çıkıyoruz.
Dosya yok ise create edilmelidir. Sonrasında ilgili user ile sisteme giriş yapıp crontab’ ı kullanabilirsiniz.  Bu aşamadan sonra crontab –l ile crontabı görüntülemeye çalışmak istediğinizde aşağıdaki gibi bir mesaj alırsanız ;
crontab: can’t open your crontab file
Henüz oluşturulmuş bir crontabınız olmadığı anlamına gelirki crontab –e ile dosyayı  editleyebilirsiniz.
Kimi sistemler de
/etc/cron.allow
Dosyasına ilgili userı eklemeniz gerekebilir bilginiz olsun.

Kamil TÜRKYILMAZ 

20 Mayıs 2011 Cuma

ORA-12519:TNS:no appropriate service handler found


Merhaba,

Herhangi bir tool ile database’ e connect olmaya çalışırken tns-12518 gibi bir hata ile karşılaşırsanız bunun iki nedeni olabilir;

Birincisi, database’e yeni start komutu verilmiş veya shutdown komutu ile down olma sürecinde iken bağlanmaya çalışırsanız,

İkincisi database’ de initial parametresi olarak tanımlı olan processes değerine ulaşılmış ve siz üzerine yeni bir connection sağlamaya çalışır iseniz bu şekilde bir hata ile karşılaşırsınız.

Bu hatayı aldığınızda listener loglarına bakacak olursanız hatayı şu şekilde görebilirsiniz;

15-MAY-2011 09:00:00 * (CONNECT_DATA=(SID=test01)(CID=(PROGRAM=c:\oracle\product\11.2.0\bin\sqlplus.exe)(HOST=CLBINFAPP02)(USER=TEST))) * (ADDRESS=(PROTOCOL=tcp)(HOST =turkyilmaz)(PORT=4487)) * establish * test01 * 12519
TNS-12519: TNS:no appropriate service handler found
15-MAY-2011 09:00:15 * (CONNECT_DATA=(SID=test01)(CID=(PROGRAM= c:\oracle\product\11.2.0\bin\emagent.exe)(HOST=turkyilmaz)(USER=SYSTEM))) * (ADDRESS=(PROTOCOL=tcp)(HOST=turkyilmaz)(PORT=50057)) * establish * test01 * 12519
TNS-12519: TNS:no appropriate service handler found

Bu hatanın procesess parametresinden kaynaklanıp kaynaklanmadığını aşağıdaki  sorgu ile test edebilirsiniz ;

SQL> select * from v$resource_limit where resource_name='processes';
RESOURCE_NAME          CURRENT_UTILIZATION                              MAX_UTILIZATION INITIAL_AL  LIMIT_VALU
processes                                                                          177                                        200                200         200

Yukarıda bizim örneğimizdeki durum şu şekilde process parametremiz 200 olarak set edilmiş durumda,  şu anda 177 procesess var ve max proceses limitine ulaşıldığını görüyoruz.

Son olarak eğer bir startup veya shutdown sürecine denk gelmediyseniz, çözüm olarak procesess limit değerini artırabiliriz. Tabi artırmak istiyorsanız, özellikle database’ de belirlediğiniz procesess değerinin üzerine çıkılmasını istemiyor iseniz, hata alan kullanıcıların beklemekden başka bir seçenekleri yok J

Processes değeri artırmak için ;

alter system set processes=150 scope=spfile;

komutunu kullanabilirsiniz. Bu parametre dinamik bir parametre olmadığından dolayı, yeni değerin etkin olabilmesi için database’ in restart edilmesi gerekecektir. 



Kamil TÜRKYILMAZ 

4 Mayıs 2011 Çarşamba

Maximum Datafile Size Nasıl Hesaplanır


Database’ de eklemiş olduğunuz datafile’ lerin aslında bir max size’ ı var. Yani isteseniz de belli bir değerin üstünde bir datafile create edemezsiniz. Bu maximum değer kullandığınız db_block_size parametresi ile doğru orantılıdır.
Örneğin db_block_size’ ınız 8 kb ise oluşturabileceğiniz maximum datafile size limitiniz
= ((4096*1024)-1))*8196 = 34376507388 bytes = 33570807,99 kb = 32783,99 mb ‘ dır.
Kendi ortamlarınız için aşağıdaki formülü kullanarak datafile’ leriniz alabileceği maximum size’ ı hesaplayabilirsiniz.
Hesaplanışı  = ((4096*1024)-1)) *db_block_size
Data detaylı bilgi için;
What is the Maximum Datafile Size Limit In an Oracle Database? [ID 804733.1]
dökümanını okuyabilirsiniz.

--

Maximum datafile size for a SmallFile Tablespace based on 10gR2 documentation would be:

Block Size    Maximum Datafile File Size
-----------     ---------------------------
2k                4194303 * 2k     = 8 GB
4k                4194303 * 4k     = 16 GB
8k                4194303 * 8k     = 32 GB
16k              4194303 * 16k   = 64 GB
32k              4194303 * 32k   = 128 GB

Maximum datafile size for a BigFile Tablespace based on 10gR2 documentation would be:

Block Size    Maximum Datafile File Size
-----------     ---------------------------
2k                 4294967295 * 2k     = 8 TB
4k                 4294967295 * 4k     = 16 TB
8k                 4294967295 * 8k     = 32 TB
16k               4294967295 * 16k   = 64 TB
32k               4294967295 * 32k   = 128 TB

804733.1




Kamil TÜRKYILMAZ

1 Mayıs 2011 Pazar

Windows Security Log Analizi Eğitimi


Merhabalar,
Güvenliğin artık şirketler için vazgeçilemez bir noktada olduğunu biliyoruz.
Şirket içi çalışanlarının yapmış oldukları işlemlerin loglanması, kontrolüde bu kapsamda zaman zaman ciddi bir güvenlik açığı oluşturabiliyor. Bugün bu bahsetmiş olduğum güvenlik konusu ile ilgili olarak bir eğitim duyurusu yapmak istiyorum. Windows security log eğitimi, eğitim içeriğini aynı 
www.logyonetimi.com sitesinin kurucusu da olan Osman Bey organize ediyor. Konuyla ilgilenen veya ilgilenmek isteyen meraklı arkadaşlarımıza duyurulur.
Konuyla ilgili detaylı bilgiye aşağıdaki linkden ulaşabilirsiniz.




Kamil TÜRKYILMAZ

TURKCEORACLE.COM


Merhabalar,
Yazılarımı bundan böyle turkceoracle.com adresinden de sizlerle paylaşıyor olacağım.
Yardımların dan ötürü Ümit (Karaoğul) ve Emre ‘ ye (Baransel) teşekkür ederim.
Bu arada yoğunluk dan dolayı bir süredir ara verdiğim yazılarıma en kısa zamanda tekrar başlamayacağım.
Görüşmek üzere …


Kamil TÜRKYILMAZ 

10 Nisan 2011 Pazar

Step by Step creating a Physical Standby Database on 11gR2


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.



 Kamil TÜRKYILMAZ