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