بازیابی کنترل‏ فایل با پکیج dbms_backup_restore

به صورت معمول در هنگام بازیابی بکاپ 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.

ارتباط با نویسنده:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

پاسخی بگذارید

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