Jeudi 11 décembre 2008 4 11 /12 /Déc /2008 20:11
Bonsoir,

Mais qu'est ce donc que ce Recycle Bin ?

Il s'agit d'une table du dictionnaire de donnée contenant des informations sur les objets supprimés. Pour simplifier, c'est une vulgaire corbeille comme vous pouvez en avoir sur windows.
Cela signifie tout simplement que depuis Oracle 10, vous pouvez vous permettre le luxe de supprimer une table par hasard et de la faire réapparaitre sans même l'intervention de votre DBA préféré.

Comment ca fonctionne ?

Pour commencer je crée une table ex1 que je vais ensuite supprimer.


CREATE TABLE ex1 (i NUMBER);
DROP TABLE ex1;



A ce moment, on peut penser que c'est terminé, ma table ex1 est partie dans le néant et les données qu'elle contenait également. En fait c'est ce qui se passait avant que cette corbeille apparaisse !

La table n'est plus visible mais elle a été placée dans la corbeille. Ce qui signifie aussi que l'espace qu'occupait cette table n'a pas été rendu !

Alors pour savoir quels sont les objets qui sont dans votre corbeille, il suffit d'interroger la vue  User_RecycleBin ou encore plus simplement le synonyme associé RecycleBin.


SELECT * FROM RecycleBin;


Quelles informations avons nous ?
  • Object_Name => le nom de l'objet dans la corbeille, commencant toujours par BIN$ suivant d'un identifiant unique de 26 caractère + un numéro de version dans le cas ou on s'amuserait à créer et a supprimer plusieurs fois la même table.
  • Original_Name => Vous aurez deviné qu'il s'agit du nom d'origine de l'objet (dans mon cas ex1)
  • Type => Correspond au type d'objet supprimé (Table, Index)
  • CreateTime => Date de création de l'objet.
  • DropTime => Date de suppression de l'objet.
  • DropScn => numero de scn, utile si on veut restaurer une version particulière de la table.
  • Space => Nombre de blocks utilisé par l'objet en question. (vous allez peut être découvrir quelques GO de libre...)
Il existe d'autres colonnes, mais je pense avoir cité les principales.
Alors si c'est bien d'avoir une corbeille, il est aussi interessant de savoir ce que l'on peut faire avec.
En générale depuis une corbeille, soit on restaure, soit on purge pour liberer de la place.

Remarque : La corbeille est propre a chaque schema, et en se connectant en sys on peut accèder à la vue DBA_RecycleBin qui permet de voir tous les objets dans la corbeille quelque soit le propriétaire. On n'a d'ailleurs une colonne Owner en plus pour identifier ce propriétaire.

1er cas : Purge complète de la corbeille (en owner).


PURGE RecycleBin; (on ne peut pas faire plus simple)


2ème cas : Purge d'un objet en particulier.


PURGE TABLE ex2;
ou
PURGE TABLE BIN$............



Remarque : Si il existe plusieurs verson de la table et que vous utilisez PURGE TABLE No_Table; alors seule la version la plus récemment supprimée sera purgée.

3ème cas : Restauration d'un objet.


FLASHBACK TABLE ex1 TO BEFORE DROP;
ou (si vous êtes maso ou si vous avez plusieurs versions de la table)
FLASHBACK TABLE BIN$............... TO BEFORE DROP;



Remarque : Si votre table avait des indexes (ou /et ) des contraintes, les indexes et contraintes seront restaurés avec le nom de corbeille (BIN$....) et non pas le nom d'origine, il convient donc de renommer les objets après restauration (ex: ALTER INDEX "BIN$......." RENAME TO Nom_Origine;)

4ème cas : Purge de tous les objets de la base


CONNECT / as sysdba
PURGE Dba_RecycleBin;



ATTENTION :  Je ne serai pas complet, si je ne disais pas qu'il existait un paramètre système  qui permet de d'inactiver cette fonction.Par défaut, à l'installation d'ORACLE, cette fonction est activée.


