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.