بازیابی کنترل‏ فایل با 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.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.