Inhaltsverzeichnis

RMAN Backups manuell entpacken und lesen

Mit dem DBMS_BACKUP_RESTORE lassen sich RMAN Sicherung manuell lesen und entpacken.
Sehr hilfreich beim Restore Scenario „Keinerlei Controlfile mehr, da autobackup vergessen!“.

1. Beispiel: Archivelogs lesen

readarchivelog.sql
DECLARE
   v_device   VARCHAR2 (50);
   v_done      BOOLEAN;
BEGIN
   -- get channel
   v_device :=
             DBMS_BACKUP_RESTORE.deviceallocate(TYPE       => NULL,
                                                ident      => 't1');
   --what to do
   DBMS_BACKUP_RESTORE.restoreSetArchivedLog;
   --which range
   DBMS_BACKUP_RESTORE.restorearchivedlogrange(
     low_change  => 12640521350
    ,high_change => 22640521354
 
   );
   -- do it
   DBMS_BACKUP_RESTORE.restoreBackupPiece
                               (done        => v_done
                                ,handle      => '/backup/SPR/SPR_AR_20070416_850_1'
								,fromdisk => TRUE
                               );
   -- deallocate device
  DBMS_BACKUP_RESTORE.devicedeallocate;
 EXCEPTION
  WHEN OTHERS THEN
  DBMS_BACKUP_RESTORE.devicedeallocate;
END;
/

2. Beispiel: Restore Controlfile

readcontrolfile.sql
DECLARE
   v_device      VARCHAR2 (50);
   v_done        BOOLEAN;
 
   TYPE t_filetable IS TABLE OF VARCHAR2 (255)
      INDEX BY BINARY_INTEGER;
 
   v_filetable   t_filetable;         -- backuppiece names speichern
   v_maxpieces   NUMBER        := 1;  -- Anzahl der backuppieces in backupset
BEGIN
-- Backupsets angeben
   v_filetable (1) := '+ORARECO/mydb/backup/mydb_db_20100427_1006_1';
   v_filetable (2) := '+ORARECO/mydb/backup/mydb_db_20100427_1007_1';
   v_maxpieces := 2;
-- device anfordern
   v_dev := SYS.DBMS_BACKUP_RESTORE.deviceallocate (TYPE       => NULL, ident => 'd1');
-- restore conversation
   SYS.DBMS_BACKUP_RESTORE.restoresetdatafile;
-- Was soll wie angelegt werden sollen
   SYS.DBMS_BACKUP_RESTORE.restorecontrolfileto (cfname      => '/tmp/control01.ctl');
   SYS.DBMS_BACKUP_RESTORE.restorespfileto ('/tmp/spfile.ora');
 
-- Restore
   FOR i IN 1 .. v_maxpieces
   LOOP
      SYS.DBMS_BACKUP_RESTORE.restorebackuppiece (done        => v_done
                                                , handle      => v_filetable (i)
                                                , params      => NULL
                                                 );
 
      IF v_done
      THEN
         GOTO ready_restore;
      END IF;
   END LOOP;
 
   <<ready_restore>>
   -- Deallocate device
   SYS.DBMS_BACKUP_RESTORE.devicedeallocate;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_BACKUP_RESTORE.devicedeallocate;
END;
/

3. Beispiel: Datafiles wiederherstellen

readdatafile.sql
DECLARE
v_device   VARCHAR2 (50);
  v_done     BOOLEAN;
BEGIN
  v_device :=      DBMS_BACKUP_RESTORE.deviceallocate(TYPE       => NULL, ident      => 't1');
  dbms_backup_restore.RestoreSetDatafile; 
  dbms_backup_restore.RestoreDatafileTo(dfnumber => 1,toname => '/tmp/SYSTEM01.DBF');
  dbms_backup_restore.RestoreBackupPiece(done => done,handle => '<backup_piece>', params => NULL);
  dbms_backup_restore.DeviceDeallocate;
 EXCEPTION
  WHEN OTHERS THEN
  DBMS_BACKUP_RESTORE.devicedeallocate;
END;
/