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 :

Défragmenter une table


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Doctor Z
    Inscrit en
    Mars 2004
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 88
    Par défaut Défragmenter une table
    Bonjour à tous !

    Voilà tout est dans le titre, je dois défragmenter une table sous Oracle 8.1.6 sur IBM AIX. J'imagine que la façon de faire est indépendante de
    l'OS ... ?

    Par ailleurs, dois-je faire une défragmentation du tablespace contenant la
    table ou puis-je le faire au niveau de la table uniquement ?

    Merci de me répondre, ça serait très sympa de m'aider, je débute en
    DBA ...

    Merci pour vos réponse.

  2. #2
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Pour ta table : ça vaut ce que ça vaut !!! mais ça le fait
    1 Export
    2 Drop
    3 Import
    4 recompile objets invalid (le cas échéant)

  3. #3
    Membre confirmé Avatar de Doctor Z
    Inscrit en
    Mars 2004
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 88
    Par défaut
    Salut merci pour ta réponse !

    Mais comme faire pour l'étape 4 ? (je suis vraiment débutant ... ).
    MERCI BEAUCOUP !

  4. #4
    Membre éprouvé
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Par défaut
    ALTER TABLE ma_table MOVE TABLESPACE mon_tablespace;

  5. #5
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Un little script Sous UNIX pour recompiler les OBJETS INVALID:

    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
     
    sqlplus USER/PASSWORD@DATABASE  << EOF
    SET ECHO OFF;
    SET VERIFY OFF;
    SET FEEDBACK OFF;
    SET PAGESIZE 0;
    SPOOL recompile_objets.sql;
    SELECT  'ALTER ' || RTRIM(object_type, ' BODY') || ' ' ||
               object_name || ' COMPILE '||
               DECODE (object_type,
              'PACKAGE BODY','BODY;',
              'PACKAGE', 'PACKAGE;',
              ';')
    FROM    user_objects
    WHERE   object_type IN ('PROCEDURE', 'FUNCTION',  'TRIGGER',
                   'VIEW','PACKAGE','PACKAGE BODY')
    AND     status = 'INVALID'
    /
    SPOOL OFF;
    SET ECHO ON;
    SET VERIFY ON;
    SET FEEDBACK ON;
    SET PAGESIZE 20;
    @recompile_objets.sql;
    exit

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par argoet
    Pour ta table : ça vaut ce que ça vaut !!! mais ça le fait
    1 Export
    2 Drop
    3 Import
    4 recompile objets invalid (le cas échéant)
    trop compliquer

    thomasjcj donne une solution plus sympa d'autant qu'elle évite de se retrouver avec une rupture de service trop longue. En gros, on drop la table et on la recrée.

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par argoet
    Un little script Sous UNIX pour recompiler les OBJETS INVALID:
    Pour rappel, oracle fournit le script $ORACLE_HOME/rdbms/admin/utlrp.sql

  8. #8
    Membre confirmé Avatar de Doctor Z
    Inscrit en
    Mars 2004
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 88
    Par défaut
    Merci pour vos différents messages !

    J'ai oublier de préciser que la base est en ARCHIVELOG.

    Simplement pour savoir, le fait de défragmenter le tablespace où se trouve
    la table ne pourrait pas résoudre le problème ?

    Si je résume, pour défragmenter une table :

    - export de la table
    - drop de la table
    - import de la table
    - compilation de la table

    Cependant, pour cette dernière étape, quelle méthode utiliser ?

    - le script utlrp.sql ? (comme spécifier qu'il faut recompiler un objet
    particulier ?)
    - la solution thomasjcj, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ma_table MOVE TABLESPACE mon_tablespace;
    - la méthode de argoet :
    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
    sqlplus USER/PASSWORD@DATABASE  << EOF 
    SET ECHO OFF; 
    SET VERIFY OFF; 
    SET FEEDBACK OFF; 
    SET PAGESIZE 0; 
    SPOOL recompile_objets.sql; 
    SELECT  'ALTER ' || RTRIM(object_type, ' BODY') || ' ' || 
               object_name || ' COMPILE '|| 
               DECODE (object_type, 
              'PACKAGE BODY','BODY;', 
              'PACKAGE', 'PACKAGE;', 
              ';') 
    FROM    user_objects 
    WHERE   object_type IN ('PROCEDURE', 'FUNCTION',  'TRIGGER', 
                   'VIEW','PACKAGE','PACKAGE BODY') 
    AND     status = 'INVALID' 
    / 
    SPOOL OFF; 
    SET ECHO ON; 
    SET VERIFY ON; 
    SET FEEDBACK ON; 
    SET PAGESIZE 20; 
    @recompile_objets.sql; 
    exit
    Merci de m'aider, vraiment très sympa !

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Alors si le but est de défragmenter un tablespace il faut déplacer TOUS les objets du tablespace donc tables ET indexes.

    1° étape :
    créer un tablespace qui acceuillera les objets du tablespace à défragmenter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLESPACE <tablespace cible> DATAFILE...;
    2° étape :
    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
    BEGIN
    FOR i IN (SELECT 'ALTER TABLE '||owner||'.'||tables_name||' MOVE TABLESPACE '||<tablespace cible> STMT 
                     FROM dba_tables
                   WHERE tablespace_name = <tbs à défragmenter>) LOOP
     
    execute immediate(i.STMT);
     
    END LOOP;
    FOR i IN (SELECT 'ALTER INDEX '||owner||'.'||tables_name||' REBUILD  TABLESPACE '||<tablespace cible> STMT 
                     FROM dba_indexes
                   WHERE tablespace_name = <tbs à défragmenter>) LOOP
     
    execute immediate(i.STMT);
     
    END LOOP;
    END;
    /
    3° étape :
    Supprimer le tablespace après s'être assuré qu'il est bien vide

    DROP TABLEPACE <tbs à défragmenter>;

    Et supprimer les datafiles

    Enfin, le recréer si tu ne veux pas utiliser le nouveau tablespace

    4° étape :
    si tu as recréer le tablespace il faut rebouger les objets dans le bon sens avec la procédure de la 2° étape en changeant les tablespaces.

    5° étape :

    recompiler les objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sqlplus system/manager@mabase
    @$ORACLE_HOME/rdbms/utlrp.sql
    Tout ça c'est de tête alors j'espère ne rien oublier

  10. #10
    Membre confirmé Avatar de Doctor Z
    Inscrit en
    Mars 2004
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 88
    Par défaut
    Merci pour ta réponse rapide orafrance, mais ma question était de savoir
    si le fait de défragmenter le tablespace qui contient la table à défragmenter
    pourrait solutionner mon problème de fragmentation de table ... ?

    Effectivement si ce n'est pas le cas, je reste sur le fait qu'il fauts coute que
    coute, que je défragmente ma table.

    Excusez-moi de t'avoir embrouiller, mais je suis un peu en panique ... et
    mon problème est bien de savoir les différentes étapes à suivre pour
    défragmenter une table d'une base de données Oracle 8.1.6, fonctionnant
    en mode ARCHIVELOG et tournant sous IBM AIX.

    Merci vraiment beaucoup pour vos réponses.

  11. #11
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    le fait de déplacer la table suffit à la défragmenter, si on défragmente tous les objets, le tablespace sera naturellement défragmenté

    En fait, la défragmentation d'une seule table c'est un peu dommage, voila pourquoi je donne la procédure pour le tablespace

    PS : pense au moins à défragmenter les indexes de la table avec REBUILD (cf. ma procédure)

  12. #12
    Membre éprouvé
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Par défaut
    Le Tablespace etant le contenant de la Table, il est clair que la defragmentation du Tablespace selon la méthode de orafrance defragmentera également la table. C'est une operation bien plus lourde que la défragmentation d'une seule table via un seul ordre SQL.
    A toi de savor exactement ce que tu veux faire.

  13. #13
    Membre confirmé Avatar de Doctor Z
    Inscrit en
    Mars 2004
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 88
    Par défaut
    Citation Envoyé par orafrance
    le fait de déplacer la table suffit à la défragmenter, si on défragmente tous les objets, le tablespace sera naturellement défragmenté
    Effectivement, comme je l'ai vu ici, il
    suffit de déplacer la table sur elle même, dans le même tablespace.
    Cependent, on me dit de recréer les indexes de la table, tandis que tu me
    dis qu'il faudra les défragmenter aussi ... Les indexes liés à cette table
    sont-ils détruit lors de la défragmentation de cette table ou bien suffit-il
    de les défragmenter comme la table ?

    Pour répondre à thomasjcj, je ne souhaite que défragmenter une table,
    pas le tablespace, il s'agit d'une grosse base de données de production
    qui tourne continuellement ...

    Merci beaucoup pour votre aide.

  14. #14
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est un abus de langage de ma part

    un REBUILD comme son nom l'indique reconstruit (ou recrée ) l'index

  15. #15
    Membre confirmé Avatar de Doctor Z
    Inscrit en
    Mars 2004
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 88
    Par défaut
    Merci beaucoup pour vos nombreuses réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Défragmenter une table
    Par Pol63 dans le forum Administration
    Réponses: 7
    Dernier message: 14/01/2012, 13h47
  2. Défragmenter les indexes d'une table
    Par ben_harper dans le forum Administration
    Réponses: 3
    Dernier message: 28/11/2008, 12h24
  3. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 17h16
  4. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05
  5. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55

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