Recovery mit RMAN ist einfach!

In diesem Blog zeige ich Ihnen, wie einfach es ist, mit RMAN einen Tablespace bzw. eine Datendatei wieder herzustellen.

In meinem letzten Blog „Backup und Recovery mit RMAN ist einfach“ habe ich noch einmal beschrieben, wie einfach es sein kann, eine Datenbank mit RMAN zu sichern, wenn man „Oracle“ einiges davon überlässt.

Im dritten Teil wird es dann um das Clonen bzw. Restore einer Datenbank mit RMAN gehen.

Zunächst einmal brauchen wir eine Datenbank mit einem Fehler. Unter Linux nichts einfacher als das:

dd if=/dev/zero of=/u02/oradata/PAUL/88ECC48AE4632772E0530D63A8C04AEF/datafile/o1_mf_users_gfqznp2m_.dbf' bs=8192 count=1000

Bitte nicht nachmachten – zumindest nicht in der Produktion!

Dieser Eingriff führt jetzt dazu, dass eine Abfrage eine Fehlermeldung produziert:

 SQL> select count(*) from auftraege;
select count(*) from auftraege
       *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 16, block # 482)
ORA-01110: data file 16:
'/u02/oradata/PAUL/88ECC48AE4632772E0530D63A8C04AEF/datafile/o1_mf_users_gfqznp2m_.dbf' 

und jetzt?

Zunächst überlegen wir einmal, was hier passiert ist:

  1. Es handelt sich um den Users Tablespace – also ist hoffentlich nicht die gesamte Datenbank betroffen.
  2. Es handelt sich um eine PDB – die anderen PDBs und die CDB sollten weiter funktionieren.
  3. Die Datenbankinstanz bleibt geöffnet. D.h. vielleicht ist nur ein kleiner Teil der Anwendung betroffen.

Es verbietet sich also, die gesamte Datenbank zu recovern. Wir brauchen nur eine Datei aus dem Backup.

Fragen wir doch einfach einmal den RMAN, vielleicht hat er ja eine Idee:

RMAN> LIST FAILURE;
 
using target database control file instead of recovery catalog
Database Role: PRIMARY
 
List of Database Failures
=========================
 
Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
202        HIGH     OPEN      15-MAY-19     One or more non-system datafiles are corrupt 

Okay, das wussten wir schon. Der Befehl ist aber für die weitere Betrachtung wichtig. Jetzt weiß also auch der RMAN, dass eine Datei defekt ist. Also fragen wir jetzt weiter, was der RMAN den empfehlen würde:

RMAN> ADVISE FAILURE;
 
Database Role: PRIMARY
 
List of Database Failures
=========================
 
Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
202        HIGH     OPEN      15-MAY-19     One or more non-system datafiles are corrupt
 
analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=79 device type=DISK
analyzing automatic repair options complete
 
Mandatory Manual Actions
========================
no manual actions available
 
 
Optional Manual Actions
=======================
1. Automatic repairs may be available if you shutdown the database and restart it in mount mode
 
Automated Repair Options
========================
Option Repair Description
------ ------------------
1      Restore and recover datafile 16
   Strategy: The repair includes complete media recovery with no data loss
   Repair script: /opt/oracle/diag/rdbms/paul/PAUL/hm/reco_1304580712.hm 

RMAN hat jetzt ein Skript mit dem Namen reco_1304580712.hm mit den Vorschlägen für die Fehlerbehebung erstellt. Schauen wir uns diese an:

cat /opt/oracle/diag/rdbms/paul/PAUL/hm/reco_1304580712.hm
# restore and recover datafile
sql 'BOXER' 'alter database datafile 16 offline';
restore ( datafile 16 );
recover datafile 16;
sql 'BOXER' 'alter database datafile 16 online' 

Diese Datei könnten wir jetzt direkt ausführen – müssen wir aber nicht. Auch das kann der RMAN selbst machen:

RMAN> REPAIR FAILURE;
 
Strategy: The repair includes complete media recovery with no data loss
Repair script: /opt/oracle/diag/rdbms/paul/PAUL/hm/reco_3216729380.hm
 
contents of repair script:
   # restore and recover datafile
    sql 'BOXER' 'alter database datafile 16 offline';
    restore ( datafile 16 );
    recover datafile 16;
    sql 'BOXER' 'alter database datafile 16 online';
 
Do you really want to execute the above repair (enter YES or NO)?
 
executing repair script
 
sql statement: alter database datafile 16 offline
 
Starting restore at 15-MAY-19
using channel ORA_DISK_1
 
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00016 to /u02/oradata/PAUL/88ECC48AE4632772E0530D63A8C04AEF/datafile/o1_mf_users_gfqznp2m_.dbf
channel ORA_DISK_1: reading from backup piece /u03/orabackup/PAUL/88ECC48AE4632772E0530D63A8C04AEF/backupset/2019_05_15/o1_mf_nnndf_TAG20190515T141943_gfr103o6_.bkp
channel ORA_DISK_1: piece handle=/u03/orabackup/PAUL/88ECC48AE4632772E0530D63A8C04AEF/backupset/2019_05_15/o1_mf_nnndf_TAG20190515T141943_gfr103o6_.bkp tag=TAG20190515T141943
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 15-MAY-19
 
Starting recover at 15-MAY-19
using channel ORA_DISK_1
 
starting media recovery
media recovery complete, elapsed time: 00:00:01
 
Finished recover at 15-MAY-19
 
sql statement: alter database datafile 16 online
repair failure complete 

Fertig! Die Datenbank ist repariert und die Abfrage wird wieder funktionieren.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen