به صورت معمول در هنگام بازیابی بکاپ RMAN ، برای بازیابی کنترل فایل از روشهایی نظیر CONTROLFILE AUTOBACKUP و recovery catalog استفاده می شود.
حال زمانی را فرض کنید که به هر دلیلی امکان استفاده از این روشها برای بازیابی کنترل فایل وجود نداردد(مخصوصا به خاطر خطا در زمان بکاپ گیری) در این حالت ممکن است استفاده از پکیج dbms_backup_restore کارساز باشد.
البته استفاده از این روش در مستندات اوراکلی کمتر دیده می شود ولی معمولا در زمان اجرا dbca برای ایجاد بانک، از این پکیج استفاده می شود که می توان با رجوع به فایل rmanRestoreDatafiles.sql در مسیرORACLE_BASE/dbca/DB_NAME$ جزییات آن را مشاهده کرد.
این پکیج در هنگام بازیابی فایلهای RMAN می تواند به صورت کامل جایگزین ابزار RMAN شود منتها RMAN ابزار بسیار ساده تری برای این کار خواهد بود و پکیج dbms_backup_restore پیچیدگی بیشتری دارد.
در ادامه سناریویی را در این زمینه ملاحظه خواهید کرد.
در نظر بگیرید بکاپ گیری خودکار کنترل فایل با دستور زیر غیر فعال شده است(البته این تنظیم، تا قبل از اوراکل 12cR2، به طور پیشفرض غیرفعال می باشد).
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP off;
old RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
new RMAN configuration parameters are successfully stored
با دستور زیر از بانک بکاپ تهیه می کنیم.
RMAN> backup database format ‘/u01/backup_usef/USEF%U’;
input datafile file number=00001 name=+DATA/usef11g/datafile/system.261.896533685
input datafile file number=00002 name=+DATA/usef11g/datafile/sysaux.260.896533789
input datafile file number=00003 name=+DATA/usef11g/datafile/undotbs1.258.896533797
input datafile file number=00004 name=+DATA/usef11g/datafile/users.256.896533801
input datafile file number=00005 name=+DATA/usef11g/datafile/usef_tbs1.268.896533803
piece handle=/u01/backup_usef/USEF0bqn02qs_1_1 tag=TAG20151123T133628 comment=NONE
channel ORA_DISK_1: finished piece 1 at 23-NOV-15
piece handle=/u01/backup_usef/USEF0cqn02rb_1_1 tag=TAG20151123T133628 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 23-NOV-15
فایلهای بکاپ را به سرور دیگری منتقل می کنیم تا این اطلاعات را در آنجا بازیابی کنیم.
[root@source ~]# scp /u01/backup_usef/* 10.52.45.65:/u01/backup_usef/
USEF0bqn02qs_1_1 100% 1187MB 65.9MB/s 00:18
USEF0cqn02rb_1_1 100% 10MB 10.0MB/s 00:00
بازیابی کنترل فایل:
حال با استفاده از بکاپ موجود، کنترل فایل را ایجاد می کنیم.
SQL> startup nomount;
declare
devtype varchar2 (256);
done boolean;
begin
devtype:= dbms_backup_restore.deviceallocate (NULL);
dbms_backup_restore.restoresetdatafile;
dbms_backup_restore.restorecontrolfileto (‘/u01/backup_usef/control01.ctl’);
dbms_backup_restore.restorebackuppiece (‘/u01/backup_usef/USEF0eqn0b5p_1_1’, DONE => done);
end;
دستورات زیر را برای mount کردن دیتابیس اجرا می کنیم:
[oracle@dest ~]$ cp /u01/backup_usef/control01.ctl /u01/backup_usef/control02.ctl
SQL> alter system set control_files=’/u01/backup_usef/control01.ctl’,’/u01/backup_usef/control02.ctl’ scope=spfile;
System altered.
بازیابی دیتافایل:
حال می توانیم به دو روش دیتافایلها را بازیابی کنیم هم با ابزار RMAN و هم با پکیج dbms_backup_restore که در این قسمت با کمک بسته dbms_backup_restore، دیتافایلها را بازیابی می کنیم:
set verify off;
set echo off;
set serveroutput on;
select TO_CHAR(systimestamp,’YYYYMMDD HH:MI:SS’) from dual;
variable devicename varchar2(255);
declare
omfname varchar2(512) := NULL;
done boolean;
begin
dbms_output.put_line(‘ ‘);
dbms_output.put_line(‘ Allocating device…. ‘);
dbms_output.put_line(‘ Specifying datafiles… ‘);
:devicename := dbms_backup_restore.deviceAllocate;
dbms_output.put_line(‘ Specifing datafiles… ‘);
dbms_backup_restore.restoreSetDataFile;
dbms_backup_restore.restoreDataFileTo(1, ‘+DATA/usef11g/datafile/system.273.896558009’, 0, ‘SYSTEM’);
dbms_backup_restore.restoreDataFileTo(2, ‘+DATA/usef11g/datafile/sysaux.272.896558009’, 0, ‘SYSAUX’);
dbms_backup_restore.restoreDataFileTo(3, ‘+DATA/usef11g/datafile/undotbs1.271.896558009′, 0, ‘UNDOTBS1’);
dbms_backup_restore.restoreDataFileTo(4, ‘+DATA/usef11g/datafile/users.270.896558009’, 0, ‘USERS’);
dbms_backup_restore.restoreDataFileTo(5, ‘+DATA/usef11g/datafile/usef_tbs1.269.896558009’, 0, ‘USEF_TBS1’);
dbms_output.put_line(‘ Restoring … ‘);
dbms_backup_restore.restoreBackupPiece(‘/u01/backup_usef/USEF0bqn02qs_1_1’, done);
dbms_backup_restore.restoreBackupPiece(‘/u01/backup_usef/USEF0cqn02rb_1_1’, done);
if done then
dbms_output.put_line(‘ Restore done.’);
else
dbms_output.put_line(‘ ORA-XXXX: Restore failed ‘);
end if;
dbms_backup_restore.deviceDeallocate;
end;
/
استارت بانک:
با استفاده از پکیج dbms_backup_restore امکان بازیابی archivelogها هم وجود دارد که در این قسمت از آنصرف نظر می کنیم.
SQL> alter database open RESETLOGS;
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: ‘+DATA/usef11g/datafile/system.269.896558459’
SQL> ALTER DATABASE RECOVER DATABASE UNTIL CANCEL USING BACKUP
CONTROLFILE;
ORA-00279: change 3497223 generated at 11/23/2015 15:58:34 needed for thread 1
ORA-00289: suggestion :
/u01/oracle/flash_recovery_area/USEF11G/archivelog/2015_11_23/o1_mf_1_6_%u_.arc
ORA-00280: change 3497223 for thread 1 is in sequence #6
SQL> ALTER DATABASE RECOVER CANCEL;
Database altered.
SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.