ORA-30036: Segment kann nicht um 8 in Undo Tablespace 'UNDO' erweitert werden

y0dA

Erfahrenes Mitglied
Hi!

Ich habe eine Oracle XE am laufen.

Als ich heute wieder mal Datensätze Inserten wollte, bekam ich folgende Fehlermeldung:
Code:
ORA-30036: Segment kann nicht um 8 in Undo Tablespace 'UNDO' erweitert werden

Kann ich den Tablespace erweitern, wenn ja wie?

Hier mal eine Auflistung der Tablespaces:
Code:
USERS    99,42%    Zugewiesen  2.767MB Belegt 2751
UNDO      98,40%                       500                   492
SYSTEM  92,51                          354                   352
SYSAUX   95,50                          553                   511

Mittels folgendem Stmt hätte ich mir die benötigten Undo Tablespace Size errechnet:
Code:
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
       SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
       (TO_NUMBER(e.value) * TO_NUMBER(f.value) *
       g.undo_block_per_sec) / (1024*1024) 
      "NEEDED UNDO SIZE [MByte]"
  FROM (
       SELECT SUM(a.bytes) undo_size
         FROM v$datafile a,
              v$tablespace b,
              dba_tablespaces c
        WHERE c.contents = 'UNDO'
          AND c.status = 'ONLINE'
          AND b.name = c.tablespace_name
          AND a.ts# = b.ts#
       ) d,
      v$parameter e,
       v$parameter f,
       (
       SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
         undo_block_per_sec
         FROM v$undostat
       ) g
 WHERE e.name = 'undo_retention'
  AND f.name = 'db_block_size'
Ergebnis:
Code:
ACTUAL UNDO SIZE [MByte] = 500
UNDO RETENTION [Sec] = 900
NEEDED UNDO SIZE [MByte] = 2423,2734375
 
Entweder Oracle selber drum kümmern lassen:
SQL:
ALTER DATABASE DATAFILE '<undo_df>' AUTOEXTEND ON
oder größer machen mit
SQL:
ALTER DATABASE DATAFILE '<undo_df>' RESIZE 2G
. <undo_df> ist der Name der Datei, die dem UNDO-Tablespace zugeordnet ist (können auch mehrere sein, bei XE in der Standardkonfiguration ist es nur eine):
SQL:
select file_name from dba_data_files where tablespace_name = 'UNDO';

Den Richtwert aus dem SQL zum bestimmen der "optimalen" Größe des UNDO-Tablespace ist aber mit ziemlicher Sicherheit zu hoch. Es geht dabei nur darum, die undo_retention zu "garantieren" (um das tatsächlich zu tun, muß man anders vorgehen - so versucht Oracle aber zumindestens den Wert einzuhalten).
 
Hi!
Danke für die Erläuterungen.

Fakt ist, ich hab nun die Undo size auf 1000MB erhöht (allzu viel Luft hab ich nicht mehr)
-->
Code:
select  sum(bytes/1024/1024) "Belegt(MB)", 5120 - sum(bytes/1024/1024) "Frei(MB)"
from    dba_data_files
where tablespace_name != 'UNDO';
liefert:
Code:
Belegt: 4324MB
Frei: 796MB

und
Code:
SELECT SUM( bytes/1024/1024) "MB verbraucht"
  FROM Dba_Data_Files df, Dba_Tablespaces ts
 WHERE df.Tablespace_Name = ts.Tablespace_Name
   AND Contents='PERMANENT'
   AND ts.Tablespace_Name NOT IN ( 'SYSTEM', 'SYSAUX' )
liefert:
Code:
Verbaucht: 3417MB

Stoße ich schon an die Grenzen von Oracle XE bzw wann ist die DB voll (es gibt ja bei Oracle XE irgendwelche Begrenzungen mit 4-5GB) - kann mir das jemand erklären?

Weiters kann ich feststellen ob
Code:
ALTER DATABASE DATAFILE '<undo_df>' AUTOEXTEND ON
nicht eh schon zutrifft?

Wie kann es zu so einem Fehler wie oben überhaupt kommen? Wenn ich zuviele Daten mit einem einzigen Commit in die DB schreiben möchte?

mfg
 

Neue Beiträge

Zurück