IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

réinitialisation d'un champ Blob


Sujet :

Administration Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Points : 29
    Points
    29
    Par défaut réinitialisation d'un champ Blob
    Bonjour,

    j'ai eu l'erreur Oracle suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    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.
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  3. #3
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    truncate table TOTO drop storage
    et repeuple ta table de départ avec les données stockées dans la table temporaire.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Points : 29
    Points
    29
    Par défaut
    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

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Update MaTable set Photo=EMPTY_BLOB()

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TABLESPACE tablespace COALESCE;
    4. Réalimentation de la table initiale sans les photos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DROP TABLE table_save;
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    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.
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Points : 29
    Points
    29
    Par défaut
    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

  9. #9
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  10. #10
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    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.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    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.
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  12. #12
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    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:

    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

  13. #13
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    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 !)

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    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.

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par safisafi Voir le message
    Bonjour,

    j'ai eu l'erreur Oracle suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ALTER TABLE table ALLOCATE EXTENT

Discussions similaires

  1. Champs BLOB avec une connexion ADO
    Par Ol' dans le forum Bases de données
    Réponses: 6
    Dernier message: 18/05/2004, 19h21
  2. Créer un champ BLOB
    Par Bweb dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/04/2004, 12h01
  3. [interbase] transferer un champ blob en par prog
    Par Harry dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/02/2004, 10h39
  4. Update d'un champ BLOB
    Par ZeKlubb dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 17/01/2004, 16h04
  5. faire un insert pour un champ blob
    Par tripper.dim dans le forum InterBase
    Réponses: 10
    Dernier message: 02/05/2003, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo