Silinen bir şemayı backup tan geri döndürme

Hata sonucunda silinen ya da datalarının bir kısmı bozulan bir şemayı, aldığımız düzenli backuplardan ya da aldığımız bir export dosyasından geri döndürebilirz.

Bu yazıda rman backup ile geri döndürme işlemlerini anlatacağız.

12c versiyonunda bir tabloyu direk backuptan dönme imkanımız var ama 11g de tablo restore işlemini direk olarak yapamıyoruz. 11g versiyonunda birçok şema içerisinde sadece bir şemamızda bozulma varsa ve sadece bu şemayı geri döndürmek istiyorsak db yi başka bir yere restore etmemiz gerekiyor. Aksi taktirde db deki diğer şemaları da eski haline döndürmemiz gerekir. Aynı sunucu üzerinde farklı bir instance olarak ya da doğrudan farklı bir sunucuya restore işlemini gerçekleştirmemiz gerekiyor. Biz örneğimizde farklı bir sunucuya restore edeceğiz ve restore ettiğimiz veritabanından ilgili şemayı export import işlemi ile canlı veritabanına aktaracağız.

Restore işlemini yaparken de şema boyutumuzun, db nin toplam boyutuna oranına göre tüm veritabanını ya da belirli datafile ları restore edebiliriz. Örneğimizde restore ettiğimiz veritabanının adı castprd. Restore işlemini yaparken canlı sunucuda ve dbrestore sunucumuzda 11.2.0.4 database imiz kurulu olduğundan kurulum admınlarını anlatmadan sadece yeni veritabanı oluşturarak restore etme adımlarını anlatacağım.

Bu yazıda veritabanının tamamını restore etme işlemini anlatacağız. Şemamız database toplam boyutuna göre çok küçükse ve ayrı bir tablespace üzerinde bulunuyorsa sadece belirli talbespaceleri restore ederek, veritabanının tamamını restore etmeden de şemamızı kurtarabiliriz. Eğer şemanız dbnin toplam boyutuna göre çok küçükse ilgili yazımızı inceleyebilirsiniz.

Öncelikle canlı veritabanına bağlanarak bir pfile oluşturmamız gerekiyor.

sql> create pfile from spfile;

Normal durumda bir lokasyon vermediğimiz için pfile dosyamız $ORACLE_HOME/dbs dizini altında oluşur.

cat komutu ile init ora dosyamızın içeriğine bakabiliriz. Bu içeriği bir notepad dosyasına atarak gereksiz parametreleri sileceğiz.

Aşağıdaki parametreler database i restore etmemiz için yeterli olacaktır.

*.audit_file_dest='/u01/app/oracle/admin/castprd/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u02/oradata/castprd/control01.ctl','/u02/oradata/castprd/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='castprd'
*.db_unique_name='castprd'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=castprdXDB)'
*.filesystemio_options='SETALL'
*.local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbgensrv3)(PORT=4551)))'
*.log_archive_dest_1='LOCATION=/u02/archive/castprd'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_format='archcastprd_%t_%s_%r.arc'
*.log_archive_max_processes=10
*.open_cursors=300
*.pga_aggregate_target=536870912
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=450
*.sga_target=1073741824
*.undo_tablespace='UNDOTBS1'

Restore edeceğimizi sunucuda $ORACLE_HOME/dbs dizini altında initcastprd.ora isminde bir dosya oluşturuyoruz. Ardından gerekli folderları oluşturuyoruz.

[oracle@DBRESTORE dbs]$ vi initcastprd.ora

Audit dest’i oluşturmazsak veritabanı açılırken aşağıdaki gibi bir hata alabilir.

SQL> startup nomount;
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925

Bu hatayı almamak için aşağıdaki komutlarla klasörleri oluşturuyoruz.

[oracle@DBRESTORE dbs]$ mkdir -p /u02/oradata/castprd/
[oracle@DBRESTORE dbs]$ mkdir -p /u01/app/oracle/admin/castprd/adump

Oracle SID set ederek sqlplus ile veritabanımızı açıyoruz.

[oracle@DBRESTORE dbs]$ export ORACLE_SID=castprd
[oracle@DBRESTORE dbs]$
[oracle@DBRESTORE dbs]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Tue May 9 11:31:51 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2260088 bytes
Variable Size 381682568 bytes
Database Buffers 679477248 bytes
Redo Buffers 5517312 bytes
SQL>

Backup loglarımızdan db yi dönmek istediğimiz tarihteki backup ın loguna bakarak backup sonunda alınan controlfile ın hangi piece içerisinde olduğunu kontrol ediyoruz.

Ekran görüntüsünde de gördüğümüz gibi conrolfile qfs362iu_1_1 isimli piece içerisinde. Buna göre restore scriptimizi aşağıdaki gibi yazıyoruz. Biz backuplarımızı IBM tivoli tape ler üzerinde tutuyoruz. Bu nedenle backup için channel açarken bu tape tanımlarının ayarlarını yaptık. Siz burada channel açarken backupları tuttuğunuz ortama göre configürasyon yapmanız gerekiyor.

set until time “to_date(‘2017-05-01:20:00:11’, ‘yyyy-mm-dd:hh24:mi:ss’)”; komutunu veritabanımızı dataların bozuk olmadığını bildiğimiz.  ‘2017-05-01 saat gece 01:20 ye kadar restore edebilmek için kullanıyoruz.

run
{
allocate channel ch1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo_castprd.opt)';
restore controlfile from 'qfs362iu_1_1';
sql 'alter database mount';
set until time "to_date('2017-05-01:20:00:11', 'yyyy-mm-dd:hh24:mi:ss')";
RESTORE DATABASE;
recover database;
release channel ch1;
}

restore logunun bir kısmını aşağıdaki ekran görüntüsünde görebilirsiniz.

Bu komut ile restore ve recover işlemini tamamladıktan sonra eğer catalog kullanıyorsak  veritabanını sqlplus a geçerek açmamız gerekiyor.  Aksi taktirde canlıdan yeni backup almaya çalıştığımızda aşağıdaki gibi hata verecektir.

RMAN-20011 "target database incarnation is not current in recovery catalog"

Sqlplus a geçerek aşağıdaki komutla db yi açıyoruz.

alter database open resetlogs;

Restore ortamında açtığımız db de ihtiyacımız olan şemayı aşağıdaki komut ile export ediyoruz.

expdp \'/ as sysdba\'schemas=2017_DIGIPLATFORM_CENTRAL dumpfile=cast_digi_yedek_09_05_2017.dmp logfile=cast.log directory=DUMP_DIR

Bundan sonra canlıdaki ilgili şemayı drop ederek boş bir şekilde oluşturabiliriz. Sadece tablo datalarını değiştirmek istiyorsak da aşağıdaki komuttaki gibi. TABLE_EXISTS_ACTION=REPLACE parametresini kullanabiliriz. Bu parametre import ederken mevcutta olan tabloları drop create etmenizi sağlayacaktır.

impdp \'/ as sysdba\'schemas=2017_DIGIPLATFORM_CENTRAL dumpfile=cast_digi.dmp logfile=cast_imp.log directory=DUMP_DIR TABLE_EXISTS_ACTION=REPLACE

Bu şekilde veritabanı içerisindeki  2017_DIGIPLATFORM_CENTRAL şemamızı 1 mayıs tarihine döndürmüş olduk.

Yazı ile ilgili sorularınızı comment olarak sorabilirsiniz. Kapsamlı bir konu olduğundan bazı kısımların bilindiğini farzederek yazdım.