IT Consulting Steffes

ORA-03297: file contains used data beyond requested RESIZE value

Bei dem Versuch, ein Datenfile zu verkleinern um Plattenplatz im filesystem zu schaffen, tritt folgender Fehler auf:
ORA-03297: file contains used data beyond requested RESIZE value

Die Ursache dieser Fehlermeldung liegt darin, dass Datenblöcke eines Oracle Objekts in Benutzung sind,
die die Verkleinerung des Datenfiles verhindern. Hilfreich wäre in diesem Zusammenhang zu wissen, welche Objekte den Fehler verursachen.
Diese Info kann mit den folgenden Schritten ermittelt werden.

1. Schritt:
Die file_id zum jeweiligen Datenfile ausfindig machen, dazu eignet sich folgende Querie:

SQL>
set pagesize 40
col FILE_NAME for a60
select file_id, FILE_NAME from dba_data_files order by 1;

 Der Output schaut z.B. so aus:

FILE_ID   FILE_NAME
------  ---------------------------------------------------------------
1    /DB/PUMADB/data/tablespace/system01.dbf
2    /DB/PUMADB/data/tablespace/sysaux01.dbf
3    /DB/PUMADB/data/tablespace/undotbs01.dbf
4    /DB/PUMADB/data/tablespace/users01.dbf
5    /DB/PUMADB/data/tablespace/puma_data_01.dbf
6    /DB/PUMADB/data/tablespace/puma_data_02.dbf
7    /DB/PUMADB/data/tablespace/puma_index_01.dbf
8    /DB/PUMADB/data/tablespace/puma_index_02.dbf
9    /DB/PUMADB/data/tablespace/users02.dbf
10   /DB/PUMADB/data/tablespace/users03.dbf
11   /DB/PUMADB/data/tablespace/index_01.dbf
12   /DB/PUMADB/data/tablespace/index_02.dbf
13   /DB/PUMADB/data/tablespace/users04.dbf
14   /DB/PUMADB/data/tablespace/users05.dbf
15   /DB/PUMADB/data/tablespace/users06.dbf
16   /DB/PUMADB/data/tablespace/users07.dbf
17   /DB/PUMADB/data/tablespace/users08.dbf

17 rows selected.

 
2. Schritt:

Mit der Angabe zur Blockgröße (hier im Beispiel: 8192 byte), der file_id (aus der Querie von oben) wird die Belegung im Datenfile angezeigt.

col name format a30
set linesize 120
set pagesize 80
-- undefine dbblocksize => 8192
undefine fileid
select file_id,block_id, blocks*8192/1024/1024 MB,
owner||'.'||segment_name "Name",block_id*8192/1024/1024 "Position MB"
from sys.dba_extents
where file_id = &&fileid
UNION
select file_id, block_id, blocks*8192/1024/1024, 'Free' "Name",block_id*8192/1024/1024 "Position MB"
from sys.dba_free_space
where file_id = &&fileid
order by 1,2,3;


Querie Ausgabe zu Schritt 2:

FILE_ID BLOCK_ID      MB Name                           Position MB
------- ---------- ----- ------------------------------ -----------
...
17     967680         64 Free                               7560
17     975872          1 PUMA.EXTCOMPS                      7624
17     976000         64 Free                               7625
17     984192          1 PUMA.EXTCOMPS                      7689
17     984320        121 Free                               7690
17     999808          1 PUMA.EXTCOMPS                      7811
17     999936         64 Free                               7812
17    1008128          1 PUMA.EXTCOMPS                      7876
17    1008256         60 Free                               7877
17    1015936       1088 Free                               7937
17    1155200          8 PUMA.EXTCOMPS                      9025
17    1156224        449 Free                               9033
17    1213696          8 PUMA.EXTCOMPS                      9482
17    1214720         10 Free                               9490

81 rows selected.

 

Die Query zeigt, dass das Datenfile 17 (FILE_ID=17) ca. 9,5 GByte groß ist und nur um
ca. 10MByte verkleinert werden kann, da das Objekt PUMA.EXTCOMPS die nächsten Datenblöcke (8 MB) belegt.
(output SQL Query, siehe vorletzte Zeile)


Allgemein:
Handelt es sich bei dem Objekt ( im Beispiel oben: PUMA.EXTCOMPS ), dass als nächstes dem freien Bereich folgt, um einen Index,
so könnte dieser Index mittels folgendem Befehl online reorganisiert, z.B.in einen anderen tablespace verschoben werden:
ALTER INDEX "user"."index_name" REBUILD ONLINE TABLESPACE "neuer_tablespace" ;

Handelt es sich bei dem Objekt ( im Beispiel oben: PUMA.EXTCOMPS ), dass als nächstes dem freien Bereich folgt, um eine Tabelle,
so könnte mittels export/import der Platz freigeschaufelt werden, wenn es die offline Zeit zulässt.
Online kann eine Tabelle per segment shrinking reorganisiert werden. Zu beachten ist, dass ASSM verwendet wird und bei großen Tabellen sehr viele UNDO Informationen anfallen:
ALTER TABLE tablename ENABLE ROW MOVEMENT;
ALTER TABLE tablename SHRINK SPACE;


weitere Infos, siehe z.B.
http://sysdba.wordpress.com/2006/04/28/how-to-adjust-the-high-watermark-in-oracle-10g-alter-table-shrink/
http://www.oracle-base.com/articles/10g/SpaceObjectTransactionManagement10g.php
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/schema.htm



zurück zur Übersicht: Oracle Database Fehler