UNDO TABLESPACE kann nicht gelöscht werden

7

Wir haben Oracle 11gR1 RAC zwei Instanzen auf zwei verschiedenen Servern, neuer Undo-Tablespace UNDOTBS20140508 erstellt 30G, ich möchte die alte UNDOTBSX02 entfernen , ich habe Folgendes getan:

CREATE UNDO TABLESPACE UNDOTBS20140508  DATAFILE '+DATA/....../UNDOTBS20140508' SIZE 20G;
ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS20140508;
DROP TABLESPACE UNDOTBSX02 INCLUDING CONTENTS AND DATAFILES;

Beim Versuch, UNDOTBSX02 zu löschen , wird der folgende Fehler angezeigt :

Error starting at line : 13 in command -
DROP TABLESPACE UNDOTBSX02 INCLUDING CONTENTS AND DATAFILES
Error report -
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 57
ORA-30013: undo tablespace 'UNDOTBSX02' is currently in use
00604. 00000 -  "error occurred at recursive SQL level %s"
*Cause:    An error occurred while processing a recursive SQL statement
           (a statement applying to internal dictionary tables).
*Action:   If the situation described in the next error on the stack
           can be corrected, do so; otherwise contact Oracle Support.

Ich habe UNDOTBSX02 auf ausstehende Transaktionen überprüft und sie sind leer. Also, wie man es fallen lässt?

Hinweis : Ich bin kein Oracle DBA, muss diese Aufgabe jedoch ausführen.

Mohammad Jolani
quelle
Hallo, woher weißt du, dass es keine Transaktion mit den alten Undo-TBS gibt? Möglicherweise müssen Sie nur auf das Rückgängigmachen der Aufbewahrung warten. Könnten Sie die Datenbank neu starten?
Eliatou
Wie @eliatou sagt, wahrscheinlich ein Retentionsproblem. oracleflash.com/32/… fasst es zusammen
Philᵀᴹ
Keine verbundene Sitzung SELECT a.name, b.status, d.username, d.sid, d.serial # FROM v $ rollname a, v $ rollstat b, Transaktion c, v $ session d WHERE a.usn = b. usn AND a.usn = c.xidusn AND c.ses_addr = d.saddr AND a.name IN (SELECT segment_name FROM dba_segments WHERE tablespace_name = 'UNDOTBSX02');
Mohammad Jolani
ok, keine Transaktion mehr. Welche Retentionszeit? SQL> sho Parameter UNDO_RETENTION. Könnten Sie Ihre Datenbank neu starten?
Eliatou
Sie können db herunterfahren, im eingeschränkten Modus starten und dann versuchen, den alten Tablespace zu löschen.
Raj

Antworten:

3

Ich habe die obigen Vorschläge ausprobiert, aber es hat nicht funktioniert, z. B. hat Select SQL keine Ergebnisse erzielt, und ich kann den Undo-Tabellenbereich immer noch nicht löschen. Das grundlegende Problem besteht darin, dass der alte Undo-Tabellenbereich in Oracle weiterhin als Undo registriert ist. Daher müssen wir ihn in den neuen Undo-Tabellenbereich ändern.

Folgendes habe ich getan und es hat funktioniert:

  1. Erstellen Sie einen neuen UNDO-Tabellenbereich:
CREATE SMALLFILE UNDO TABLESPACE "UNDO" 
DATAFILE '+DATA/t2/datafile/undo_01.dbf' SIZE 10G 
REUSE AUTOEXTEND ON NEXT 500M MAXSIZE 10G;
  1. Schalten Sie das neue UNDO auf den "offiziellen" Undo-Tabellenbereich um:
alter system set undo_tablespace='UNDO' scope=both;
  1. Löschen Sie den alten Undo-Tabellenbereich:
DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;

hoffe das hilft.

Dave
quelle
Dies ist das gleiche, was das ursprüngliche Poster versucht hat, und kann mit demselben Fehler fehlschlagen, solange im ursprünglichen Tabellenbereich das aktive Rückgängigmachen aktiviert ist.
Balazs Papp
Nicht ganz. Dave fügte scope=bothseiner alter systemAussage die Option hinzu , die die Art und Weise ändern könnte, wie Orakel auf die Änderung reagiert.
John aka hot2use
1
Der Bereich = beide sollte das Verhalten nicht wie scope=bothstandardmäßig ändern . Sie müssen explizit angeben scope=spfileoder scope=memorywenn Sie den Parameter ändern möchten, nur an einer Stelle.
JMK
1

Die Fehlermeldung bedeutet, dass das tablespaceverwendet wird. Da das Rückgängigmachen tablespacekritisch ist tablespace, müssen Sie es zuerst herunterfahren, indem Sie Folgendes verwenden:

SELECT a.name,b.status , d.username , d.sid , d.serial#
FROM   v$rollname a,v$rollstat b, v$transaction c , v$session d
WHERE  a.usn = b.usn
AND    a.usn = c.xidusn
AND    c.ses_addr = d.saddr
AND    a.name IN ( 
          SELECT segment_name
          FROM dba_segments 
          WHERE tablespace_name = 'UNDOTBSX02'
         ); 

Beenden Sie dann die SID für den Undo-Tablespace mit

alter system kill session 'SID,serial'; --change the values of sid and serial by the ones  that being retrived from the previouse command

Jetzt solltest du es fallen lassen können.

