Data Guard Monitoring

Selamlar,

bu makalede Data Guard ile ilgili aşağıdaki konularda script’ler paylaşıcam;

Replikasyon Başlatma/Durdurma

  • Replikasyon başlatma
Real Time Apply:
alter database recover managed standby database using current logfile disconnect;

Redo Apply:
alter database recover managed standby database disconnect from session;
  • Replikasyon durdurma
alter database recover managed standby database cancel;
  • Redo Shipping Durdurma
    Bu sayede eğer aradaki hat gitmişse alert.log’a sürekli hata basmasını önlemek için aşağıdaki komut çalıştırılabilir. Bu data guard için gerekli servisleri durdurmaz, sadece archive log’ların primary’den standby’a gitmesini durdurur.
alter system set log_archive_dest_state_2='DEFER' sid='*';
  • Redo Shipping Başlatma
alter system set log_archive_dest_state_2='ENABLE' sid='*';

Database Açma/Kapatma

  • Primary Database Kapatma Adımları
alter system set log_archive_dest_state_2='DEFER' sid = '*';
alter system switch logfile ;
shutdown immediate

Okumaya devam et

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

Okumaya devam et

Manual GAP resolution

Selamlar,

bu makalede primary ile standby arasında oluşan GAP’in manuel olarak nasıl çözüldüğüne bakıcaz. RBMS versiyon: 10.2.0.4, primary 2 node RAC, standby standalone ASM.

1. İlk önce standby tarafın alert.log’unda aşağıdaki gibi hata mesajlarını görüyorum.

Thu Nov 27 11:33:53 2014
FAL[client]: Failed to request gap sequence 
 GAP - thread 1 sequence 62281-62281
 DBID 3556344702 branch 736909866
FAL[client]: All defined FAL servers have been attempted.

2. Oluşan GAP node 1’in 62281 nolu sequence’inde. Primary tarafa gidip elle bu archive log’u standby tarafına atmadan önce nolur nolmaz diye primary tarafta ilgili archive log’un backup’ını alıyorum.

RMAN> BACKUP ARCHIVELOG FROM SEQUENCE 62281 UNTIL SEQUENCE 62281 THREAD 1;
Starting backup at 27-NOV-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=931 instance=npcdb1 devtype=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: sid=431 instance=npcdb1 devtype=DISK
allocated channel: ORA_DISK_3
channel ORA_DISK_3: sid=449 instance=npcdb1 devtype=DISK
allocated channel: ORA_DISK_4
channel ORA_DISK_4: sid=442 instance=npcdb1 devtype=DISK
channel ORA_DISK_1: starting archive log backupset
channel ORA_DISK_1: specifying archive log(s) in backup set
input archive log thread=1 sequence=62281 recid=2243 stamp=863840353
channel ORA_DISK_1: starting piece 1 at 27-NOV-14
channel ORA_DISK_1: finished piece 1 at 27-NOV-14
piece handle=+FRA/npcdb/backupset/2014_11_27/annnf0_tag20141127t150822_0.476.864745705 tag=TAG20141127T150822 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:08
Finished backup at 27-NOV-14

RMAN> exit

Recovery Manager complete.

3. Backup işlemi tamamlandıktan sonra çalışmaya başlayabilirim. Archive log dosyası ASM içerisinde durduğu için ilk önce onu file system’e almam gerekli. Bunun için;

database version 10GR2 ve altı ise;

asmcmd içerisinde cp komutu çalışmadığı için direk olarak archive log’u file system’e almak mümkün değil. Bunun için RMAN’e bağlanıyorum ve aşağıdaki şekilde ilgili archive log’u file system’e çıkıyorum.

RMAN> copy archivelog '+fra/npcdb/archivelog/2014_11_17/thread_1_seq_62281.595.863840341' to '/export/home/oracle/gap/thread_1_seq_62281.595.863840341';

database version 11GR2 ve üzeri ise;

asmcmd içerisinden cp komutu ile ilgili archive log’u file system’e çıkıyorum.

ASMCMD> cp +fra/npcdb/archivelog/2014_11_17/thread_1_seq_62281.595.863840341 /export/home/oracle/gap/thread_1_seq_62281.595.863840341

4. Archive log’u scp ile standby tarafına gönderiyorum.

