Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/09/2007, 19h27   #1
Invité de passage
 
Inscription : novembre 2006
Messages : 104
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 104
Points : 1
Points : 1
Par défaut réinitialisation d'un champ Blob

Bonjour,

j'ai eu l'erreur Oracle suivante.
Code :
ORA-01653: impossible d'étendre la table ... de 256 dans le tablespace ....
sachant que par erreur j'ai stocké des images dans un champ de type Blob, et je veux vider ces champs.
je me demande si la Requête suivante:
Code :
UPDATE MaTable SET Photo=NULL
va me libérer l'espace ou il ya un autre moyen de supprimer le contenu de la colonne? sachant que j'ai pas la permission d'augmenter la taille de la base et je n'ai qu'à supprimer ces photos pour libérer l'espace.

Merci pour toute aide.
safisafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 19h37   #2
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
Ce n'est que en faisant un TRUNCATE ou un DROP sur une table qu'on peut récupérer ses extents et donc de la place.

Tu ne pourras donc pas récupérer de place en mettant la colonne Photo à null, il faut donc que tu tronques la table et que tu la réalimentes avec Photo = null

Si tu es en 8i, une coalescence du taplespace s'impose après le TRUNCATE ou le DROP pour "recoller" les espaces libres consécutifs.
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 19h42   #3
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Essaie de supprimer la colonne puis de la recréer.

Si ça ne te libère pas d'espace, créé une table temporaire et recopie toutes tes colonnes sauf photos.
Fais un
Code :
TRUNCATE TABLE TOTO DROP storage
et repeuple ta table de départ avec les données stockées dans la table temporaire.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 20h15   #4
Invité de passage
 
Inscription : novembre 2006
Messages : 104
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 104
Points : 1
Points : 1
Merci pour vos réponses,

En fait les données de la table sur laquelle je travaille sont très sensibles. je pense qu'il serait risqué de faire un truncate de la table ou même de faire un Alter.

la question que je me pose: en mettant le champ à Null je ne vais pas libérer de l'espace mais est ce que à la prochaine insertion j'aurais l'erreur ORA-01653 ?

Merci
safisafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 20h54   #5
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
salut,
Code :
1
2
3
4
5
6
7
8
9
10
11
 
EMPTY_BLOB 
NULL BLOB --->dbms_lob.empty_blob(); 
CREATE TABLE ebdemo (
fid   NUMBER(3),
iclob BLOB);
 
INSERT INTO ebdemo
(fid, iblob)
VALUES
(1, EMPTY_BLOB());
Pour initialiser un champ BLOB, il suffit de mettre :
Code :
1
2
 
UPDATE MaTable SET Photo=EMPTY_BLOB()
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 10h49   #6
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
Oui, tu auras toujours la même erreur !
Ce n'est pas parce que tu mets une colonne à null que tu vides complètement les blocs de données, et par conséquent les extents.
Tu as besoin d'un ordre DDL (TRUNCATE ou DROP) pour que les extents redeviennent de l'espace libre.

Sinon, je te propose une solution de contournement, à condition que tu aies de la place sur un autre tablespace :

1. Sauvegarde de la table dans un autre tablespace :

Code :
1
2
3
4
 
CREATE TABLE table_save
TABLESPACE autre_tablespace
AS SELECT * FROM TABLE;
2. Tronquage de la table initiale avec récupération de l'espace :

Code :
1
2
 
TRUNCATE TABLE TABLE DROP STORAGE;
3. Coalescence du tablespace de la table initiale (équivalent d'un defrag OS, nécessite des droits d'admin.) :

Code :
1
2
 
ALTER TABLESPACE tablespace COALESCE;
4. Réalimentation de la table initiale sans les photos :

Code :
1
2
3
 
INSERT INTO TABLE (col1, col2, col3, Photo, col5)
SELECT col1, col2, col3, NULL, col5 FROM table_save;
5. Suppression de la sauvegarde :
Code :
1
2
 
DROP TABLE table_save;
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 10h54   #7
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
Maintenant que j'y pense, tu peux quand même essayer de passer ta colonne Photo à null, des fois que ça te permette que l'occupation des blocs de données redescende sous la PCTUSED, ce qui équivaudrait à récupérer de l'espace.
Mais il faudrait quand même un heureux concours de circonstances pour que ça marche sur tous les blocs de la table.
En cas d'échec, je ne vois que la solution que je t'ai donnée précédemment.
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 20h33   #8
Invité de passage
 
Inscription : novembre 2006
Messages : 104
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 104
Points : 1
Points : 1
Merci pour vos réponse,
Merci à toi dgi77

Comme t'as dis je testerai d'abords la mise à Null du champ photo.
Sinon, pour contrôler l'espace occupé par mes tablespaces, c'est la Requête
qui figure sur la faq Oracle que je dois utiliser?

http://oracle.developpez.com/faq/?pa...istetablespace
sous le titre:
Comment obtenir la liste des tablespaces avec leurs caractéristiques principales ?

Merci
safisafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2007, 18h38   #9
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Citation:
Ce n'est que en faisant un TRUNCATE ou un DROP sur une table qu'on peut récupérer ses extents et donc de la place.
Depuis Oracle 8i, on peut aussi utiliser ALTER TABLE ... MOVE. Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
SQL> SELECT * FROM v$version;
 
BANNER
----------------------------------------------------------------
Oracle DATABASE 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS FOR 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
 
SQL> DROP TABLE t;
 
TABLE dropped.
 
SQL>
SQL> CREATE TABLE t(x int, y varchar2(30));
 
TABLE created.
 
SQL>
SQL> begin
  2  FOR i IN 1..10000
  3  loop
  4   INSERT INTO t VALUES (i, to_char(i));
  5  end loop;
  6  commit;
  7  end;
  8  /
 
PL/SQL procedure successfully completed.
 
SQL>
SQL> DELETE t WHERE mod(x,2) = 0;
 
5000 rows deleted.
 
SQL> commit;
 
Commit complete.
 
SQL> SELECT extent_id, bytes FROM user_extents WHERE segment_name = 'T';
 
 EXTENT_ID      BYTES
---------- ----------
         0      65536
         1      65536
         2      65536
 
SQL>
SQL> ALTER TABLE t move;
 
TABLE altered.
 
SQL> SELECT extent_id, bytes FROM user_extents WHERE segment_name = 'T';
 
 EXTENT_ID      BYTES
---------- ----------
         0      65536
         1      65536
 
SQL>
SQL>
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2007, 18h47   #10
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Citation:
Envoyé par safisafi Voir le message
Merci pour vos réponse,
Merci à toi dgi77

Comme t'as dis je testerai d'abords la mise à Null du champ photo.
Sinon, pour contrôler l'espace occupé par mes tablespaces, c'est la Requête
qui figure sur la faq Oracle que je dois utiliser?

http://oracle.developpez.com/faq/?pa...istetablespace

sous le titre:
Comment obtenir la liste des tablespaces avec leurs caractéristiques principales ?
Oui.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 15h37   #11
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
Si je comprends bien ce que tu fais, tu supprimes 1 enregistrement sur 2, ce qui laisse penser qu'il y a beaucoup de trous dans les blocs de données, et qu'aucun bloc n'a été vidé complètement (la table ayant été créée juste avant l'INSERT).

Est-ce que cela veut dire que le ALTER TABLE ... MOVE déplace les données d'un bloc à l'autre, jusquà libérer des extents ?
Chapeau !
Et merci pour l'astuce.
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 10h06   #12
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Oui, par défaut ALTER TABLE MOVE recrée un segment en compactant l'espace dans les blocs. A ma connaissance, ce comportement n'est officiellement documenté que dans des notes Metalink comme dans celle ci:

Citation:
Subject: Is the High Water Mark Reset When Moving a Table to Another Tablespace or When Import?
Doc ID: Note:220450.1 Type: BULLETIN
Last Revision Date: 17-JAN-2003 Status: PUBLISHED
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 14h44   #13
Invité régulier
 
Inscription : septembre 2007
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 7
Points : 5
Points : 5
Si le move reorganise la table, c'est bien dit...

Du coup suivant comment tu mets ton PCT FREE, ta table peut aussi être plus grande à la sortie

En fait il faut que tu mettes un PCTFREE assez petit avant de faire le move pour gagner plus d'espace (mais faire très attention car si tes lignes existantes sont souvent mises à jour c'est pas top !)
Merilka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 17h51   #14
Membre actif
 
Inscription : septembre 2007
Messages : 188
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : septembre 2007
Messages : 188
Points : 195
Points : 195
Le move permet de regagner l'espace. tu peux meme simuler un move dans le meme tablespace.

Pour en etre sur, il suffit de faire
Analyze table MATABLE compute statistics;
un select table_name, blocks from user_tables where table_name ='MATABLE';

puis alter table MATABLE move tablespace MONTABLESPACE;


Analyze table MATABLE compute statistics;

puis à nouveau la requete sur user_tables.

ATTENTION : le move mets les index de la table dans un état foireux, il faut donc reconstruire les index après le move.
lallio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2007, 19h12   #15
Invité régulier
 
Inscription : juillet 2007
Messages : 25
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 25
Points : 7
Points : 7
Citation:
Envoyé par safisafi Voir le message
Bonjour,

j'ai eu l'erreur Oracle suivante.
Code :
ORA-01653: impossible d'étendre la table ... de 256 dans le tablespace ....
sachant que par erreur j'ai stocké des images dans un champ de type Blob, et je veux vider ces champs.
je me demande si la Requête suivante:
Code :
UPDATE MaTable SET Photo=NULL
va me libérer l'espace ou il ya un autre moyen de supprimer le contenu de la colonne? sachant que j'ai pas la permission d'augmenter la taille de la base et je n'ai qu'à supprimer ces photos pour libérer l'espace.

Merci pour toute aide.


vous pouvez ajoutez des nouvelles extents à votre table en utilisant
Citation:
ALTER TABLE table ALLOCATE EXTENT
othman_k86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h11.


 
 
 
 
Partenaires

Hébergement Web