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



## y0dA (27. März 2008)

Hi!

Ich habe eine Oracle XE am laufen.

Als ich heute wieder mal Datensätze Inserten wollte, bekam ich folgende Fehlermeldung:

```
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:

```
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:

```
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:

```
ACTUAL UNDO SIZE [MByte] = 500
UNDO RETENTION [Sec] = 900
NEEDED UNDO SIZE [MByte] = 2423,2734375
```


----------



## ishino (28. März 2008)

Entweder Oracle selber drum kümmern lassen:
	
	
	



```
ALTER DATABASE DATAFILE '<undo_df>' AUTOEXTEND ON
```
 oder größer machen mit 
	
	
	



```
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):
	
	
	



```
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).


----------



## y0dA (28. März 2008)

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)
-->

```
select  sum(bytes/1024/1024) "Belegt(MB)", 5120 - sum(bytes/1024/1024) "Frei(MB)"
from    dba_data_files
where tablespace_name != 'UNDO';
```
liefert:

```
Belegt: 4324MB
Frei: 796MB
```

und

```
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:

```
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 

```
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


----------

