بانک اطلاعاتی اوراکل

وحید یوسف زاده

بانک اطلاعاتی اوراکل

وحید یوسف زاده

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




  • ۹۴/۰۹/۰۲

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">