CONNECT system/*******
ALTER SYSTEM SET RECYCLEBIN=OFF;



On peut également désactiver la fonction au niveau d'une session


ALTER SESSION SET RECYCLEBIN=OFF;


A mon sens, il est relativement stupide de désactiver cette option.
Pourquoi ?
  • C'est se priver d'une possibilité rapide et simple de faire face à une erreur humaine.
  • Un utilisateur lambda peut même réparer son erreur sans l'intervention du DBA.
  • Etant donné que l'on peut modifier le comportement au niveau session, si vraiment dans le cas d'un traitement particulier (table temporaire), on ne veut pas garder de trace il suffit de faire un ALTER SESSIONDROP TABLE ma_table PURGE; Dans ce cas la table va directement dans la néant sans passer par la case corbeille. ou utiliser la commande
  • Ca peut même devenir un outil puissant. Exemple : Une application crée par traitement de nuit un pseudo datawarehouse en plusieurs heures en prenant soin de supprimer les tables existantes avant de commencer. Pour une raison inconnu, le traitement se plante. Et bien les utilisateurs finaux n'ont pas accès à leur datawarehoure préféré. En admettant que la hotline soit dans un pays lointain,cela peut prendre plusieurs jours. Grace à une restauration des tables via la corbeille on peut revenir à l'état J-1 très rapidement. (Remarque : Toute information ressemblant à des faits issues du vrai monde, ne serait que pure coincidence !)
  • Il convient néanmoins au DBA de surveiller à ce que cette corbeille ne devienne pas trop encombrante et éventuellement de programmer un traitement périodique pour effectuer une purge des objets les plus anciens ou inutiles.

ATTENTION : UN DROP USER ou DROP TABLESPACE, ne passe pas par la corbeille. Il faut passer par une sauvegarde pour récupérer les objets perdus.

ATTENTION : Si vous utilisez des scripts de maintenance appelant la table User_Objects vous devez vous attendre à quelques soucis. Il faut prévoir une clause pour exclure les nom d'objets commencant par BIN$ a moins que vous soyez assez malade pour appeler des indexes ou des tables de la sorte. Autre solution, préferez les vues USER_INDEXES et USER_TABLES que USER_OBJECTS avec une clause sur la colonne TYPE.

LAO.






Par LAO - Publié dans : Administration - Communauté : ORACLE
Ecrire un commentaire - Voir les 6 commentaires
Retour à l'accueil

Commentaires

J'ai découvert votre blog il y a peu et je le trouve vraiment très intéressant ! Bravo !
Commentaire n°1 posté par Guillaume le 11/12/2008 à 22h13
Merci mille fois !
LAO.
Réponse de LAO le 12/12/2008 à 07h37
C'est marrant, et je ne sais pas pourquoi, mais le coup du traitement nocturne me rappelle quelque chose :D
Commentaire n°2 posté par The Architect le 12/12/2008 à 08h38
Pure coincidence !
LAO
Réponse de LAO le 12/12/2008 à 09h05
J'aurais pourtant juré avoir déjà vu ce genre de truc quelque part. Mais tu as certainement raison, ce ne peut être qu'une coïncidence.
Commentaire n°3 posté par The Architect le 12/12/2008 à 09h09
Hummmm... Je crois avoir déjà vu aussi la même coïncidence. Si ça se trouve, nous partageons la même coïncidence (pas facile à taper au clavier ce mot) avec Môssieur The Architect (à ce propos, ça fait un peu "pompeux" comme titre, The Architect) Signé = Jalous Guy ;-)
Commentaire n°4 posté par Gigot le 29/12/2008 à 09h43
Décidement, est ce que cette coincidence ne serait pas qu'une simple coincidence ???
Réponse de LAO le 29/12/2008 à 10h44
Bon site Mais il est inutile d'administer le recycle bin quand il manque de place dans le tablespace oracle utilise tout seul l'espace pris par les objets de la recyclebin
Commentaire n°5 posté par Arnaud Presles le 06/10/2009 à 11h03

Je conseille vivement de désactiver cette option de recyclebin en PRODUCTION.

Les effets de bord sont considérables. A utiliser éventuellement en DEVELOPPEMENT ou TEST.

C'est une fonction interessante, mais à utiliser avec précaution.

Commentaire n°6 posté par Sylvain le 16/09/2010 à 08h20

Bonjour,

Auriez vous quelques exemples d'effet de bord ?

LAO.

Réponse de LAO le 16/09/2010 à 12h45

Catégories

Recherche

Calendrier

Février 2012
L M M J V S D
    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        
<< < > >>

Profil

  • LAO
  • My Oracle blog
  • Homme
  • 06/05/1972
  • IDF
  • DBA
Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés