RAC VERİTABANI İÇİN YENİ SUNUCULAR ÜZERİNE BACKUPTAN GERİ DÖNME.

Veri tabanımız tamamen çöktüğünde, bazen yeniden kurulum yapmak ve backuptan geri dönmek zorunda kalabiliriz, böyle bir durum için yapılacak örnek bir senaryo üzerinde duracağım.

Öncelikle GRID yazılımın kurulduğunu, RDBMS yazılımının ise software only seçeneği ile kurulumunun yapıldığını varsayarak bunların üzerine yapılacakları konuşuyor olacağız. Yapı olarak 2 node üzerinde çalışacak bir RAC veritabanı, db name OGGTDB ayrıca DBID ise 2000748430 olduğunu biliyorum, DBID RMAN bağlantısı yaparak veya v$database view içerisinden öğrenilebilir, eğer veritabanı makinesine hiç ulaşamıyorsak eski backup loglarında da bu bilgi mevcuttur, fakat biz örnek bir senaryo yaptığımız için eski veri tabanına da yeni veritabanına da şu an ulaşabiliyorum ve bu bilgileri sorgulayabiliyorum. Disk yapımızı bakalım, yeni server içinde aynı disk yapısını ve isimlerini kullanırsak convert işlemlerinden kurtulmuş oluruz.

ASMCMD> lsdg
State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512   4096  1048576     16382     4079                0            4079              0             Y  DATA/
MOUNTED  EXTERN  N         512   4096  1048576      8191     5691                0            5691              0             N  RECO/
          0

DATA ve RECO adında iki Disk grubumuz var. Aşağıda da DBID değerimize bakalım.

SQL> select dbid from v$database;

      DBID
----------
2000748430

Patchset lerimize bakmaktada fayda var aynı patch set seviyesinde olmalı.

[[email protected] ~]$ cd /u01/app/oracle/product/11.2.0.4/db/OPatch/
[[email protected] OPatch]$ ./opatch lsinventory
Oracle Interim Patch Installer version 11.2.0.3.4
Copyright (c) 2012, Oracle Corporation.  All rights reserved.


Oracle Home       : /u01/app/oracle/product/11.2.0.4/db
Central Inventory : /u01/app/oraInventory
   from           : /u01/app/oracle/product/11.2.0.4/db/oraInst.loc
OPatch version    : 11.2.0.3.4
OUI version       : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.2.0.4/db/cfgtoollogs/opatch/opatch2021-07-08_11-26-01AM_1.log
Lsinventory Output file location : /u01/app/oracle/product/11.2.0.4/db/cfgtoollogs/opatch/lsinv/lsinventory2021-07-08_11-26-01AM.txt

--------------------------------------------------------------------------------
Installed Top-level Products (1):

Oracle Database 11g                                                  11.2.0.4.0
There are 1 products installed in this Oracle Home.


There are no Interim patches installed in this Oracle Home.


Rac system comprising of multiple nodes
  Local node = oggtdb1
  Remote node = oggtdb2

--------------------------------------------------------------------------------

OPatch succeeded.

Herhangi bir patch geçilmemiş dolayısıyla bir sorun yok bir PSU olsaydı aynısını yeni DB ye geçtikten sonra recovery ve restore işlemine başlayacaktık.

Şimdi backuplarımızı alalım.

[[email protected] ~]$ rman target /

Recovery Manager: Release 11.2.0.4.0 - Production on Thu Jul 8 12:26:37 2021

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: OGGTDB (DBID=2000748430)

RMAN> backup as compressed backupset database format '/home/oracle/backup/full_dbf_%d_%t_%s.rman' tag='Fulldbs_oggtdb_08072021' plus archivelog format '/home/oracle/backup/arc_%d_%t_%s.rman' tag='ARC_Oggtdb_08072021';


--Controlfile backup

RMAN> backup current controlfile format '/home/oracle/backup/cf_%d_%t_%s.rman';


--Spfile backup

RMAN> backup spfile format '/home/oracle/backup/sp_%d_%t_%s.rman';

Adump dizinini her iki node içinde oluşturalım.

$ mkdir -p /u01/app/oracle/admin/OGGTDB/adump

Buradan sonra aldığımız backupları herhangi yeni sunuculardan herhangi biri üzerinden kullanarak adım adım veri tabanımızı kurtaracağız.

Yeni veritabanımızı rman bağlantısı yaparak nomount modda açıyoruz ilk olarak spfile doyamızı kurtarıyoruz, sonrasında binary olan spfile dosyasını, text formatında olan pfilea dönüştürerek herhangi bir değişiklik yapacaksak bu dosya üzerinde yaparak tekrar spfilea dönüştüreceğiz

RMAN> startup nomount;

RMAN> restore spfile from '/home/oracle/backup/sp_OGGTDB_1077368534_6.rman';
$ sqlplus / as sysdba

SQL> create pfile from spfile;


$ cd u01/app/oracle/product/11.2.0.4/db/dbs

$ ls
hc_OGGTDB1.dat  initOGGTDB1.ora  init.ora  spfileOGGTDB1.ora

Eğer disk Gruplarının isimlerinde vb. isim değişikliklerimiz varsa pfile içerisine convert parametresini eklmeliyiz ayrıca RMAN restore komutuna da convert ifadesi eklememiz gerekecektir.

*.log_file_name_convert='+OLD_DATA','+NEW_DATA','+OLD_RECO','+NEW_RECO'
*.db_file_name_convert='+OLD_DATA','+NEW_DATA'

Bizim durumuzda isimler birebir aynı o yüzden bu parametreleri değiştirme ihtiyacımız yok fakat memory değişikliklerinde SGA ve PGA parametreleri değiştirilmesi gerekir.

/etc/oratab dosyasına aşağıdaki satırı eklemeliyiz.

OGGTDB1:/u01/app/oracle/product/11.2.0.4/db:N --1. Node için
OGGTDB2:/u01/app/oracle/product/11.2.0.4/db:N --2. Node için

ARdından veri tabanımızı kapatıp nomount modda tekrar pfile ile açalım

SQL> shutdown abort

SQL> startup nomount pfile='/u01/app/oracle/product/11.2.0.4/db/dbs/initOGGTDB1.ora';

Şimdi Controlfile kurtarma işlemine başlayalım

RMAN> restore controlfile from '/home/oracle/backup/cf_OGGTDB_1077368618_8.rman';

Control file yeri ve ismi kontrol edilir sonrasında pfile üzerinde yeniden bu yerler düzenlenir veritabanı kapatılır ve mount modda açılır,

ASMCMD> pwd
+DATA/OGGTDB/CONTROLFILE
ASMCMD> ls
current.268.1077375423

initOGGTDB1.ora pfile dosyasına aşağıdaki satırı düzenliyoruz.

*.control_files='+DATA/OGGTDB/CONTROLFILE/current.268.1077375423'
SQL> shutdown abort

SQL> startup mount pfile='/u01/app/oracle/product/11.2.0.4/db/dbs/initOGGTDB1.ora';

Backuplarımızın kaydını tutan controlfile dır ve şu an backupların yeri hakkında controlfile dosyasında eski veritabanı için bilgiler var onu güncellememiz gerekiyor, yani backuplarımızı controlfile dosyasına kaydetmemiz lazım.

RMAN> catalog start with '/home/oracle/backup/';

using target database control file instead of recovery catalog
searching for all files that match the pattern /home/oracle/backup/

List of Files Unknown to the Database
=====================================
File Name: /home/oracle/backup/cf_OGGTDB_1077368618_8.rman

Do you really want to catalog the above files (enter YES or NO)? yes

cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /home/oracle/backup/cf_OGGTDB_1077368618_8.rman

Mount modda iken kurtarma işlemine başlamamız gerekiyor, eğer farklı disk group isimleri kullanılmış ise aşağıdaki gibi convert deyimleri içeren bir RMAN scripti çalıştırmamız gerekmektedir. Scriptimiz restore_recovey.sh

rman << EOF
connect target /
run
{
set DBID=2000748430
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;
recover database;
}
EOF

İsimlerde bir değişiklik yoksa;

rman << EOF
connect target /
run
{
set DBID=2000748430
sql 'alter database mount';
restore database;
restore archivelog all;
switch database to copy;
recover database;
}
EOF

İşlemler tamamlandıktan sonra bir incarnation noktası yaratarak veri tabanımızı açalım.

SQL> alter database open resetlogs;

ASM içerisine spfile oluşturalım.

SQL> create spfile='+DATA/OGGTDB/PARAMETERFILE/spfileOGGTDB.ora' from pfile='/u01/app/oracle/product/11.2.0.4/db/dbs/initOGGTDB1.ora';

Pfile dosyası içerisine spfile adresimizi yazalım.

SPFILE='+DATA/OGGTDB/PARAMETERFILE/spfileOGGTDB.ora'

SYS şifremizi oluşturalım.

SQL> alter user SYS identified by Welcome2;

Password file dosyamızı oluşturalım,

[[email protected] dbs]$ pwd
/u01/app/oracle/product/11.2.0.4/db/dbs
[[email protected] dbs]$ orapwd file=orapwOGTDB1 password=Welcome2 entries=5;
[[email protected] dbs]$ ls
hc_OGGTDB1.dat  initOGGTDB1.ora  init.ora  orapwOGTDB1  spfileOGGTDB1.ora

Yeni redo log gruplarımızı oluşturalım.

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;

Yeni bir database olarak CRS içerisine kaydedelim;

$ srvctl add database -d oggtdb -o /u01/app/oracle/product/11.2.0.4/db/ -p '+DATA/OGGTDB/PARAMETERFILE/spfileOGGTDB.ora'
$ srvctl add instance -d oggtdb -i OGGTDB1 -n dupdb1
$ srvctl add instance -d oggtdb -i OGGTDB2 -n dupdb2

Gerekli dosyaları 2. Noda kopyalayalım,

$ scp initOGGTDB1.ora [email protected]:/u01/app/oracle/product/11.2.0.4/db/dbs/initOGGTDB2.ora

$ scp orapwOGTDB1 [email protected]:/u01/app/oracle/product/11.2.0.4/db/dbs/orapwOGTDB2

2. Node için UNDO tablespace oluşturalım

CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 
'+DATA' SIZE 10G AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
ONLINE
RETENTION NOGUARANTEE
BLOCKSIZE 8K
FLASHBACK ON;

Redlog ve Threadleri kontrol edelim eksik varsa oluşturalım.

Veritabanını kapatalım ve srvctl komutu ile açalım.

SQL> shu immediate;

$ srvctl start database -d oggtdb
$ srvctl status database -d oggtdb
Instance OGGTDB1 is running on node dupdb1
Instance OGGTDB2 is running on node dupdb2

Evet backuptan döndük ve veritabanı sağlıklı bir şekilde çalışıyor.