Thomas Kramer

IT-COW | All posts tagged 'Oracle'

Oracle-Datenbankinstanz wieder korrupt / gefixt

By Administrator at Februar 15, 2011 22:35
Filed Under: Administration, Workarounds

Eigentlich sollte man meinen dass wenn sowohl der OracleService$Instanz$- als auch der OracleOraDb11g_home1TNSListener-Dienst sich starten lassen – und keinen Fehler in die Windows-Eventlogs geschrieben haben – sich auch immer problemlos auf die Daten der Datenbankinstanz zugreifen lässt.

 

In meinem Fall kann ich nun die Dienste starten und mich im Oracle SQL Developer problemlos dagegen connecten, aber es werden keine Tabellen, Indizes etc. mehr aufgelistet. Erst ein Einblick in SQLPlus brachte die Probleme zutage.

 

Dazu öffnet man das Startmenü in Windows, tippt CMD ein und drückt dann gleichzeitig Strg + Shift + Enter – was dazu führt das die DOS-Eingabeaufforderung im Administrator-Modus geöffnet wird (nach Eingabe des Admin-Passwortes über UAC).

 

Anschließend tippt man dort sqlplus / as sysdba ein. Nach Ausführung von

 

shutdown;

startup;

 

erhielt ich die Fehlermeldungen

 

ora-01172: Recovery-Vorgang von Thread 1 ist bei Block 153 in Datei 3 stehengeblieben.

ora-01151: Block mit Media Recovery wiederherstellen, Backup zurückschreiben, falls erforderlich

 

Die gleichen Fehlermeldungen erhalte ich sowohl bei den Befehlen startup; als auch bei alter database open; - es ist demnach eine Oracle-Datei korrupt.

 

Um welche Datei handelt es sich bei Datei 3? Der Thread im Oracle-Forum brachte mich darauf, einmal in der Systemtabelle V$DATAFILE nachzusehen – der Spaltenaufbau dieser Tabelle lässt sich übrigens hier nachlesen. Mit dem folgenden SQL-Befehl lässt sich der dazugehörige Dateiname auslesen:

 

select name from v$datafile where file#=3;

 

Bei mir handelt es sich dabei um den Undo-Tablespace von Oracle, zu meiner Datenbankinstanz. Gemäß Link habe ich dann ganz einfach versucht das datafile mit

 

recover datafile ‘<datafile-name>’;

 

wiederherzustellen (recover datafile 3 nimmt er aber auch an), was mit diesen Meldungen quittiert wurde:


ora-00283: Recovery Session wegen Fehlern abgebrochen

ora-00264: Kein Recovery nötig;

 

Ob Eingabe von recover datafile; oder alter database recover; machte übrigens keinen Unterschied, die gleichen Fehlermeldungen kommen auf.

 

Dann habe ich mir doch einmal die genauen Fehlermeldungen bei Oracle durchgelesen, Oracle führt dazu eine Liste mit Fehlernummern – diese sind über diesen Link einsehbar. Für Firefox ist übrigens auch ein SearchPlugin verfügbar um direkt nach Oracle Messages zu suchen: Link.

 

Nachfolgend die betreffenden Erklärungen zu den Fehlern, gemäß Oracle:

 

ORA-01172 recovery of thread string stuck at block string of file string
Cause: Crash recovery or instance recovery could not apply a change to a block because it was not the next change. This can happen if the block was corrupted and then repaired during recovery.
Action: Do a RECOVER DATAFILE for the file containing the block. If this does not resolve the problem, then restore the file from a backup and recover it.

 

ORA-01151 use media recovery to recover block, restore backup if needed
Cause: Crash recovery or instance recovery could not apply a change to a block because it was not the next change. This can happen if the block was corrupted and then repaired during recovery. This message is usually accompanied by ORA-01172.
Action: There is additional information for ORA-01172. Perform a RECOVER datafile for the file containing the block. If this does not resolve the problem, restore the file from a backup and recover it again.

 

ORA-00283 recovery session canceled due to errors
Cause: An error during recovery was determined to be fatal enough to end the current recovery session.
Action: More specific messages will accompany this message. Refer to the other messages for the appropriate action

 

Fehler 1172 besagt also das ich mit recover datafile die Systemdatei wiederherstellen soll, aber mit Fehler 283 bzw. 264 kam dabei heraus das die Systemdatei gar nicht defekt ist – oder wohl eher nicht als defekt erkannt wird.

 

Über diesen Link im Oracle-Forum habe ich dann diese Aussage gefunden:

 

User Managed backup V$RECOVER_FILE view displays the status of files needing media recovery.
To find which datafiles need recovery, use this query
SELECT FILE#, ERROR, ONLINE_STATUS, CHANGE#, TIME
FROM V$RECOVER_FILE;

 

Bei der Definition der Systemtabelle V$RECOVER_FILE steht ebenfalls: This view displays the status of files needing media recovery.


Eine entsprechend ausgeführte Abfrage select * from V$RECOVER_FILE; listet aber keine Einträge in dieser Tabelle auf, die oben erwähnten Fehlermeldungen sind also widersprüchlich.

 

Dann endlich habe ich den genau zu meinem Fall passenden Thread im Oracle-Forum gefunden: Link. Man beachte die folgenden Textpassagen:

 

(inoffizieller User): So I guess you are out of options with your current status. Please contact oracle support as the database is prod and playing around wouldn't be good.

 

(offizieller Oracle-Supporter): 1]Supported Solution: Restore-Incomplete recovery the DB from backup or rebuild the DB using an export dump. 2]Internal (Not-supported) Solution: Update undo$ to change the status$ = 1 (undo segment is dropped) for the corrupted undo segment.

[..]

 

Lösung zu 2 liste ich nicht komplett auf => siehe Link.

 

Ein anderer inoffizieller User ergänzte danach noch:

 

"Nice" solution, of course, […] but [..] Reason 1) the OP will be able to open the database, but 2) the database will be in an inconsistent state (you have, at least, one transaction that is not properly finished)

 

Den Undo-Tablespace zu löschen und neu zu erstellen scheitert auch daran, das sich die Datenbank eben nicht öffnen lässt – insofern bleibt wohl wirklich nur die Möglichkeit die Datenbank über ein Backup wiederherzustellen oder neu zu erstellen.

 

Daher habe ich mich nun doch dazu entschlossen die Datenbank neu anzulegen. Update 17.2.2011: den Rest dieser Datenbankinstanz habe ich dann über den "Datenbank-Konfigurationsassistenten" von Oracle entfernt, dabei kam diese Fehlermeldung auf:

 

Die Datendateien für die Datenbank mit dem SID "XYZ" konnten nicht bestimmt werden, weil die Datenbank nicht hochgefahren werden konnte. Soll Dienst dennoch gelöscht werden? ORA-01109: Datenbank nicht geöffnet.

 

bejaht und fortgesetzt... danach versucht über den gleichen Assistenten die Instanz neu zu erstellen, was aber mit folgender Fehlermeldung quittiert wurde:

 

ORA-01501: CREATE DATABASE nicht erfolgreich

ORA-00200: Kontrolldatei konnte nicht erstellt werden [..] erstellte Datei bereits vorhanden

 

Das Erstellen musste ich dann vorerst abbrechen, um das Verzeichnis von der Datenbankinstanz von Hand zu löschen: $Lfwk$:\app\admin\oradata\$Instanz$\. Anschließend liess sich dann endlich die neue Instanz über den Assistenten einrichten.

 

Nach der Deinstallation war übrigens noch der OracleService$Instanz$-Dienst in der Diensteverwaltung registriert (obwohl ich F5 gedrückt hatte und trotz anderweitiger Meldung des Assistenten), aber daran hatte er sich beim Neueinrichten der gleichen Instanz nicht gestört - falls er das bei euch doch tun sollte, hier und hier finden sich Links um einen Dienst händisch zu löschen.

 

Anschließend musste ich natürlich den anwendungsspezifischen Tablespace erstellen, hier findet sich eine gute Übersicht über die dazu notwendigen SQL-Befehle: Link. Für die Einrichtung von Datenbank-Benutzern findet sich hier ein guter Link. Dann kommen noch die Rechte-Zuweisungen über GRANT dran, siehe hier und hier - CONNECT wird benötigt um sich mit diesem Benutzer einzuloggen, DBA wird (u. a.) benötigt um über diesen Benutzer einen Dump einzuspielen.

 

Danach konnte ich endlich über

 

imp userid=$Benutzer$/$Passwort$@$Instanz$ full=y

 

einen alten Dump einspielen. Heutzutage soll man ja eher Oracle Data Pump (bzw. sein Kommandozeilenutility impdp) benutzen, aber die alten imp/exp-Programme funktionieren auch noch. Außerdem sind die mit exp erstellten Dumps nicht zu impdp kompatibel.

 

Weiterführende Links

 

  • Wichtigste V$-Views für Backup und Recovery: Link.
  • Oracle Database Backup and Recovery FAQ: Link.
  • Managing the Undo Tablespace: Link.
  • allgemein ein gutes Blog zu Oracle: Link.

 

Monats-Liste