scp /export/home/oracle/gap/thread_1_seq_62281.595.863840341 oracle@fkmdb1:/export/home/oracle/gap/thread_1_seq_62281.595.863840341

5. Standby tarafta RMAN’e bağlanıp aşağıdaki komutu çalıştırıyorum.

RMAN> catalog start with '/export/home/oracle/gap/';

Archive log’u catalog’ladıktan sonra otomatik olarak apply edecektir. Bazen biraz beklemek gerekebilir.

Eğer apply etmezse aşağıdaki gibi register edebilirsiniz.

SQL> ALTER DATABASE REGISTER LOGFILE '/oracle/gap/thread_1_seq_62281.595.863840341';

Bu işlemler sonrasında replikasyon kaldığı yerden devam edecektir.

Kolay gelsin.

Restore sırasında alınan “ORA-00020″ hatası

Selamlar,

bu yazımda data guard kurulumu sırasında (rdbms version: 10.2.0.4) aldığım “ORA-00020: maximum number of processes () exceeded” hatasının çözümünü paylaşıcam.

Standby database’i restore ederken aşağıdaki gibi bir hata aldım ve restore işlemi başlamadan durdu.

ORA-19870: error reading backup piece /mnt2/hotbackup/backuppiece1.bck
ORA-19504: failed to create file "+DATA"
ORA-17502: ksfdcre:4 Failed to create file +DATA
ORA-15055: unable to connect to ASM instance
ORA-00020: maximum number of processes () exceeded
ORA-15055: unable to connect to ASM instance
ORA-00020: maximum number of processes () exceeded

Bunun nedeni aslında hata mesajında da yazdığı gibi ASM instance’ındaki processes parametresinin düşük olması. Aslında Oracle ASM instance’ındaki processes parametresi için aşağıdaki değerleri öneriyor;

10G -> 25+15n (n=instance sayısı)
11G -> 35+15n (n=instance sayısı)

Bu hatayı aldığım sırada benim standalone database’imin ASM’inde processes=40 idi. Aslında bu değer önerilen değer ama yine de hata almaya devam ettim. Bunu çözmek için processes parametresini 300 yaptım ve ASM instance’ını kapatıp açtım.

ASM instance’ında;

SQL> alter system set processes=300 scope=spfile;
SQL> shutdown immediate;
SQL> startup

ve restore’u tekrar başlattığımda hatayı almadım ve restore başarılı şekilde devam etti.

Kolay gelsin.

RAC ortamında redo log eklenmesi/çıkartılması

Selamlar,

bu makalede 10G R2 RAC ortamında redo log file ekleyeceğiz, Bu yöntem ile ortamda ASM varsa redo log’ların alias’ları değiştirilebilir ya da redo log boyutları değiştirilebilir. Bizim senaryomuzda hem alias’ını hem de boyutunu değiştireceğiz.

Redo log group’larının ilk hali aşağıdaki gibi;

SQL> select f.member,l.bytes/1024/1024 as "Size in MB" from v$log l,v$logfile f where l.group#=f.group#;
MEMBER Size in MB
-------------------------------------------------- ----------
+DATA/npcdb/onlinelog/redo01.log 50
+FRA/npcdb/onlinelog/redo02.log 50
+DATA/npcdb/onlinelog/group_1.263.861793141 50
+FRA/npcdb/onlinelog/group_1.267.861793143 50
+DATA/npcdb/onlinelog/group_3.268.861793633 50
+FRA/npcdb/onlinelog/group_3.262.861793635 50
+DATA/npcdb/onlinelog/group_4.269.861793637 50
+FRA/npcdb/onlinelog/group_4.261.861793637 50

İlk olarak aşağıdaki parametreleri set ediyorum. Bu sayede redo log’lar hem DATA hem de FRA’da tutulacak.

alter system set db_create_online_log_dest_1 = '+DATA' scope=both sid='*';
alter system set db_create_online_log_dest_2 = '+FRA' scope=both sid='*';

Şimdi önce node1 e redo log group’larını ekliyorum;

alter database add logfile thread 1 group 11 size 75M;
alter database add logfile thread 1 group 12 size 75M;
alter database add logfile thread 1 group 13 size 75M;
alter database add logfile thread 1 group 14 size 75M;

daha sonra node2’ye yani thread 2’ye redo log group’larını ekliyorum.

alter database add logfile thread 2 group 15 size 75M;
alter database add logfile thread 2 group 16 size 75M;
alter database add logfile thread 2 group 17 size 75M;
alter database add logfile thread 2 group 18 size 75M;

Şimdi eski redolog gruplarını silmek için switch yapıyorum.

alter system switch logfile;

redo log group’larının statusune bakıyorum;

column MEMBERS format 99
select STATUS, group#, THREAD#, members, bytes/1024/1024 MB, ARCHIVED, SEQUENCE# from v$log;

Sadece status = INACTIVE olan redo log group’ları drop edilebilir. INACTIVE olana kadar log switch yapılabilir ve aşağıdaki şekilde redo log group’ları drop edilebilir.

alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
alter database drop logfile group 4;
alter database drop logfile group 5;
alter database drop logfile group 6;
alter database drop logfile group 7;
alter database drop logfile group 8;

redo log group’larının son hali şu şekilde;

SQL> select f.member,l.bytes/1024/1024 as "Size in MB" from v$log l,v$logfile f where l.group#=f.group#;
MEMBER Size in MB
-------------------------------------------------- ----------
+DATA/npcdb/onlinelog/group_15.263.863535475 75
+FRA/npcdb/onlinelog/group_15.302.863535477 75
+DATA/npcdb/onlinelog/group_11.275.863535027 75
+FRA/npcdb/onlinelog/group_11.296.863535029 75
+DATA/npcdb/onlinelog/group_12.276.863535039 75
+FRA/npcdb/onlinelog/group_12.297.863535041 75
+DATA/npcdb/onlinelog/group_13.277.863535045 75
+FRA/npcdb/onlinelog/group_13.298.863535047 75
+DATA/npcdb/onlinelog/group_14.278.863535053 75
+FRA/npcdb/onlinelog/group_14.299.863535055 75
+DATA/npcdb/onlinelog/group_16.279.863535479 75
MEMBER Size in MB
-------------------------------------------------- ----------
+FRA/npcdb/onlinelog/group_16.303.863535483 75
+DATA/npcdb/onlinelog/group_17.280.863535485 75
+FRA/npcdb/onlinelog/group_17.304.863535487 75
+DATA/npcdb/onlinelog/group_18.281.863535491 75
+FRA/npcdb/onlinelog/group_18.305.863535493 75
16 rows selected.

Kolay gelsin.

Scan-listener’a 2. portu eklemek

Selamlar,

bu makalede RAC ortamında tek bir scan listener’a ikinci bir port ekliyicez ve 2 instance farklı portlar üzerinden erişime açılacak.
Yani scan-listener’a 1521 portu ile gelen bir session ORCL instance’ına, 1621 portu üzerinden gelen session’lar ise TEST instance’ına bağlanacak.

1521 -> ORCL
1621 -> TEST

Bu işlem için aşağıdaki adımları tek tek izlememiz gerekli;

1- netca çalıştırılır ve 1621 portunu dinleyecek şekilde LISTENER2 adında bir listener oluşturulur.

2- grid user’ında olunduğu kontrol edilir ve aşağıdaki komut ile scan-listener’a 2. port eklenir.

oracle@db1 $ srvctl modify scan_listener -p "TCP:1521/TCP:1621"

3- TEST instance’ının tüm node’larında local_listener ve remote_listener parametreleri değiştirilir.

node_1
alter system set remote_listener="x3-scan:1621" scope=both sid='*';
alter system set local_listener = '(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.104)(PORT = 1621))' scope=both sid='test1';
node_2
alter system set local_listener = '(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.105)(PORT = 1621))' scope=both sid='test2';

4- Listener servisi stop/start edilir.

oracle@rac1:>srvctl stop scan_listener
oracle@rac11:>srvctl start scan_listener

5- Listener kontrol edilir.

[grid@x3n1 ~]$ lsnrctl status listener2

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 22-OCT-2014 10:01:44

Copyright (c) 1991, 2013, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER2)))
STATUS of the LISTENER
------------------------
Alias LISTENER2
Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date 20-OCT-2014 08:57:32
Uptime 2 days 1 hr. 4 min. 13 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/11.2.0/grid/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/x3n1/listener2/alert/log.xml
Listening Endpoints Summary...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER2)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.1.1.102)(PORT=1621)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.1.1.104)(PORT=1621)))
Services Summary...
Service "test" has 1 instance(s).
 Instance "test1", status READY, has 1 handler(s) for this service...
Service "testXDB" has 1 instance(s).
 Instance "test1", status READY, has 1 handler(s) for this service...
The command completed successfully

Kolay gelsin.

DNFS ile database clone (RAC to single instance)

Selamlar,

bu makalede DNFS’in clone özelliğini kullanarak ZFS appliance üzerine backup’ını aldığımız bir database’i hızlı bir şekilde başka bir lokasyona clone’layacağız. Bu işi yeni bir test ortamı oluşturmak için kullanabilirsiniz. Image copy backup alacağımız için restore süresi oldukça kısa olacak.

Dizayn şu şekilde ;

Untitled-1 copyŞimdi adım adım başlayalım. Her adımın başına hangi server üzerinde çalışacağını yazmaya çalıştım.

1. [orcl1 & gantek] Öncelikle DNFS’i mount ediyoruz ve server’ın DNFS’e erişebildiğini kontrol ediyoruz. ‘/dnfs’ dizininin owner’ı oracle ve grubu oinstall olmalı.

[oracle@db dnfs]$ touch /dnfs/testfile
[oracle@db dnfs]$ cd /dnfs
[oracle@db dnfs]$ ls -l
-rw-r--r--+ 1 oracle oinstall 0 Sep 26 2014 testfile

2. [orcl1 & gantek] Tüm server’larda aşağıdaki dizinleri oluşturuyoruz. Bu dizinlere karşılık gelen share’ları da ZFS üzerinde oluşturmamız gerekiyor. Her dizin için share oluşturulmaz ise backup sırasında farklı kanallardan yazma işlemi yapamayız ve backup süremiz uzar.

[oracle@db dnfs]$ cd /dnfs
[oracle@db dnfs]$ mkdir clone_backup1 clone_backup2 clone_backup3 clone_backup4
[oracle@db dnfs]$ ls -l
-rw-r--r--+ 1 oracle oinstall 0 Sep 26 2014 clone_backup1 
-rw-r--r--+ 1 oracle oinstall 0 Sep 26 2014 clone_backup2 
-rw-r--r--+ 1 oracle oinstall 0 Sep 26 2014 clone_backup3 
-rw-r--r--+ 1 oracle oinstall 0 Sep 26 2014 clone_backup4

3. [orcl1] Backup script’ini yazıyoruz ve image copy backup’ı başlatıyoruz. DNFS paralel olarak 4 dizin’e de backup alınıyor. Burada performansı arttırmak için channel sayısı arttırılabilir.

[oracle@db script]$ vi backup.sql
run{
    sql 'alter database begin backup';
    sql 'alter system set "_backup_file_bufcnt"=64 scope=memory';
    sql 'alter system set "_backup_file_bufsz"=1048576 scope=memory';
    configure device type disk parallelism 4 backup type to copy;
    allocate channel ch1 device type disk format '/dnfs/clone_backup1/%d_%T_%p_%U.dbf' ;
    allocate channel ch2 device type disk format '/dnfs/clone_backup2/%d_%T_%p_%U.dbf' ;
    allocate channel ch3 device type disk format '/dnfs/clone_backup3/%d_%T_%p_%U.dbf' ;
    allocate channel ch4 device type disk format '/dnfs/clone_backup4/%d_%T_%p_%U.dbf' ;
    backup as copy database tag '$FullBackUpSet_dbf';
    sql 'alter database end backup';
}
[oracle@db script]$ rman target /
RMAN> @backup.sql

4. [gantek] Değişkenleri set ediyoruz.
master_copy_dir: backup’ların durduğu dizini göstermeli.
clone_file_create_dest: datafile’ların konacağı dizini göstermeli. Clone işlemi tamamlandıktan       sonra tüm datafiler’lar burada olacak.

export ORACLE_SID=gantek
export MASTER_COPY_DIR=/dnfs/clone_backup*
export CLONE_FILE_CREATE_DEST=/u01/app/oracle/oradata/gantek
export CLONEDB_NAME=gantek

Okumaya devam et