بازیابی کنترل فایل با dbms_backup_restore
به صورت معمول در هنگام بازیابی بکاپ RMAN ، برای بازیابی کنترل فایل از روشهایی نظیر CONTROLFILE AUTOBACKUP و کاتالوگ استفاده می شود حال زمانی را فرض کنید که به هر دلیلی امکان استفاده از این روشها برای بازیابی کنترل فایل ممکن نیستند(مخصوصا به خاطر خطا در زمان بکاپ گیری) در این حالت ممکن است استفاده از پکیج dbms_backup_restore کارساز باشد
البته استفاده از این روش در مستندات اوراکلی کمتر دیده می شود ولی معمولا در زمان اجرا dbca برای ایجاد بانک، از این پکیج استفاده می شود که می توان با رجوع به فایل rmanRestoreDatafiles.sql در مسیر $ORACLE_BASE/dbca/DB_NAME/ جزییات آن را مشاهده کرد.
البته این پکیج در هنگام بازیابی می تواند به صورت کامل جایگزین RMAN شود ولی RMAN ابزار بسیار ساده تری برای این کار می باشد.
در ادامه سناریویی را در این زمینه ملاحظه خواهید کرد.
در نظر بگیرید بکاپ گیری خودکار کنترل فایل با دستور زیر غیر فعال شده است(البته این تنظیم به طور پیش فرض غیرفعال می باشد).
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
کشف DBID(خارج از موضوع):
در هنگام بازیابی به شکل نرمال، در صورتی که DBID بانک را در اختیار نداشته باشیم، می توانیم به طروق مختلف به آن دستیابی پیدا کنیم که دو روش زیر از نمونه آنها هستند:
روش اول:
strings /u01/backup_usef/USEF0bqn02qs_1_1 |grep "database id" |more
روش دوم:
در صورتی که تنها یک دیتافایل از بانک قبلی هنوز موجود باشد، می توان با استفاده از آن، DB_NAME و DBID بانک را بدست آورد.
SQL> startup nomount pfile='/u01/a.ora';
SQL> alter session set tracefile_identifier = usef;
Session altered.
SQL> alter system dump datafile '+DATA/usef11g/datafile/usef_tbs1.268.896533803' block min 1 block max 10;
System altered.
[root@ source ~]# cd /u01/oracle/diag/rdbms/usef11g/usef11g/trace/
[root@ source trace]# ll *USEF*
-rw-r----- 1 oracle dba 145005 Nov 23 14:13 usef11g_ora_8978_USEF.trc
-rw-r----- 1 oracle dba 75 Nov 23 14:13 usef11g_ora_8978_USEF.trm
[root@ source trace]# cat usef11g_ora_8978_USEF.trc|more
Start dump data block from file +DATA/usef11g/datafile/usef_tbs1.268.896533803 minblk 1 maxblk 10
V10 STYLE FILE HEADER:
Compatibility Vsn = 186647552=0xb200400
Db ID=4128880645=0xf619b805, Db Name='USEF11G'
Activation ID=0=0x0
Control Seq=36217=0x8d79, File size=640=0x280
File Number=5, Blksiz=8192, File Type=3 DATA
Dump all the blocks in range:
buffer tsn: 6 rdba: 0x01400002 (5/2)
scn: 0x0000.000f2231 seq: 0x01 flg: 0x04 tail: 0x22311d01
frmt: 0x02 chkval: 0x9a9b type: 0x1d=KTFB Bitmapped File Space Header
بازیابی کنترل فایل:
حال با استفاده از بکاپ موجود، کنترل فایل را ایجاد می کنیم.
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;
دستورات زیر را برای مونت کردن بانک اجرا می کنیم.
[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.
بازیابی دیتافایل:
حال می توانیم به دو روش دیتافایلها را بازیابی کنیم هم به روش رایج و هم با پکیج 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.
- ۹۴/۰۹/۰۲