Biz veritabanı yöneticileri olarak eskiden, bir tablo silindiğinde yada herhangi bir sebepten belli bir zaman aralığından sonra geri gelmesi gerektiğinde karşımıza birçok fuzuli iş çıkardı. Oracle Database 12C ile birlikte hayatımıza Table Point In Time Recovery diğer bir değişle yedekten tek hareket ile tabloyu geri getirme şansını yakaladık.
Bugünkü yazımızda Oracle Database 12C ve üstündeki sürümlerde kullanabileceğimiz bu özelliği tanıyacağız.
İşlem mantık olarak sizin adına yeni bir instance açıyor ve bu instance üzerine sizin tablonuz olduğu bir veritabanı kayıt ediyor. Kayıt işleminden sonra buradan tablo dışarı çıkartılıp, sizin mevcut veritabanınıza import ediliyor. Bu işlemi belli bir tarihe giderek yapabildiğiniz gibi SCN yada Sequence numarasına görede yapabiliyorsunuz fakat dikkat etmeniz gereken bazı şeyler var.
Bir RMAN yedeklemesinde bulunan tabloları veya tablo bölümlerini kurtarmak için RECOVER komutunu kullandığınızda, aşağıdaki sınırlamalar mevcuttur.
- Veritabanı archivemod üzerinde olması gerekir.
- SYS şemasına ait tablolar ve tablo bölümleri kurtarılamaz.
- SYSTEM ve SYSAUX tablo alanlarından tablolar ve tablo bölümleri kurtarılamaz.
- Standyby veritabanlarındaki tablolar ve tablo bölümleri kurtarılamaz.
- NOT NULL kısıtlamalarına sahip tablolar, REMAP seçeneğiyle kurtarılamaz.
Ufak bir örnek ile açıklayalım. Ben test veritabanı üzerinde çalıştığım için taze bir backup alarak işlem gerçekleştireceğim. Sizde mevcut bir backup varsa bu adımı geçebilirsiniz.
[oracle@node1 ~]$ rman target /
RMAN> backup database plus archivelog;
Starting backup at 16-SEP-20
current log archived
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=406 instance=BUGRADB1 device type=DISK
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=19 RECID=1 STAMP=1051267492
channel ORA_DISK_1: starting piece 1 at 16-SEP-20
channel ORA_DISK_1: finished piece 1 at 16-SEP-20
piece handle=+FRA/BUGRADB/BACKUPSET/2020_09_16/annnf0_tag20200916t104453_0.261.1051267493 tag=TAG20200916T104453 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 16-SEP-20
.
.
.
.
.
.
Starting Control File and SPFILE Autobackup at 16-SEP-20
piece handle=+FRA/BUGRADB/AUTOBACKUP/2020_09_16/s_1051267503.265.1051267505 comment=NONE
Finished Control File and SPFILE Autobackup at 16-SEP-20
RMAN>
Recovery Manager complete.
Şimdi recovery için uygun bir ortam hazırlayalım. Örnek anlatım için tarihe göre recovery yapacağım. Veritabanı saatimi bir kontrol edip örnek bir tablo sileceğim.
[oracle@node1 ~]$ !sql
sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 16 10:45:58 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> alter session set nls_date_format = 'dd/mm/yyyy hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
16/09/2020 10:59:12
Veri tabanı saatim ” 16/09/2020 10:59:12 ” bu saate dönüş yapmak istiyorum. File system üzerinde ” /u01/tempdata/bgrdb ” adında bir dizin mevcut. Veritabanı geçici olarak bu konumu kullanacak.
Öncelikle senaryo gereği tablomu siliyorum
SQL> drop table bugra.personel;
Table dropped.
SQL> commit;
Commit complete.
Tarih ile recovery başlatıyorum.
RMAN> recover table "BUGRA"."PERSONEL" until time "to_date('16/09/2020 10:59:12','dd/mm/yyyy hh24:mi:ss')" AUXILIARY DESTINATION '/u01/tempdata/bgrdb';
Eğer SCN ile yapmak isterseniz ;
RMAN> recover table "BUGRA"."PERSONEL" UNTIL SCN 238107 AUXILIARY DESTINATION '/u01/tempdata/bgrdb';
Recovery başlıyor.
Starting recover at 16-SEP-20
current log archived
using channel ORA_DISK_1
RMAN-05026: warning: presuming following set of tablespaces applies to specified point-in-time
List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace UNDOTBS1
Creating automatic instance, with SID='Aglq'
initialization parameters used for automatic instance:
db_name=BUGRADB
db_unique_name=Aglq_pitr_BUGRADB
compatible=19.0.0
db_block_size=8192
db_files=200
diagnostic_dest=/u01/app/oracle/database/19.3.0
_system_trig_enabled=FALSE
sga_target=3536M
processes=200
db_create_file_dest=/u01/tempdata/bgrdb
log_archive_dest_1='location=/u01/tempdata/bgrdb'
#No auxiliary parameter file used
starting up automatic instance BUGRADB
Oracle instance started
Total System Global Area 3707763120 bytes
Fixed Size 8903088 bytes
Variable Size 721420288 bytes
Database Buffers 2969567232 bytes
Redo Buffers 7872512 bytes
Automatic instance created
contents of Memory Script:
{
# set requested point in time
set until time "to_date('16/09/2020 10:59:12','dd/mm/yyyy hh24:mi:ss')";
# restore the controlfile
restore clone controlfile;
.
.
.
.
.
.
IMPDP> . . imported "BUGRA"."PERSONEL":"SYS_P317" 9.890 KB 5 rows
IMPDP> . . imported "BUGRA"."PERSONEL":"SYS_P318" 9.968 KB 6 rows
IMPDP> . . imported "BUGRA"."PERSONEL":"SYS_P319" 9.906 KB 5 rows
IMPDP> . . imported "BUGRA"."PERSONEL":"SYS_P320" 10.03 KB 7 rows
IMPDP> Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
IMPDP> Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
IMPDP> Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
IMPDP> Job "SYS"."TSPITR_IMP_Aglq_spDm" successfully completed at Wed Sep 16 11:04:59 2020 elapsed 0 00:00:49
Import completed
Removing automatic instance
Automatic instance removed
auxiliary instance file /u01/tempdata/bgrdb/BUGRADB/datafile/o1_mf_temp_hp3qqmch_.tmp deleted
auxiliary instance file /u01/tempdata/bgrdb/FGVT_PITR_BUGRADB/onlinelog/o1_mf_3_hp3qtobf_.log deleted
auxiliary instance file /u01/tempdata/bgrdb/FGVT_PITR_BUGRADB/onlinelog/o1_mf_2_hp3qto97_.log deleted
auxiliary instance file /u01/tempdata/bgrdb/FGVT_PITR_BUGRADB/onlinelog/o1_mf_1_hp3qto86_.log deleted
auxiliary instance file /u01/tempdata/bgrdb/FGVT_PITR_BUGRADB/datafile/o1_mf_users_hp3qtgm4_.dbf deleted
auxiliary instance file /u01/tempdata/bgrdb/BUGRADB/datafile/o1_mf_sysaux_hp3qq94b_.dbf deleted
auxiliary instance file /u01/tempdata/bgrdb/BUGRADB/datafile/o1_mf_undotbs1_hp3qq948_.dbf deleted
auxiliary instance file /u01/tempdata/bgrdb/BUGRADB/datafile/o1_mf_system_hp3qq945_.dbf deleted
auxiliary instance file /u01/tempdata/bgrdb/BUGRADB/controlfile/o1_mf_hp3qq29q_.ctl deleted
auxiliary instance file tspitr_fgvt_61116.dmp deleted
Finished recover at 16-SEP-20
İşlemler tamamlandı. Gördüğünüz gibi eskiden bizim elle yaptığımız işlemi Oracle kendisini yapıyor. Hemde beğenmediğimiz IMPDP ile : ))
Örnek olarak işlem yapılırkenki eklenen instance
Tablomuz başarılı bir şekilde verdiğimiz iki örnekle recovery edildi. İsterseniz recovery işlemi yapmayıp bu tablo için export işlemi yapabilirsiniz.
RMAN> recover table "BUGRA"."PERSONEL" UNTIL SCN 238107 AUXILIARY DESTINATION '/u01/tempdata/bgrdb' DATAPUMP DESTINATION '/tempdata/export' DUMP FILE 'personel_yedek.dmp' NOTABLEIMPORT;
Yada tabloyu farklı bir isimle recovery edebilirsiniz
RMAN> recover table "BUGRA"."PERSONEL" until time "to_date('16/09/2020 10:59:12','dd/mm/yyyy hh24:mi:ss')" AUXILIARY DESTINATION '/u01/tempdata/bgrdb' REMAP TABLE 'BUGRA'.'PERSONEL':'PERSONEL_BCK';
Tabloyu farklı bir isimle recovery yapabildiğiniz gibi, farklı tablespace üzerinede alabilirsiniz.
RMAN> recover table "BUGRA"."PERSONEL" until time "to_date('16/09/2020 10:59:12','dd/mm/yyyy hh24:mi:ss')" AUXILIARY DESTINATION '/u01/tempdata/bgrdb' REMAP TABLE 'BUGRA'.'PERSONEL':'PARLAYAN'PERSONEL_BCK' REMAP TABLESPACE 'TS_BUGRA':'TS_OTHER';
Oracle Database üzerinde bir tablonun RMAN yardımı ile geri getirilmesi konusunu işlediğimiz bu makalenin sonuna geldik.
Tekrar görüşmek dileğiyle,
Kaynak :
https://docs.oracle.com/database/121/BRADV/rcmresind.htm#BRADV859