Sur Oracle version 11g:
Après Google, je ne trouve pas de moyen simple de récupérer de l'espace libre après avoir supprimé une table.
J'ai trouvé beaucoup d'explications, expliquant comment le fichier de données devient fragmenté, la grande pile de requêtes ennuyeuses que vous devez exécuter afin de déplacer "l'espace vide" à la fin du fichier de données (table par table ... même lorsque vous avoir 200 tables!?).
Ensuite, vous devez réduire la taille du fichier de données en "devinant" de combien vous pouvez la réduire, ou vous devez savoir exactement quelle est votre "taille de bloc" ... Et enfin, vous ne devez pas oublier de "reconstruire les index".
Voir par exemple: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:54178027703899
et http://www.oracle-base.com/articles/misc/ReclaimingUnusedSpace.php
Existe-t-il une procédure PL / SQL simple qui, étant donné un nom d'espace de table ou un nom de fichier de données, le ferait pour ce travail? Ou tout autre outil Oracle similaire?
la source
Réponses:
La réponse courte est non . Malheureusement, la façon de procéder dans Oracle nécessite la "grande pile de requêtes ennuyeuses". Les articles auxquels vous avez lié sont parmi les meilleures informations disponibles sur le sujet. Le fichier de données devient en effet fragmenté, de sorte que même si l'espace libre existe en dessous du segment le plus élevé, Oracle ne le consolidera pas automatiquement une fois l'opération
RESIZE
terminée.Pour "défragmenter" l'espace disque logique, vous devez déplacer ces segments au début du fichier de données plutôt qu'à la fin. Pour les tables, il s'agit d'un processus hors ligne, ce qui signifie que la table sera indisponible pendant le déplacement. Les index peuvent être déplacés hors ligne ou avec Enterprise Edition, ils peuvent être déplacés en ligne. Comme vous avez une fenêtre d'interruption, je vous recommande de suivre ces étapes.
A. Réduisez les fichiers de données avec un espace libre au-delà de la ligne des hautes eaux. Cela peut être fait comme suit (la requête est similaire à la procédure de Frosty Z):
B. Après avoir réduit les choses au-dessus de la ligne des hautes eaux, découvrez quels espaces de table bénéficieraient encore du déplacement des segments.
C. Pour chacun de ces espaces de table, déterminez quels segments doivent être déplacés. (Remplacez USERS par le nom de votre espace de table ou joignez-le à la requête précédente)
D. Déplacez chaque table et reconstruisez les index et les statistiques.
E. Répétez l'étape A.
Je viens de créer la plupart de ces requêtes, vous voudrez donc les tester soigneusement avant de les utiliser. Je suppose que vous pourriez créer une procédure qui utiliserait
EXECUTE IMMEDIATE
pour créer les instructions réelles à exécuter dynamiquement, mais parce que les requêtes recevront ORA-08103: L'objet n'existe plus pendant le déplacement, je pense qu'il est préférable de contrôler ce processus manuellement même si cela signifie un peu plus de temps / d'efforts.la source
Solution partielle inspirée de cette page :
Il ne réorganise pas l'espace libre mais détecte automatiquement l'espace libre disponible à la fin des fichiers de données et imprime les commandes «REDIMENSIONNER» appropriées.
la source
Avant d'essayer de réduire du tout les fichiers de données, posez-vous la question: allez-vous créer à nouveau de nouveaux segments dans l'espace de table associé dans un avenir proche? Si oui, il ne sert à rien de rétrécir. L'espace sera juste réutilisé pour vos nouveaux segments et vous vous épargnerez ainsi que le système beaucoup d'efforts en le laissant tel quel.
la source
Après avoir surfé sur Google pendant des jours, j'ai trouvé l'exemple le plus simple et le plus clair pour récupérer l'espace libre dans l'espace de table après la suppression. J'espère que ça aide
Lien: http://www.dbforums.com/oracle/976248-how-reduce-tablespaces-used-space-after-delete-records-2.html
Solution:
Créons un tableau avec 9999 lignes, chacune d'environ 1k:
Le tableau dispose de 29 extensions, pour un total de 14,6 millions:
Supprimons TOUTES les lignes:
Maintenant - "surprise" - la table utilise toujours les mêmes extensions:
Pourquoi ? Parce que même si vous supprimez toutes les lignes du tableau, le High Water Mark n'est pas diminué - il n'est jamais diminué, pour permettre une concurrence maximale (Oracle est très sérieux quant à la maximisation de la concurrence, c'est-à-dire les performances et l'évolutivité; c'est la principale raison de son succès dans les applications d'entreprise).
La désallocation de l'espace inutilisé (= espace au-dessus du HWM) n'aide pas beaucoup (car il n'y a pas beaucoup d'espace inutilisé au-dessus du HWM):
Maintenant, MOVONS la table, ce qui signifie essentiellement cloner la table (y compris les déclencheurs, les contraintes, etc.), transférer les lignes, supprimer la "vieille" table et renommer la nouvelle - le tout fait par le noyau, donc super-sûr même en cas de panne machine / serveur:
Maintenant, nous avons maintenant seulement l'étendue initiale allouée:
Mise en garde: il arrive normalement que de nombreux / tous les index de la table soient inutilisables après le déplacement (pas dans ce cas, mais j'exécute 9.2.0.4, la dernière version, qui a probablement optimisé le processus en cas de tables totalement vides ):
Si STATUS n'était pas VALIDE, vous pouvez simplement reconstruire manuellement les index:
Ou vous pouvez automatiser l'ensemble du processus:
Par exemple, définissons manuellement l'index sur INUTILISABLE:
HTH Alberto
la source
Comme indiqué précédemment, vous devrez déplacer toutes les 200+ tables de cet espace de table pour libérer de l'espace dans votre fichier de données, puis redimensionner pour récupérer l'espace. Mais au lieu d'exécuter toutes ces requêtes, 12c Enterprise Manager fait cette tâche. Vous devrez accéder à la base de données Accueil> Stockage> Espace disque logique. Sélectionnez l'espace disque logique sur lequel vous souhaitez travailler et cliquez sur Réorganiser. Il vous donnera une option pour afficher les instructions SQL qui sont sur le point d'être exécutées. Vous pouvez soit en prendre une copie et l'exécuter vous-même, soit planifier un travail dans EM.
Il crée en fait un autre espace de table, déplace tous les objets vers le nouvel espace de table, reconstruit les index et supprime les objets de l'ancien espace de table.
Il y a quelques inconvénients auxquels je peux penser. Cela devrait être fait pendant les heures creuses, sinon cela entraînera une erreur en disant que la ressource est occupée. Le fichier de données (pas l'espace de table) aura "reorg" ajouté à son nom, vers la fin.
la source