Ahmad Abuhasna
quelle
Für die select-Anweisung wird ein leeres Ergebnis zurückgegeben.
Mohammad Jolani
In diesem Fall müssen Sie warten, bis keine Transaktion aussteht, und dann sofort neu starten. und
lass
1

Sie möchten keine Verbindungen trennen. Woher wissen Sie, was diese Verbindungen tun und was möglicherweise unterbrochen wird, wenn diese Verbindungen getrennt werden?

Warten Sie besser, bis die Sitzungen den neuen Tabellenbereich verwenden. Schließlich wird der alte Undo-Tablespace nicht mehr verwendet. Zu diesem Zeitpunkt können Sie es fallen lassen. Wenn Sie Speicherplatz benötigen, können Sie versuchen, den Undo-Tabellenbereich zu verkleinern. Dies funktioniert jedoch möglicherweise nicht. Sie können auch Ausfallzeiten erhalten, um die Datenbank herunterzufahren, die Datenbank im Einschränkungsmodus aufzurufen und dann den alten Undo-Tabellenbereich zu löschen, der die Datenbank herunterfährt und uneingeschränkt startet.

Gandolf989
quelle
1

Die Antworten der vorherigen Poster sind alle in Bezug auf die Syntax zum Erstellen eines neuen UNDO-Tabellenbereichs und zum Umschalten des Systems auf den neuen UNDO-Tabellenbereich korrekt.

In der Oracle-Dokumentation heißt es, dass die folgende Anweisung in den neuen UNDO-Tabellenbereich wechselt:

ALTER SYSTEM SET UNDO_TABLESPACE = <name of new UNDO TS>;

zB für @Mohammad Jolani:

ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS20140508;

Es gibt jedoch einige Einschränkungen für diese Umschaltung, die wie folgt dokumentiert sind:

Die Switch-Operation wartet nicht darauf, dass Transaktionen im alten Undo-Tablespace festgeschrieben werden. Wenn im alten Rückgängig-Tabellenbereich ausstehende Transaktionen vorhanden sind, wechselt der alte Rückgängig-Tabellenbereich in den Modus PENDING OFFLINE (Status). In diesem Modus können vorhandene Transaktionen weiterhin ausgeführt werden, Rückgängig-Datensätze für neue Benutzertransaktionen können jedoch nicht in diesem Rückgängig-Tabellenbereich gespeichert werden. In diesem PENDING OFFLINE-Modus kann ein Undo-Tablespace vorhanden sein, auch nachdem der Switch-Vorgang erfolgreich abgeschlossen wurde. Ein PENDING OFFLINE-Undo-Tablespace kann weder von einer anderen Instanz verwendet noch gelöscht werden. Nachdem alle aktiven Transaktionen festgeschrieben wurden, wechselt der Undo-Tabellenbereich schließlich automatisch vom PENDING OFFLINE-Modus in den OFFLINE-Modus. Von da an ist der Undo-Tablespace für andere Instanzen verfügbar (in einer Oracle Real Application Cluster-Umgebung).

Laut A PENDING OFFLINE kann der Undo-Tablespace weder von einer anderen Instanz verwendet noch gelöscht werden. Sie müssten warten, bis Oracle den aktuellen UNDO-Tabellenbereich vollständig umgestellt hat.

Versuchen Sie, den Status des Tablespace abzufragen mit:

select file#, ts#, status, bytes, substr(name, 0, 30) from v$datafile;

Möglicherweise wird Ihr alter UNDO-Tabellenbereich noch verwendet oder befindet sich im PENDING OFFLINEStatus.

Sie können auch versuchen, die UNDO-Tablespaces hin und her zu wechseln, mit:

ALTER SYSTEM SET UNDO_TABLESPACE = '';
In diesem PENDING OFFLINE-Modus kann ein Undo-Tablespace vorhanden sein, auch nachdem der Switch-Vorgang erfolgreich abgeschlossen wurde. Ein PENDING OFFLINE-Undo-Tablespace kann weder von einer anderen Instanz verwendet noch gelöscht werden. Nachdem alle aktiven Transaktionen festgeschrieben wurden, wechselt der Undo-Tabellenbereich schließlich automatisch vom PENDING OFFLINE-Modus in den OFFLINE-Modus. Von da an ist der Undo-Tablespace für andere Instanzen verfügbar (in einer Oracle Real Application Cluster-Umgebung). Wenn der Parameterwert für UNDO TABLESPACE auf '' (zwei einfache Anführungszeichen) gesetzt ist, wird der aktuelle Undo-Tablespace ausgeschaltet und der nächste verfügbare Undo-Tablespace eingeschaltet. Verwenden Sie diese Anweisung mit Vorsicht, da kein Undo-Tablespace verfügbar ist wird das SYSTEM-Rollback-Segment verwendet.

Sie können das Umschalten nur erzwingen, wenn Sie Ihre Datenbank herunterfahren. Wenn Oracle glaubt, dass es noch den alten UNDO TS benötigt, dann sei es so. Ihr System schreibt bereits an das neue UNDO TS, sodass Sie nichts erzwingen müssen, es sei denn, Sie haben spezielle Anforderungen.

John aka hot2use
quelle
0

Sah diesen Link zur Lösung. Es hat bei mir funktioniert!

Entsprechende Rollback-Segmente müssen offline sein, bevor Sie den Tablespace löschen können.

Außerdem muss die Datenbank neu gestartet werden, bevor neue Parameterwerte wirksam werden.

Cindy
quelle