Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
11 décembre 2008 4 11 /12 /décembre /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.






Partager cet article
Repost0

commentaires

F
Je vois 2 effets de bord<br /> 1) en mode autoextend de tablespaces : l'extension se fera avant de passer par l'écrasement de la recyclebin : donc sans contrôle, vos TBS vont enfler, vos backups vont prendre plus de temps<br /> 2) vos delete n'en sont pas et les données supprimées sont récupérables (sous certaines conditions). Ca peut être un plus en terme de temps de restauration, c'est clairement un moins en terme de sécurité (mais ma foi il reste l'option drop table purge)
Répondre
S
<br /> <br /> Je conseille vivement de désactiver cette option de recyclebin en PRODUCTION.<br /> <br /> <br /> Les effets de bord sont considérables. A utiliser éventuellement en DEVELOPPEMENT ou TEST.<br /> <br /> <br /> C'est une fonction interessante, mais à utiliser avec précaution.<br /> <br /> <br /> <br />
Répondre
L
<br /> <br /> Bonjour,<br /> <br /> <br /> Auriez vous quelques exemples d'effet de bord ?<br /> <br /> <br /> LAO.<br /> <br /> <br /> <br />
A
<br /> 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<br /> <br /> <br />
Répondre
G
Hummmm...<br /> Je crois avoir déjà vu aussi la même coïncidence.<br /> 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)<br /> <br /> Signé = Jalous Guy ;-)
Répondre
L
<br /> Décidement, est ce que cette coincidence ne serait pas qu'une simple coincidence ???<br /> <br /> <br />
T
J'aurais pourtant juré avoir déjà vu ce genre de truc quelque part.<br /> Mais tu as certainement raison, ce ne peut être qu'une coïncidence.
Répondre