Inhaltsverzeichnis
Fehlerhaften Namen einer Dateidatei reparieren – Doppelpunkt im Dateinamen auf einem Oracle Windows Datenbank System mit Oracle 11g R2 11.2.0.3
Problem:
Beim Hinzufügen einer Dateidatei zu einem existierenden Tablespace wurde statt dem „.“ ein „:“ im Dateinamen angegeben.
Die Dateidatei wird in der Datenbank registriert, aber nicht unter diesen Namen auf dem Filesystem angelegt, alles hinter dem Doppelpunkt „:“ wird beim Anlegen abgeschnitten. Aus einer „TEST04:DBF“ wird im Filesystem ein „TEST04“ ohne Endung.
Nach dem Anlegen kann nun die Datenbank nun die Datei nicht mehr finden und kommt zu Fehlermeldungen mit dieser Datei (wie ORA-01113: file … needs media recovery ).
Ein Versuch die Datendatei mit drop zu löschen führt nur zu einem „ORA-03262: the file is non-empty“.
Ein Umbenennen der Dateidatei auf den richtigen Namen schlägt mit einem „ORA-01141: error renaming … new file .. not found“ fehl.
Wird der Fehler nicht behoben können auch Fehler dieser Art in der alert.log beobachtet werden:
..
ORA-01135: file 21 accessed for DML/query is offline
ORA-01110: data file 21 : 'D:\ORACLE\ORADATA02\GPI\TEST03:DBF'
..
Der Trick, um diese Problem zu lösen liegt, darin erst die Dateiendatei im „offline state“ mit einer 0 Byte Datei umzubenennen, eine original Oracle DB Datei zu erstellen und dann diese per RMAN wieder zu einer richtigen Datendatei zu recovern, ähnlich wie bei einem Recovery einer Datendatei ohne eigentliches Backup.
Ablauf
- Fehler erzeugen
- Genauen Dateinamen und die File ID ermitteln
- Datei offline nehmen
- Eine 0 byte Datei mit den richtigen Namen anlegen
- Datendatei in der DB auf den richtigen Namen umbennen
- Eine neue leere Datendatei mit dem richtigen Namen erstellen
- Leere Datendatei mit RMAN wieder recoveren und damit zu einer echten DB Datei konvertieren
- Datendatei in der DB online setzen
- Fehler ist behoben
Der Fehler mit dem Doppelpunkt im Dateinamen wird erzeugt:
ALTER tablespace "GPI_TEST" ADD DATAFILE 'D:\oracle\oradata02\GPI\test03:dbf' SIZE 10m / Tablespace altered.
Fehler wird nicht gleich bemerkt und Daten werden eingefügt ( wenn noch keine Daten da sind, lässt sich die Datendatei noch ganz einfach droppen ).
Die Datenbank abfragen um die genaue Datei Nummer und den Namen der Datei zu erfragen:
SQL>@dbfiles F_ID SIZE Tablespace Filename STATUS ---- ------- ------------ ---------------------------------------- ---------- 20 370 GPI_TEST D:\ORACLE\ORADATA02\GPI\TEST01.DBF ONLINE 21 10 GPI_TEST D:\ORACLE\ORADATA02\GPI\TEST02.DBF ONLINE 22 10 GPI_TEST D:\ORACLE\ORADATA02\GPI\TEST03:DBF ONLINE
(Test Script siehe dbfiles.sql
Die fehlerhafte Datei wieder offline setzen:
SQL>ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA02\GPI\TEST03:DBF' OFFLINE; DATABASE altered.
In Filesystem nun eine Datei mit den Namen der korrekten Datei anlegen, aber mit 0 Byte Größe! Zum Beispiel nach einfach mit:
notepad D:\ORACLE\ORADATA02\GPI\TEST03.DBF
Datendatei nun wieder per SQL umbenennen:
sqlplus / AS sysdba SYS@GPI-WORKGROUP\JUPITER>ALTER DATABASE RENAME file 'D:\ORACLE\ORADATA02\GPI\TEST03:DBF' TO 'D:\ORACLE\ORADATA02\GPI\TEST03.DBF'; DATABASE altered.
Falls das nicht klappten sollte, siehe Anmerkung am Ende der Anleitung.
Eine Oracle Datendatei neu erzeugen:
SQL>ALTER DATABASE CREATE datafile 'D:\ORACLE\ORADATA02\GPI\TEST03.DBF'; DATABASE altered.
Die Datendatei ist nun der DB unter dem richtigen Namen bekannt, aber die Datei ist noch leer und damit von DB Sicht defekt. Diese Datei nun wieder mit dem RMAN mit einem Recovery zu einer richtigen „Datendatei“ recovert.
RMAN> CONNECT target / connected TO target DATABASE: GPI (DBID=278277283) RMAN> recover datafile 22; Starting recover at 02-SEP-13 USING target DATABASE control file instead OF recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=121 device TYPE=DISK starting media recovery media recovery complete, elapsed TIME: 00:00:01 Finished recover at 02-SEP-13 RMAN>exit
Nach dem Recovery kann die Datendatei wieder online genommen werden:
sqlplus / AS sysdba SQL>ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA02\GPI\TEST03.DBF' ONLINE; DATABASE altered.
Damit ist die Datendatei umbenannt und kann wieder normal verwendet werden.
Alternativ bei Problem beim Erkennen der 0 Byte Datei
Obiger Ablauf wurde intensiv unter einem Windows2008 System geprüft, auf einem produktiven 2003 System ließ sich dann leider aber die 0Byte Datei der Datenbank nicht „unterschieben“.
Fehler:
SQL> ALTER DATABASE RENAME file 'G:\ORACLE\GPI\SAPDATA5\STGPI_1\GPI:DATA5' TO 'G:\ORACLE\GPI\SAPDATA5\STGPI_1\GPI.DATA5'; * ERROR at line 1: ORA-01511: error IN renaming log/DATA files ORA-01141: error renaming DATA file 11 - NEW file 'G:\ORACLE\GPI\SAPDATA5\STGPI_1\GPI.DATA5' NOT found ORA-01110: DATA file 11: 'G:\ORACLE\GPI\SAPDATA5\STGPI_1\GPI:DATA5' ORA-27047: unable TO READ the header block OF file OSD-04006: ReadFile() failure, unable TO READ FROM file O/S-Error: (OS 38) Reached the END OF the file.
Lösung:
Statt der 0Byte Datei mit dem richtigen Namen eine andere Datendatei der Datenbank „ausgeliehen“, DB gestoppt, bestehende, korrekte Datendatei kopiert und unter den richtigen Namen dort angelegt.
Mit dieser „geliehener“ Datei konnte das Umbenennen durchgeführt werden, nach dem Umbenennen wird diese Datei dann wieder mit dem „create datafile“ Befehlt überschrieben und dann wieder recovert.
Quellen
- How to Recover from ORA-01171 ORA-01122 ORA-01110 ORA-01251 (Doc ID 333620.1)