Pages

17 Ocak 2011 Pazartesi

DUPLICATE komutu ile Oracle 11g Fiziksel Standby Veritabanı Yapılandırması

Bu yazıda, Oracle 11g ile birlikte gelen RMAN servisinden çalıştırılan DUPLICATE ... FROM ACTIVE DATABASE komutunu kullanarak, primary veritabanının herhangi bir yedeğini almadan ve ayrıca yedeğede ihtiyaç duymadan, primary veritabanı açıkken fiziksel bir standby veritabanı oluşturmasını adım-adım uygulayacağız. Senaryomda her iki sunucuda aynı Oracle dizin lokasyonlarını kullanmaktadır.

Senaryoda kullanılan sistem

Primary veritabanı DB_UNIQUE_NAME: orclprm
Standby veritabanı DB_UNIQUE_NAME: orclstdby

ORACLE_SID: orcl

Primary hostname: linux1 (OEL Linux 5.3)
Standby hostname: linux2 (OEL Linux 5.3)

Oracle software versiyonu: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 

  1. Primary veritabanından fiziksel standby yapılandırmasına başlamadan once, veritabanına loglanmamış direkt yazma işlemlerini engellemek için primary veritabanında “Force Logging” özelliğini etkinleştiriyoruz.
SQL> alter database force logging;
Database altered.

  1. Standby veritabanına primary veritabanındaki password dosyasını kopyalıyoruz.
$ scp $ORACLE_HOME/dbs/orapworcl.ora linux2:$ORACLE_HOME/dbs/

  1. Network yapılandıma dosyalarında standby için gerekli güncellemeleri yapıyoruz.
Hem primary hemde standby veritabanı üzerindeki tnsnames.ora dosyasında aşağıdaki güncellemeleri yapıyoruz.

orclprm =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = linux1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orclprm)
    )
  )

orclstdby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = linux2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orclstdby)
    )
  )

Bu dosyada gerekli değişiklikleri yaptıktan sonra standby sunucudaki aynı lokasyona kopyalıyoruz.

$ scp $ORACLE_HOME/network/admin/tnsnames.ora linux2: $ORACLE_HOME/network/admin/

Standby sunucu üzerindeki listener.ora dosyasında aşağıdaki güncellemeyi yapıyoruz

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = linux2)(PORT = 1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
        (SID_DESC =
        (GLOBAL_DBNAME = orclstdby)
        (ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
        (SID_NAME = orcl)
        )
)

Listener’ı yeniden yükleyip başlatıyoruz.
$ lsnrctl reload
$ lsnrctl start

Veritabanının başlangıçta “orcl” adında bir servisi vardı. Şimdi hem primary hemde standby lokasyonlarında kendi servis isimlerini DB_UNIQUE_NAME adı altında kullanmaları için network yapılandırma dosyalarında gerekli güncellemeleri yaptık. Bundan sonra artık SERVICES_NAMES parametresini değiştirip TNS  kısa isimleri ile bağlantı testini yapabiliriz.
 
SQL> alter system set db_unique_name='orclprm’ scope=spfile;
System altered.
SQL> alter system set service_names='orclprm’ scope=both;
System altered.
SQL> show parameter service

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      orclprm


$ sqlplus system/password@orclprm
SQL*Plus: Release 11.1.0.7.0 - Production on Sat Jan 15 11:05:35 2011
Copyright (c) 1982, 2008, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning and Real Application Testing options

SQL> select host_name from v$instance;

HOST_NAME
-------------------
linux1

SQL> shutdown immediate;
SQL> startup;

  1. Standby sunucu üzerinde geçici olarak kullanacağımız bir init.ora dosyası oluşturuyoruz ve sadece tek bir parametre ekliyoruz. Bunun sebebi standby veritabanının klonlanması öncesinde MOUNT modda açılacak olmasından dolayı veritabanı SID sinin primary veritabanında RMAN bağlantısında tanınması gerekmektedir.
$ vi $ORACLE_HOME/dbs/initorcl.ora

"initorcl.ora" [New file]
DB_NAME=orcl


  1. Standby sunucu üzerinde gerekli dizinleri oluşturuyoruz.
Primary veritabanında AUDIT_FILE_DEST parametresinin değerini kontrol ediyoruz. Bu dizinin aynı zamanda standby sunucu üzerindede bulunduğundan emin oluyoruz..

Primary veritabanı üzerinde:

SQL> show parameter audit_file

NAME                                    TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/oradata/orcl/adump

Standby sunucu üzerinde:

linux2:/u01/app/oracle/oradata> mkdir orcl
linux2:/u01/app/oracle/oradata> cd orcl
linux2:/u01/app/oracle/oradata/orcl> mkdir adump

  1. RMAN servisinde DUPLICATE komutu ile açık primary veritabanının birebir kopyasını standby sunucu üzerine online kopyalamak için kullanılacak scripti /home/Oracle dizininde stdby_create.rcv adı altında oluşturuyoruz. 
DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
SPFILE
SET DB_UNIQUE_NAME='orclstdby'
SET CONTROL_FILES='/u01/app/oracle/oradata/orcl/control01.ctl'
SET LOG_ARCHIVE_CONFIG='dg_config=(orclprm,orclstdby)'
SET LOG_ARCHIVE_DEST_2='SERVICE=orclprm LGWR SYNC REGISTER VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=orclstdby'
SET LOG_ARCHIVE_DEST_STATE_2='ENABLE'
SET STANDBY_FILE_MANAGEMENT='AUTO'
SET FAL_SERVER='orclprm'
SET FAL_CLIENT='orclstdby'
NOFILENAMECHECK;

  1. Standby veritabanını NOMOUNT durumunda başlatıyoruz.
$ sqlplus / as sysdba

SQL*Plus: Release 11.1.0.7.0 - Production on Sat Jan 15 11:12:18 2011
Copyright (c) 1982, 2008, Oracle.  All rights reserved.
Connected to an idle instance.

SQL> startup nomount
ORACLE instance started.

Total System Global Area  217157632 bytes
Fixed Size                  2152328 bytes
Variable Size             159385720 bytes
Database Buffers           50331648 bytes
Redo Buffers                5287936 bytes

  1. Primary sunucu üzerinde standby veritabanını oluşturmak amacıyla daha önceden hazırladığımız DUPLICATE scriptini çalıştırıyoruz. 
rman target sys/password@orclprm auxiliary sys/password@orclstdby cmdfile= /home/oracle/stdby_create.rcv log=/home/oracle/stdby_create.log

  1. Redo taşıma servisi ve redo uygulamasını başlatmak üzere init.ora dosyasındaki bazı parametrelerde aşağıdaki değişiklikleri yapıyoruz. 
Primary veritabanında :

Primary veritabanı standby role geldiği zaman kimin primary rolünü oynadığını sisteme tanıtmak amacıyla FAL_SERVER olarak şuanda standby roldeki servisi gösteriyoruz.  FAL_CLIENT parametreside roller değiştiğinde kimin standby rolüne bürüneceğini belirten parametredir.

SQL> alter system set fal_server='orclstdby' scope=both;
System altered.

SQL> alter system set fal_client='orclprm' scope=both;
System altered.

Fiziksel standby yapılandırmasından sonra primary veritabanında yeni bir tablespace oluşturulduğunda veya yeni bir veri dosyası ilave edildiğinde veya bir tablspace düşürüldüğünde veya mevcut bir veri dosyası kaldırıldığında bu değişikliklerin anında standby sunucuyada senkronize olması için STANDBY_FILE_MANAGEMENT parametresini AUTO modda ayarlıyoruz.

SQL> alter system set standby_file_management=AUTO scope=both;
System altered.

SQL> alter system set log_archive_config='dg_config=(orclprm,orclstdby)' scope=spfile;
System altered.

SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orclprm';
System altered.

Redo taşıma hedef lokasyonu, LOG_ARCHIVE_DEST_2 parametresi içinde SERVICE kısmına standby servisin ismi belirtilmelidir. Eşzamanlı redo taşıma modunun aktif olması için SYNC değerini ekliyoruz. Redo kaynak veritabanından alınacak(primary) redonun standby log dosyasında yazılmadan işleme girmesini engellemek amacıyla AFFIRM değerinide ekliyoruz(aslında eklemesekte SYNC olarak ayarlandığından otomatikman AFFIRM değeride etkindir). Primary roldeyken orclprm servisinin online olarak redo log dosyalarını arşivlemesini istediğimizden dolayı VALID_FOR değeri olarak ONLINE_LOGFILE ve PRIMARY_ROLE anahtarlarını giriyoruz.

SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=orclstdby LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=orclstdby';

  1.  Standby veritabanını kapatıp standby log dosyalarını ilave ediyoruz ve gerçek zamanlı geri yüklemeyi(real time recovery) başlatıyoruz. 
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area 5344731136 bytes
Fixed Size                  2153536 bytes
Variable Size            3154117568 bytes
Database Buffers         2147483648 bytes
Redo Buffers               40976384 bytes
Database mounted.
Database opened.

Buradata standby log dosyalarını ilave ederken önemli olan nokta, primary veritabanındaki mevcut redo log grubu sayısından bir fazla ilave yapmanız ve her standby log grubunun boyutunu primary redo log grubu ile aynı tutmanız. Fiizksel standby yapısındaki veritabanlarında en fazla işlem kaynağı LGWR ve ARCHn prosesleri üzerinde olacağından ve yoğun işlem gören sistemlerde senkronize performansı açısından bu önemlidir.

SQL> alter database add standby logfile group 4 size 100m;
Database altered.

SQL> alter database add standby logfile group 5 size 100m;
Database altered.

SQL> alter database add standby logfile group 6 size 100m;
Database altered.

SQL>  alter database add standby logfile group 7 size 100m;
Database altered.

SQL> recover managed standby database using current logfile disconnect;
Media recovery complete.

SQL> !ps -ef | grep mrp

  oracle 471268      1           0 10:51:16      -  0:02 ora_mrp0_orcl
  oracle 475150     270568  1 11:02:47  pts/0  0:00 grep mrp


  1.  Standby veritabanının koruma seviyesini modunu MAXIMIZE AVAILABILITY olarak değiştiriyoruz.
Primary veritabanında:

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

SQL> startup mount
ORACLE instance started.

Total System Global Area 5344731136 bytes
Fixed Size                  2153536 bytes
Variable Size            3154117568 bytes
Database Buffers         2147483648 bytes
Redo Buffers               40976384 bytes
Database mounted.

Primary veritabanının standby rolüne döneceği zamanda standby olarak standby  log dosyalarıda muhafaza etmesi gerekecektir. Bu yüzden standby sunucuda oluşturduğumuz adet ve büyüklükte oluşturuyoruz. Fiziksel standby veritabanının en optimal performansı açısından standby log dosyalarını ayrı bir fiziksel disk üzerinde tutmanız tavsiye edilmektedir.
SQL> alter database add standby logfile group 4 size 100m;
Database altered.

SQL> alter database add standby logfile group 5 size 100m;
Database altered.

SQL> alter database add standby logfile group 6 size 100m;
Database altered.

SQL>  alter database add standby logfile group 7 size 100m;
Database altered.

SQL> alter database set standby database to maximize availability;
Database altered.

SQL> alter database open;
Database altered.

SQL> select protection_mode,protection_level from v$database;

PROTECTION_MODE              PROTECTION_LEVEL
----------------------------               -----------------------------
MAXIMUM AVAILABILITY   MAXIMUM AVAILABILITY

0 yorum:

Yorum Gönder