RAC veritabanının yedekten dönülerek yeniden oluşturulması

30 Eyl by Ahmet Duruöz

RAC veritabanının yedekten dönülerek yeniden oluşturulması

Bir veritabanı tamamen çöktüğünde , yapmanız gereken sıfırdan kurulum ve yedekten dönmek olacaktır. Rman yedeğiniz sağlamsa, arşiv logların yedekleri varsa ve redo log dosyalarına da erişebiliyorsanız , en son ana dönebilirsiniz. Redolog ların da işlenebildiği durumlar complete recovery yapmış oluyoruz. Aksi takdirde incomplete recovery oluyor ki , mutlaka veri kaybı var anlamına geliyor. Çünkü tüm işlemler yürütülmemiş oluyor.

Gelelim veritabanımızı ayağa kaldırma işlemlerine. Öncelikle Oracle RDBMS  ve Grid infrastructure kurulumlarını yapıyoruz. ASM intance’ımız ayakta disk grubumuzun hazır ve Oracle binary’leri kurulmuş durumda ise işleme başlayabiliriz.

Oluşturacağımız veritabanının 2 node’lu rac ve adının da ORCL olacağını varsayalım. Daha önceki veritabanımızın DBID bilgisinin 1039438773 olduğunu varsayalım. DBID bilgisini rman’e bağlanarak öğrenebilirsiniz. Yada v$database görüntüsünde de bu bilgi mevcut. DBID bilgisini daha önceden bir şekilde almış olduğumuzu varsayalım. Hiç almadıysanız bile eski backup loglarında bulabilirsiniz bu bilgiyi.

İlk işlem ASM disk gruplarında gerekli dizinleri oluşturmaktır. Aşağıdaki gibi oluşturabiliriz.

[oracle@db01 ~]$ . oraenv
ORACLE_SID = [ORCL1] ? +ASM1
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@db01 ~]$ asmcmd

ASMCMD> cd DATA
ASMCMD> mkdir ORCL
ASMCMD> cd ORCL
ASMCMD> mkdir CONTROLFILE
ASMCMD> mkdir DATAFILE
ASMCMD> mkdir ONLINELOG
ASMCMD> cd ..
ASMCMD> ls
DATA/
RECO/
ASMCMD> cd RECO
ASMCMD> mkdir ORCL
ASMCMD> cd ORCL
ASMCMD> mkdir CONTROLFILE
ASMCMD> mkdir ONLINELOG
ASMCMD> mkdir ARCHIVELOG

Dosya sisteminde de audit_file_dest parametresi ile belirtilen dizinin tüm node’larda oluşturulması gerekmektedir.

[root@db01 ~]# mkdir -p /u01/app/oracle/admin/ORCL/adump
[root@db02 ~]# mkdir -p /u01/app/oracle/admin/ORCL/adump
Dizinlere oracle kullanıcısının yazabiliyor olması gerekmektedir.
[root@db01 ~]# chown -R oracle:oinstall /u01/app/oracle/admin/ORCL
[root@db02 ~]# chown -R oracle:oinstall /u01/app/oracle/admin/ORCL

Sonraki adım pfile dosyamızı oluşturmak yada yedekten ilgili dizine ($ORACLE_HOME/dbs) kopyalamaktır. Autobackup varsa buradan da dönebilirsiniz spfile dosyanızı.

 

Spfile restore işlemi :

Autobackup dosyamız /backup_files/c-1039438773-20160405-01 şeklinde olduğunu düşünürsek , aşağıdaki gibi önce instance’ı force ile başlatıp sonrasında spfile dosyamızı restore edebiliriz.

RMAN> set dbid=1039438773;
RMAN> startup force nomount
RMAN> RESTORE SPFILE FROM '/backup_files/c-1039438773-20160405-01';

Yedeğiniz yoksa aşağıdaki gibi bir pfile oluşturup, initORCL1.ora (init{SID}.ora) ismiyle kayıt edebilirsiniz.

*.aq_tm_processes=2
*.audit_file_dest='/u01/app/oracle/admin/ORCL/adump'
*.audit_trail='db'
*.cluster_database=true
*.cluster_database_instances=2
*.compatible='11.2.0.4.0'
*.control_files='+DATA/ORCL/controlfile/current.1842.908572993','+RECO/ORCL/controlfile/current.21318.908572995'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_create_online_log_dest_1='+DATA'
*.db_files=300
*.db_name='ORCL'
*.db_recovery_file_dest='+RECO'
*.db_recovery_file_dest_size=3221225472000
*.db_unique_name='ORCL'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
ORCL2.instance_number=2
ORCL1.instance_number=1
*.job_queue_processes=1000
ORCL1.local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.225.16)(PORT=1521))))'
ORCL2.local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.225.14)(PORT=1521))))'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST'
*.memory_max_target=20G
*.memory_target=20G
*.open_cursors=300
*.processes=5000
*.remote_listener='orcl-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sessions=5505
*.shared_servers=0
ORCL2.thread=2
ORCL1.thread=1
*.undo_retention=1440
ORCL2.undo_tablespace='UNDOTBS2'
ORCL1.undo_tablespace='UNDOTBS1'

Eğer yedeği alınan veritabanının bulunduğu disk grup, geri dönülen veritabanının disk grubundan farklı ise pfile dosyasında aşağıdaki satırlarında olması gerekmektedir.

*.log_file_name_convert='+ESKI_DATA','+YENI_DATA','+ESKI_RECO','+YENI_RECO'
*.db_file_name_convert='+ESKI_DATA','+YENI_DATA'

Oluşturduğumuz yada restore ettiğimiz pfile ile instance’ı başlatıyoruz. Öncesinde değişkenleri set edelim. Bunu , /home/oracle/.bash_profile dosyasına ekleyebileceğiniz gibi en kolayı /etc/oratab dosyasına aşağıdaki satırı ekleyip , oraenv ile set etmektir.

/etc/oratab içeriği :
 ORCL1:/u01/app/oracle/product/11.2.0.4/dbhome_1:N

Bu satırı ekledikten sonra oraaenv ile tüm değişkenleri set edebiliriz.

[oracle@db01 ~]$ . oraenv
ORACLE_SID = [+ASM1] ? ORCL1
The Oracle base remains unchanged with value /u01/app/oracle

Artık sqlplus ımızı çalıştırabiliriz.

[oracle@db01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Fri Sep 30 15:20:57 2016

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

Connected to an idle instance.

Instance’ı oluşturduğumuz pfile dosyasından başlatalım.

SQL> startup nomount pfile='/backup_files/pfile_ORCL.ora';

Sonrasında RMAN ile control dosyalarını, control file yedeğimizden, restore edelim.

RMAN> RESTORE CONTROLFILE from '/backup_files/c-1039438773-20160405-01';

Starting restore at 08-APR-16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=4084 instance=ORCL1 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:08
output file name=+DATA/orcl/controlfile/current.1862.908626333
output file name=+RECO/orcl/controlfile/current.22252.908626335
Finished restore at 08-APR-16

Oluşan control file dosyalarını oluşturduğumuz pfile dosyamıza ekleyip, instance ‘ı yeniden başlatalım.

Yeni pfile dosyasındaki control file satırı :

*.control_files='+DATA/orcl/controlfile/current.1862.908626333','+RECO/orcl/controlfile/current.22252.908626335'

Değişiklik sonrasında instance’ı kapatıp yukarıdaki gibi tekrar açalım.

Eğer yedekleri restore ettiğimiz dizin , control file daki yedeklerden farklı ise mount modda ile rman den catalog işlemi yapmak gerekiyor.

Mount modada açıp rman ile catalog işlemi :

SQL> startup mount pfile='/backup_files/pfile_ORCL.ora';
RMAN> catalog start with '/backup_files/';

Veritabanımız nomount modda iken aşağıdaki script ile restore ve recover işlemlerini başlatıyoruz. Aşağıdaki içerikle restore işlemi sonrasında set until time ile belirttiğimiz ana kadar restore ediyoruz. Bunu belirtmezseniz en son getirebildiği ana kadar getirecektir.

Aşağıdaki içerikli , restore_recover.sh şeklide bir dosya oluşturup , yetkilerini 755 verin.

/path_to_script/restore_recover.sh

şeklinde başlatın.

Eğer farklı bir disk grup kullanılıyorsa , datafile isimlerinin değiştirilmesi ve  recover işleminden önce switch database işlemi gerekmektedir. Tüm datafile’lar için “set newname” komutu çalıştırılmalıdır. Bu durumda restore_recover.sh aşağıdaki gibi olmalıdır.

 

rman << EOF
connect target /
run
{
set DBID=1039438773;
sql 'alter database mount';
set newname for datafile 1 to '+YENI_DATA';
set newname for datafile 2 to '+YENI_DATA';
set newname for datafile 3 to '+YENI_DATA';
set newname for datafile 4 to '+YENI_DATA';
set newname for datafile 5 to '+YENI_DATA';
set newname for datafile 6 to '+YENI_DATA';
set newname for datafile 7 to '+YENI_DATA';
set newname for datafile 8 to '+YENI_DATA';
set newname for datafile 9 to '+YENI_DATA';
set newname for datafile 10 to '+YENI_DATA';
set newname for datafile 11 to '+YENI_DATA';
set newname for datafile 12 to '+YENI_DATA';
restore database;
restore archivelog all;
switch database to copy;
set until time "to_date('2016-04-06:00:00:00','yyyy-mm-dd:hh24:mi:ss')";
recover database;
}
EOF

Disk grup adı eskisi ile aynı ise aşağıdaki gibi olmalıdır.

rman << EOF
connect target /
run
{
set DBID=1039438773;
sql 'alter database mount';
restore database;
restore archivelog all;
set until time "to_date('2016-04-06:00:00:00','yyyy-mm-dd:hh24:mi:ss')";
recover database;
}
EOF

İşlemler bittiğinde veritabanı ve arşiv loglar restore edilmiş ve recover işlemi yapılmış olacaktır. Sonrasında eğer redo log ların da işlenmesi gerekmektedir.

Redo log ların işlenmesi için sql plus ile bağlanıyoruz ve tüm redo log larımız için aynı işlemi tekrarlıyoruz. RAC veritabanlarında tüm thread’ler için kullanılan redo log lar bağlantılı olduğundan , aşağıdaki işlemlerde bir thread için verilen redo log sonrasında diğer thread ler için olanı da isteyecektir.

[oracle@db01 ]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Fri Apr 8 14:07:29 2016

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options


SQL> recover database using backup controlfile until cancel;
ORA-00279: change 562385338311 generated at 04/05/2016 17:44:09 needed for
thread 1
ORA-00289: suggestion : +RECO
ORA-00280: change 562385338311 for thread 1 is in sequence #1607


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/backup_files/ONLINELOG/group_12.11832.858521665
ORA-00279: change 562385338311 generated at  needed for thread 2


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/backup_files/ONLINELOG/group_22.2629.858521677
Log applied.
Media recovery complete.

 

 

Böylelikle complete recovery yapmış oluyoruz. Bu durumda direkt olarak veritabanımızı açabiliriz.

RMAN> alter database open;

Aksi takdirde resetlogs  belirterek açmalıyız.

RMAN> alter database open resetlogs;

database opened

Veritabanımız açıldığına göre restore sonrası işlemlere başlayabiliriz.

İlk olarak Pfile dosyamızdan spfile oluşturalım ;

SQL> create spfile='+DATA/ORCL/spfileORCL.ora' from pfile='/backup_files/pfile_ORCL.ora';

$ORACLE_HOME/dbs dizini altındaki pfile (initORCL1.ora) içeriğini aşağıdaki gibi değiştirin.

SPFILE='+DATA/ORCL/spfileORCL.ora'

SYS kullanıcısı içiç şifre belirleyelim.

SQL> alter user sys identified by Welcome1;

Orapw dosyasımızı oluşturalım.

[oracle@db01 ~]$ cd $ORACLE_HOME/dbs
[oracle@db01 ~]$ orapwd file=orapwORCL1 password=Welcome1 entries=5

Gerektiği takdirde redo log gruplarına yeni üye ekleyin.

SQL> ALTER DATABASE ADD LOGFILE MEMBER '+RECO' TO GROUP 1;
SQL> ALTER DATABASE ADD LOGFILE MEMBER '+RECO' TO GROUP 2;
SQL> ALTER DATABASE ADD LOGFILE MEMBER '+RECO' TO GROUP 3;

local_listener ve remote_listener parametrelerini set etmediyseniz , set edin. İlk başlarda pfile oluştururken bu bilgileri tüm node’lar için girmiştik.

SQL> show parameter listener

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
listener_networks		     string
local_listener			     string	 (DESCRIPTION=(ADDRESS_LIST=(AD
						 DRESS=(PROTOCOL=TCP)(HOST=172.
						 16.225.16)(PORT=1521))))
remote_listener 		     string	 orcl-scan:1521

Yeni veritabanızı ve instance’larımızı CRS’e ekleyelim.

[oracle@db01 ]$ srvctl add database -d ORCL -o /u01/app/oracle/product/11.2.0.4/dbhome_1 -p '+DATA/ORCL/spfileORCL.ora' -n ORCL
[oracle@db01 ]$ srvctl add instance -d ORCL -i ORCL1 -n db01
[oracle@db01 ]$ srvctl add instance -d ORCL -i ORCL2 -n db02

İkinci node’a gerekli dosyaları kopyaladıktan , ve ikinci bir undo tablespace oluşturduktan sonra , o node üzerinde de instance’ı başlayabiliriz.

Koplayanacak dosyalar :
db01:$ORACLE_HOME/dbs/initORCL1.ora --> db02:$ORACLE_HOME/dbs/initORCL2.ora
db01:$ORACLE_HOME/dbs/orapwORCL1 --> db02:$ORACLE_HOME/dbs/orapwORCL2
2. node için undo tablespace oluşturulması :
CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 
  '+DATA' SIZE 10G AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
ONLINE
RETENTION NOGUARANTEE
BLOCKSIZE 8K
FLASHBACK ON;
2. node için redo log grup oluşturulması ve yeni member eklenmesi :

Boyut diğer thread için oluşturulan ile aynı olmalıdır. Grup numaraları diğer thread için oluşturulanlardan farklı olmalıdır.

SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 4 '+DATA' SIZE 500m;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 5 '+DATA' SIZE 500m;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 6 '+DATA' SIZE 500m;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE MEMBER '+RECO' TO GROUP 4;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE MEMBER '+RECO' TO GROUP 5;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE MEMBER '+RECO' TO GROUP 6;

Database altered.

Bu aşamada açık olan veritabanı kapatıp srvctl ile tüm instance’larda açabiliriz.

SQL> shu immediate
[oracle@db01 ]$ srvctl start database -d ORCL
[oracle@db01 ]$ srvctl status database -d ORCL
Instance ORCL1 is running on node db01
Instance ORCL2 is running on node db01

Artık , 2 node’lu veritabanımız tüm node’larda çalışır ve açık durumdadır.

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir