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:
- Es handelt sich um den Users Tablespace – also ist hoffentlich nicht die gesamte Datenbank betroffen.
- Es handelt sich um eine PDB – die anderen PDBs und die CDB sollten weiter funktionieren.
- 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.