D -Sauvegarde

D.1 - Sauvegarde et restauration Oracle

Présentation

Les  Sauvegardes et restauration, permettent de se prémunir plus ou moins parfaitement de la perte accidentelle de données physique, fichier de données ou autre.
Principaux cas de figure : corruption de fichier, perte de fichier , perte de disque.

Elle assurent la fiabilité des données un domaine parmi d’autres de la sécurité des données.

remarque : de manière détournée, les sauvegardes logiques ou physiques peuvent être utilisées pour transférer / dupliquer des données pour un tout autre but que la fiabilité des données.
Par exemple :

  • maintien de base de test à jour
  • copie de BD pour infocentre ou Business Intelligence
  • mise en production
  • etc

Elles obéissent à une stratégie :

  • Quoi sauvegarder : totalité, tablespace, uniquement les données sensibles, etc.
  • Quand : fréquence pluri quotidienne, quotidienne, hebdomadaire, etc.
  • Comment : à froid, à chaud, physiquement, logiquement

et répondent à des contraintes :

  • disponibité des données : haute, moyenne, basse
  • importance relative de certaines données
  • temps de reprise
  • volume maximum de perte supporté
  • économie (par exemple la très haute disponibilité coute cher…)

Les grandes catégories de sauvegarde

  • Sauvegardes physiques totale

Elle se fait ‘à froid’, c’est à dire base fermée. Elle est simple et rapide (dépend seulement de la taille des fichiers et de la vitesse des disques). Elle n’est pas ‘divisible’ par définition.

On sauvegarde les fichiers physiques (au niveau OS donc) de la base de données. TOUS les fichiers physiques : les fichiers de données bien sûr mais aussi les fichioers de paramétrage (SPFile et init.ora) , de controle, fichiers journaux (REDO Logs)…

  • Sauvegarde physique partielle

On sauvegarde uniquement certains tablespaces (et donc tous les ficheirs physiques qu’il contient). SI un tablepace correspond à une application pariculière, on sauvegarde donc toutes les données de cette application. La liste des fichiers d’un tablespace est donnée dans le dictionnaire.
Peut se faire à chaud ou à froid.

  • Sauvegarde logique totale ou partielle

On sauvegarde soit du SQL (CREATE TABLE + INSERT en général),
soit dans un format spécifique, grace à l’utilitaire EXPORT ou aux procédure DATAPUMP.
L’intérêt de cette méthode est sa granularité. On peut sauvegarder une table, qq tables, les données d’un schéma, ou une certaine catégorie d’objets connexes (vues, index, droits…)

remarques :

1) l’export et le datapump Oracle ne sont utilisables…que par l’IMPORT ou le datapump Oracle
2) les fichier SQL peut etre utilisé par un autre SGBD (MySQL, SQLServer) à la conformité au standard SQL près…
3) un utilisateur Lamda peut faire ses propres extractions

Voir le chapitre sur les transferts de données pour plus d’infos

Rappel sur la structure physique d’une base Oracle

Les principaux composants physques de la base (fichiers) sont résumés dans le schéma ci-après:

Il y a en gros au strict minimum :

  • 1 control file (contient une description de tous les fichiers de la base )
  • des fichiers de  données système (pour TBS system, sysaux, undo, temp,…)
  • des fichiers de données utilisateur ou applicatifs (users, compta, RH, clients,…)
  • 1 fichier de paramètres d’initialisation (spfile)
  • 2 fichiers journaux (redolog) qui contiennent une trace de toutes les modifications effectuées

rem : l’archivage des REDOLOGs est optionnel MAIS …OBLIGATOIRE !

oracle_dbfiles

Infos utiles du dictionnaire sur la base et ses fichiers

v$database
description générale de la base
DBA_TABLESPACES
description des tablespaces et fichiers
DBA_DATA_FILES
description des fichiers de données
v$logfile
description des redologsz
v$log_history
info sur l’historique de tous les redos issus du control file
v$log
infos sur les groupes et les membres
v$parameter
TOUS les parametres d’init de l’instance, y compris CONTROL_FILES…
v$controlfile
nom des control files

Zoom sur l’archivage des redologs files

Ce processus (process ARCH ou “ARCHIVER”) est optionnel et permet de faire des restaurations les plus à jour possible.
En l’absence d’archivage, on ne pourra récupérer les données que de la dernière sauvegarde. Avec l’archivage on récupérera ces mêmes données + les modifications qui ont été faites entre la sauvegarde et le crash. (seules les transactions en cours au moment du crash sont perdues). L’archivage permet de garder tout l’historique des fichiers redologs, qui sont recopier sur le répertoire d’archivage dès qu’ils sont pleins (Switch).
Si on n’archive pas les redologs sont écrasés cycliquement, puisque rappelons le, ils sont utilisés de manière séquentielle et circulaire !

  • mise en place de l’archivage

Vérification du mode courant :

SQL>  SELECT log_mode FROM v$database;
LOG_MODE
--------
ARCHIVELOG

-- Le cas échéant passer en mode ARCHIVELOG :
SQL> SHUTDOWN IMMEDIATE ; (ou NORMAL mais pas ABORT !)
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;

On pourra éventuellement positionner des paramètres supplémentaires comme le répertoire destination, le multiplexage éventuel  ou le format du nom de fichier
log_archive_dest_1 = “location=C:OracleoradataTESTarchive”
log_archive_format = %%ORACLE_SID%%T%TS%S.ARC
puis arrêt / redémarrage de la base.

* vérification de l’archivage (remplissage ou forcage des logs switchs)

SQL> ALTER SYSTEM SWITCH LOGFILE
voir log_archive_dest_1 et log_archive_format pour voir où les fichiers d’archive créés sur le disque

on peut également vérifier le statut de l’archivage avec la commande ARCHIVE LOG LIST :

SQL> archive log list;
Database log mode           Archive Mode
Automatic archival           Enabled
Archive destination           USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     12
Next log sequence to archive   14
Current log sequence           14

en version 11 USE_DB_RECOVERY indique que c’est la flashback_area qui est utilisée pour stocker les archives.  Si on veut + d’infos on peut voir les parametres DB_RECOVERY_FILE_DEST et DB_RECOVERY_FILE_SIZE :

SQL>  SHOW PARAMETER DB_RECOVERY_FILE

NAME                       TYPE        VALUE
-------------------------  ----------- ------------------------------
db_recovery_file_dest      string      /oracle/flash_recovery_area
db_recovery_file_dest_size big integer 3000M
On voit donc ici l'emplacement de la flashback area et sa taille de 3GO.

Attention à la prolifération des LOGS archivés, notamment en cas de grosse procédure batch de mise à jour, il est conseillé de désactiver l’archivage !
Il est conseillé également de purger les archives après chaque nouvelle sauvegarde réussie !

Il est possible comme on le verra de multiplexer les logs archivés pour (encore et toujours) plus de sécurité

Les cas de récupération automatique

Certains problèmes ne relèvent pas de la perte de données physiques, mais plutôt de la perte d’information en mémoire centrale : interruption d’une transaction par exemple. Ces problèmes sont automatiquement résolus par Oracle :
- echec d’un ordre SQL : provoque une erreur d’execution documentée
- echec de process client (interruption du client, pb réseau, arrêt du shadow process) : provoque un Rollback de la transaction
- echec de l’instance (arrêt d’un process de fond du serveur, arrêt CPU serveur) : provoque un Rollback immédiat ou différé (au redémarrage de la base…)

remarque : certains dispositifs matériels : disques miroir, CPUs redondants, machines à très haute disponibilité, etc. peuvent prendre en charge de manière automatique et transparente les pertes de données physiques, sans passer par un processus de sauvegarde / restauration.

Principes d’organisation et de répartition :

multiplexages des fichiers de contrôle

séparation des fichiers de données et des fichiers redologs sur des disques différents -

CREATE DATABASE test DATAFILE ‘d:dataoratest_system’ SIZE 10M
LOGFILE GROUP 1 (’e:/data/oratest_log1a’) SIZE 500K,
GROUP 2 (’e:/data/oratest_log2a’) SIZE 500K;

create tablespace TB1 datafile ‘d:dataoradata1.dbf’ size 100M’;

ici on crée un nouveau Tablespace (et donc un fichier de données) sur le même disque que le fichier du tablespace ‘SYSTEM’ qui contient le dictionnaire. Ce n’est peut être pas une bonne idée en terme de performances…

multiplexage des fichiers de controle

pour ce faire il suffit de déclarer plusieurs fichiers de controle, sur des disques différents. Les mises à jour éventuelles par le noyau Oracle seront faites simultanément dans tous les fichiers. En cas de perte il suffira de recopier un des autres control file et de le renommer avec le nom du fichier perdu, puis de redémarrer la base.
la liste des fichiers de contrôle est spécifié dans le fichier de démarrage de la base : INIT.ORA
ex :
INIT_test.ora
DB_NAME = TEST
CONTROL_FILES = (/disk1/test_ctl1.ora, /disk2/test_ctl2.ora)

multiplexage des journaux (redo log files)

On a vu que l’écriture dans les redo logs files est circulaire.
Au minimum une base doit contenir 2 groupes de un fichier.
Pour permettre l’écriture simultanée de plusieurs redo logs et ainsi les sécuriser, on crée 2 fichiers ou plus par groupe.

oracle_redolog_files

exemple :

le minimum, 2 groupes contenant chacun un fichier (pas de multiplexage donc…)
CREATE DATABASE test DATAFILE ‘d:dataoratest_system’ SIZE 10M
LOGFILE GROUP 1 (’d:dataoratest_log1a’) SIZE 500K,
GROUP 2 (’d:dataoratest_log2a’) SIZE 500K;

un peu mieux, LGWR va écrire simultanément dans les 2 fichiers du groupe courant
CREATE DATABASE test DATAFILE ‘d:dataoratest_system’ SIZE 10M
LOGFILE GROUP 1 (’d:dataoratest_log1a’, ‘e:dataoratest_log1b’) SIZE 500K,
GROUP 2 (’d:dataoratest_log2a’, ‘e:dataoratest_log2b’) SIZE 500K;

protection max : ceinture ET bretelles (on écrit dans 3 fichiers en même temps)

CREATE DATABASE test DATAFILE ‘d:dataoratest_system’ SIZE 10M
LOGFILE GROUP 1 (’d:dataoratest_log1a’, ‘e:dataoratest_log1b’ , ‘f:dataoratest_log1b’) SIZE 500K,
GROUP 2 (’d:dataoratest_log2a’, ‘e:dataoratest_log2b’ , ‘f:dataoratest_log1b’) SIZE 500K;

si on veut augmenter le temps de rebouclage du cycle d’écriture, ou en d’autres termes augmenter le délai avant écrasement éventuel du contenu du 1er journal, on peut rajouter des groupes supplémentaires…

Multiplexage des logs ARCHIVES

on utilise le paramètre LOG_ARCHIVE_DEST_n (où n est un entier de 1 à 5)
LOG_ARCHIVE_DEST_1 = ‘LOCATION=/disk1/arc/’
LOG_ARCHIVE_DEST_2 = ‘LOCATION=/disk2/arc/’
LOG_ARCHIVE_DEST_3 = ‘LOCATION=/disk3/arc/’
avec le format suivant
LOG_ARCHIVE_FORMAT = arch%t_%s.arc

on aura le résultat suivant (thread 1; log sequence de 100 à 102)

/disk1/arc/arch1_100.arc, /disk1/arc/arch1_101.arc, /disk1/arc/arch1_102.arc,
/disk2/arc/arch1_100.arc, /disk2/arc/arch1_101.arc, /disk2/arc/arch1_102.arc,
/disk3/arc/arch1_100.arc, /disk3/arc/arch1_101.arc, /disk3/arc/arch1_102.arc

Principe général de restauration physique

Le principe est d’avoir sous la main une sauvegarde plus ou moins ancienne et de disposer d’un historique de toutes les modifications effectuées depuis cette sauvegarde. Ceci grace aux redolog en ligne et si nécessaire aux redologs archivés.

Une fois que les fichiers nécessaires sont restaurés, le DBA doit initier une restauration du support  (media recovery).
Pour que cette restauration assure des données cohérentes, Ceci implique notamment des mécanismes d’application d’image après et d’image avant ( rollforward and rollback ). Les modifications à appliquer sont choisies sélectivement à partir des redolog online et offline (archivés) et s’appuie sur les no SCN indiquant des points de cohérence dans le temps.

recovery

restauration du control file perdu

en cas de perte d’un control file il suffira
d’arreter la base,
de vérifier les spécifications des fichiers de controle dans l’ INIT.ORA,
de recopier le fichier manquant à partir d’un de ses jumeaux dans le répertoire de destination,
et de rouvrir la base

D.2 - Vérification des hypotheses minimales de sécurité

Base en mode archivelog  ? :

SQL>  SELECT log_mode FROM v$database;
LOG_MODE
--------
ARCHIVELOG

en cas de probleme la passer en mode ARCHIVELOG :
SQL> SHUTDOWN IMMEDIATE ; (ou NORMAL mais pas ABORT !)
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;

Processus d’Archivage et espace disque OK ?

On peut tester que l’archivage fonctionne en forcant un switch de redolog et donc…une archive.

SQL> ARCHIVE LOG LIST;
...
Current Log sequence 22
...
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> ARCHIVE LOG LIST;
...
Current Log sequence 23
...

Vérifier aussi qu’il y a de la place sur la destination d’archivage  ( parametre LOG_ARCHIVE_DEST) ou par défaut $ORACLE_HOME/dbs

Redolog files multiplexés ? :

Ici on veut plusieurs membres par groupes.

SQL> select group#, status, member
from v$logfile;

GROUP# STATUS MEMBER
1 ONLINE /REDO/log_11.rdo
2 ONLINE /REDO/log_21.rdo
3 ONLINE /REDO/log_31.rdo
4 ONLINE /REDO/log_41.rdo

et si ce n’est pas le cas (comme ici 4 GROUP avec chacun 1 fichier non multiplexé)  on peut rajouter des membre SUR UN DISQUE DIFFERENT bien sur ! :

SQL>  ALTER DATABASE ADD LOGFILE MEMBER
'/DISK2/log_12.rdo' TO GROUP 1,
'/DISK2/log_22.rdo' TO GROUP 2,
'/DISK2/log_32.rdo' TO GROUP 3,
'/DISK2/log_42.rdo' TO GROUP 4;

Control File multiplexés :

SQL> select name
from v$controlfile;
NAME
/data/ctrl1PRDUN.ctl
/data/ctrl2PRDUN.ctl

et si ce n’est pas le cas (comme ici 2 fichier mais dans le meme filesystem !!) :

SQL> SHUTDOWN IMMEDIATE;$> cp /data/ctrl1.ctl  /DISK2/ctrl3.ctl
SQL> CREATE PFILE FROM SPFILE;
$> modifier le parametre CONTROL_FILE du nouveau fichier init.ora
pour y faire référence au nouveau control file(dans $ORACLE_HOME/dbs par défaut)
CONTROL_FILES=(....,nouveau_ctl.ctl)SQL> -- demarrer la base avec le pfile
SQL> STARTUP PFILE=$ORACLE_HOME/dbs/init<ORACLE_SID>.ora
SQL> recreer le spfile
SQL> CREATE SPFILE FROM PFILE;
SQL>-- redemarrer normalement...
SQL> SHUTDOWN IMMEDIATE; (ou abort...)
SQL> STARTUP

D.3 - L’outil RMAN

L’outil RMAN (pour Recovery MANager) est l’outil standard d’ Oracle, pour faire les sauvegardes / restaurations de manière efficace et documentée.
Il est disponible  depuis la version 8 d’Oracle, et ne cesse d’évoluer au fur et à mesure des versions.

Il permet de :

  • faire des sauvegardes physique ou logiques de la base (tablespaces, fichiers de données, de fichiers de contrôle  et de fichiers d’archive (archivelog), totales ou partielles
  • faire des sauvegardes incrémentielles (différentielles ou cumulatives) au niveau bloc
  • documenter les sauvegardes dans un catalogue partagé, ou dans les fichiers de contrôle (dédié donc)
  • gérer les périodes de rétention des sauvegardes
  • de faire des duplications de base simplement

Pour une information complète sur RMAN voir par exemple le manuel de référence complet 11gR1 :
http://psoug.org/reference/rman.html

La base doit être en ARCHIVELOG pour pouvoir faire des BACKUP / RESTORE cohérents. Sinon on obtien une erreur du style :

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 06/10/2011 18:26:31
ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode

Voir le paragraphe ‘Verification des hypothèse de sécurité’ pour passer en mode archivelo

Types de sauvegarde

RMAN autorise des  sauvegardes de type  :

  • COMPLET (ou FULL) : on sauvegarde tous les blocs
  • Incrémentale

Les sauvegardes incrémentales

Une sauvegarde incrémentale permet comme son nom l’indique de ne pas sauvegarder la totalité des données tous les jours, mais simplement ce qui a été modifié depuis une certaine période.
Il en existe 2 types, qui se différencient par leur mode de résumé des opérations précédentes.

  • DIFFERENTIEL : on ne sauvegarde que les blocs modifiés depuis la précédente sauvegarde de niveau n ou inférieur
  • CUMULATIF : on ne sauvegarde que les blocs modifiés depuis la précédente sauvegarde de niveau n-1

Pour ce faire RMAN utilise des niveaux de sauvegarde (3) :
le Niveau 0 : Sauvegarde de référence : l’ensemble des blocs contenant des données
le Niveau 1 : Sauvegarde tous les blocs modifiés depuis la plus récente sauvegarde incrémentale de niveau 0
le Niveau 2 : sauvegarde tous les blocs modifiés depuis la plus récente sauvegarde incrémentale de niveau 0, 1 ou 2.

En différentiel ca fait ca :

differentiel

et en cumulatif (qui permet de gagner du temps lors de la restaure…ca fait ca ;

cumulatif

Quelques commandes RMAN utiles

CONFIGURE
permet de paramétrre le fonctionnement de RMAN.
BACKUP
Sauvegarde les DB Files, archive logs, backups et copies
CHANGE
Change le statut d’un backup ou d’une copie dans le catalogue RMAN .
LIST
affiche des infos générales  sur l’état des sauvegardes/restaurations
COPY
Fait des copies ‘images’ des database files, archived logs, backups, et copies.
CROSSCHECK
Vérifie l’existence des backup pieces, copies proxy et disques copies
DELETE
Efface les backups et copies, passe les enregistrements de metadonnées
du CONTROL FILE au statut DELETED ou suppriime les metadonnées du CATALOG (le cas éch
RECOVER
Fait un media recovery sur les backups et copies RMAN
REPORT
Fait un rapport sur diverses infos utiles : quels fichiers ont besoin de backups,
sont obsoletes ou irrécupérables, liste les fichiers de la DB.
RESTORE
Restaure les backups et copies RMAN
RUN
Utile pour executer certaines commandes (sans les entrer directement) comme ALLOCATE CHANNEL ou SET
configure la session RMAN courante
SHOW
affiche les commandes CONFIGURE courantes

Quelques exemples :

– on travaillait sur bande et on veut plus…
RMAN> configure default device type to disk;
– on alloue un canal et on travaille sur disque
RMAN> run
2> { allocate channel c1 device type disk;
3> }
allocated channel: c1 channel c1: SID=99 device type=DISK released channel: c1
RMAN> configure controlfile autobackup on;

-- backup complet de la base par défaut
RMAN> backup database;
-- faire 1 image copy (copie binaire de fichiers)
RMAN> backup as copy database;
-- backup db en tant que backup set
RMAN> backup as backupset database;
-- backup a database and archived logs to disk;
 in backup set format
RMAN> backup as backupset device type disk database plus archivelog;-- Show copy information for all image copiesRMAN> list copy;

-- Show backup information for all backup pieces
RMAN> list backup;

-- Show all backup details for backup sets
RMAN> list backup of database;
RMAN> list copy of datafile 1, 2, 3;

-- which files need backing up under current retention policy
RMAN> report need backup database;

-- list all datafiles for which an unrecoverable
operation has been performed
-- against an object in the datafile since the last backup
of the datafile.
RMAN> report unrecoverable;

-- Show items that beed 7 days worth of
-- archivelogs to recover completely
RMAN> report need backup days = 7 database;  

-- Show/Delete items not needed for recovery
RMAN> report obsolete;RMAN> delete obsolete;

-- Show/Delete items not needed for point-in-time
-- recovery within the last week
RMAN> report obsolete recovery window of 7 days;
RMAN> delete obsolete recovery window of 7 days;

-- Show/Delete items with more than 2 newer copies available
RMAN> report obsolete redundancy = 2 device type disk;
RMAN> delete obsolete redundancy = 2 device type disk;

-- Show datafiles that connot currently be recovered
RMAN> report unrecoverable database;RMAN> report unrecoverable tablespace USERS;

Se connecter à RMAN

RMAN est un outil sous forme de commande binaire d’oracle. On peut le lancer et se connecter à son référentiel de différentes façons :

-- lancement de RMAN sans connexion au référentiel
$>rman-- puis, connexion à une cible locale
-- (on utilise le CONTROL FILE comme référentiel!)
-- l'environnement (ORACLE_SID et autres, doit etre OK)
RMAN> connect TARGET sys/password@targetSID
-- on se connecte à un référentiel basé externe (le catalogue)
RMAN> connect CATALOG rman_user/password@rmanSID
-- on secoonecte à la cible par défaut en authent externe
$>rman target /

Configuration de RMAN

La commande CONFIGURE permet de paramétrre le fonctionnement de RMAN.
La syntaxe est du genre ‘CONFIGURE OPTION VALEUR;’.
Il est possible de vérifier la configuration courante de RMAN avec la commande SHOW ALL.

RMAN> show all;

RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘/WORK_RMAN_APP2/prdun/%F’;
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO COMPRESSED BACKUPSET;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM ‘AES128′; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO ‘/work/oracle/prdun/rman/backup/snapcf_PRDUN.f’;
RMAN>

Quelques avantages de RMAN

C’est un outil puissant injustement sous utilisé. Il offre entre autre

  • l’intégration dans l’interface graphique de OEM Grid Control
  • la simplicité  (tous les fichiers physiques constituant la DB sont catalogués)
  • d’être  en standard avec la license Oracle (depuis la 8i)
  • la gestion multibase centralisée possible (avec le catalogue)
  • la synchronisation auto avec les disques ou le gestionnaire de Media (CROSSCHECK) en cas de modif des fichiers OS
  • des politiques de rétention configurable
  • une compatibilité avec les technos Oracle (! mais si)  avancées  (RAC, dataguard, TBS transportable, ASM, …)
  • la possibilité de faire des clones (+ ou - jumeaux) des bases de données (DUPLICATE)

Quelques exemples de scénarios de sauvegardes restauration avec RMAN

sauvegarde complète minimaliste

connect target /
configure controlfile autobackup on ;
run {
backup database plus archivelog ‘ ;
}

sauvegarde complète

-- ici toutes les valeurs ne sont pas par défaut-- on précise la rétention, les formats de fichiers et on nettoie ce qui ne sert plus...connect TARGET /CONFIGURE CONTROLFILE AUTOBACKUP ON;CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘/(put backup directory here)/autobackup_control_file%F’;CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;run {ALLOCATE CHANNEL RMAN_BACK_CH01 TYPE DISK;CROSSCHECK BACKUP;BACKUP AS COMPRESSED BACKUPSET DATABASE FORMAT ‘/(put backup directory here)/databasefiles_%d_%u_%s_%T’;sql ‘ALTER SYSTEM ARCHIVE LOG CURRENT’;BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL FORMAT ‘/(put backup directory here)/archivelogs_%d_%u_%s_%T’ DELETE INPUT;BACKUP AS COMPRESSED BACKUPSET CURRENT CONTROLFILE FORMAT ‘/(put backup directory here)/controlfile_%d_%u_%s_%T’;CROSSCHECK BACKUP;DELETE NOPROMPT OBSOLETE;DELETE NOPROMPT EXPIRED BACKUP;RELEASE CHANNEL RMAN_BACK_CH01;}EXIT;

restauration complète

$rman catalog rman/rmanpwd@aliascatalog target /
Recovery Manager: Release 9.2.0.1.0 - 64bit Production Copyright (c) 1995, 2002, Oracle Corporation.
All rights reserved.
connected to target database: DB1 (DBID=1966171371)
connected to recovery catalog database
RMAN> Run {
allocate channel t1 type disk;
restore database;
recover database;
sql “alter database open”;
}

De la même façon que précédemment, on alloue un canal de type disk. On restaure la base de données. Etant donné qu’il n’y a aucun paramètre complémentaire, RMAN prend la dernière sauvegarde valide. Ensuite on applique un recover ayant pour effet de réappliquer l’ensemble des archives et des redo logs actifs. Et enfin on ouvre la base pour la rendre disponible à nouveau.

restauration de tablespace à chaud

$rman catalog rman/rmanpwd@aliascatalog target /
Recovery Manager: Release 9.2.0.1.0 - 64bit Production Copyright (c) 1995, 2002, Oracle Corporation.
All rights reserved.
connected to target database: DB1 (DBID=1966171371)
connected to recovery catalog database
RMAN> Run {
sql “alter tablespace TBS_DATA offline”;
allocate channel t1 type disk;
restore tablespace TBS_DATA;
recover tablespace TBS_DATA;
sql “alter tablespace TBS_DATA online;”;
}

Il faut mettre le tablespace offline avant de pouvoir le restaurer. Ensuite on le restaure et on le remet online.
Les différents types de restauration sont très nombreux, on peut restaurer uniquement un fichier, ou des archives logs, etc…

Bonus track

erreur lors du backup RMAN :

RMAN> backup XXXX…
Starting backup at 10/06/2011

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 06/10/2011 18:44:38
ORA-19504: failed to create file “/work/dba1/backup/UN_3tmei7sk_125_1″
ORA-27040: file create error, unable to create file
IBM AIX RISC System/6000 Error: 2: No such file or directory

solution 1 : donner les bons droits d’accès au répertoire
solution 2 : le répertoire n’existe pas …le créer
solution 3 : changer la destination des fichiers de backup pour être conforme à l’OS
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   ‘/work/dba1/backup/%d_%u_%s_%p’;
new RMAN configuration parameters are successfully stored

Repartir a 0
RESET des backups…
RMAN> DELETE EXPIRED BACKUPSET;

D.4 Introduction au Flashback Recovery

Très succintement introduit en 9i le concept de ‘restauration Flash’ (Flash Recovery) a été sensiblement étendue avec Oracle 10g.
Il permet de rapidement revenir en arrière dans le temps, sans nécessiter de sauvegarde préalable, comme dans une restauration classique jusqu’a une certaine date (point in time recovery).

Le ‘Flashback recovery’ peut suivant les cas être executé sans aucun prérequis ou nécessiter des proccess et de la place disque supplémentaire.
Il permet de récuper la base suite à une erreur utilisateur ou un bug applicatif, qui aurait corrompu ou supprimé des données.

Il existe cinq niveaux de ‘Flashback recovery’ :

  • Flashback drop : le plus simple, il permet de revenir en arrière et d’annuler la suppression d’une table
  • Flashback database : permet de revenir en arrière jusqu’a une date/heure donnée
  • Flashback table
  • Flashback Version query
  • Flashback (Transaction) Query

Configuration de la base Oracle pour utiliser le FLASHBACK

Le FLASHBACK à l’instar des ROLLBACK de transaction s’appuie sur les tablespaces UNDO.
Ces UNDO Tablespaces devront bien sûr être taillés en fonction des besoins de rétention.

La rétention se paramètre avec le paramètre d’instance ou d’initialisatiuon UNDO_RETENTION (qui est dynamique et est exprimé en secondes)

SQL> — autoriser une rétention de 1H :
SQL> ALTER SYSTEM SET UNDO_RETENTION = 3600;

Le paramètre UNDO_MANAGEMENT doit être  AUTO (il est par défaut a MANUAL et est statique => redémarrage de la base)

SQL> — undo management AUTO
SQL> ALTER SYSTEM SET UNDO_MANAGEMENT= AUTO;

Des droits sont nécessaires pour pouvoir effectuer des FLASHBACK. Ces droits peuvent être données de manière transversale (FLASHBACK de n’importe quel objet) ou unitaire.

SQL> GRANT FLASHBACK ANY TABLE TO mon_dba;
SQL> GRANT FLASHBACK ON SCOTT.employee TO scott;

Dans le cas ou vous auriez besoin d’utiliser le package spécialisé  DBMS_FLASHBACK il faut bien sûr des droits d’exécution spécifiques :

SQL> GRANT EXECUTE ON DBMS_FLASHBACK TO scott;

Le Flashback QUERY

Avec  la syntaxe du SELECT AS OF on peut écupérer des données consulter des données ‘anciennes’ à une date précise dans le passé, absolue ou relative.

-- quelles étaient les données le 4 avril 2010 à 9H30 ? :
SQL> SELECT * FROM employee AS OF TIMESTAMP
   TO_TIMESTAMP('2010-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
   WHERE name = 'JOHN';
-- ou il ya 1 heure
SQL> INSERT INTO employee(SELECT * FROM employee AS OF TIMESTAMP
     TO_TIMESTAMP('2003-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
     WHERE name = 'JOHN');
-- Ou plus fort mais sur le même principe
-- insérons les données comme elles étaient au 4 avril 2010
SQL> INSERT INTO employee(SELECT * FROM employee AS OF TIMESTAMP
     TO_TIMESTAMP('2003-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
     WHERE name = 'JOHN');

Pour plus de détails sur le FLASHBACK QUERY et le ‘ SELECT AS OF ‘  Voir l’article :

http://www.oracle-dox.net/McGraw.Hill-Crystal.Reports.9/7206final/LiB0058.html

La récupération rapide d’une base, permet un retour arrière…grace aux images avant modification, à partir de l’état courant. Il ne nécessite pas comme la restauration jusqu’à une date donnée (POINT IN TIME RECOVERY), de sauvegarde des fichiers préalable. La durée de restauration est indépendante de la taille de la base, mais simplement fonction du nombre d’opérations à annuler.
A la différence du FLASHBACK DROP TABLE qui n’a besoin d’aucune ressource optionnelle, le FLASHBACK DATABASE s’appuie sur :
- une zone de récupération (RECOVERY AREA) qui contient des fichiers LOGs supplémentaires spéciaux : les Flashback Database LOGs
- un process de fond spécifique : RVWR (Recovery Writer) qui écrit dans ces LOGs.

note : le mode FLASHBACK DATABASE utilise aussi les redologs file en ligne ou non, et nécessite donc d’être en mode ARCHIVELOG !

Passage en mode FLASHBACK DATABASE

On va préciser les spécifications de la zone de récupération (emplacement et taille) et passer la base en mode FLASHBACK. Pour cette opération la base doit être dans l’état montée non ouverte. Trois paramètres d’initilisation nous seront utiles :

DB_RECOVERY_FILE_DEST : répertoire contenant la zone de récupération (Flashback logs) DB_RECOVERY_FILE_DEST_SIZE : taille en KO(K) ou MO(M) de cette zone DB_FLASHBACK_RETENTION_TARGET : limite supérieure du temps de récupération en minutes (défaut 1440)Les paramètres de récupération rapide, peuvent être visualisés / spécifiés avec la console enterprise manager 10g, onglet ‘maintenance’ lien ‘paramètres de récupération’

flashback_db.jpg

Le passage en mode récupération rapide se fait ensuite avec la commande ‘ALTER DATABASE’ :

SQL> alter database flashback on;

alter database flashback on*ERROR at line 1:ORA-38706: Cannot turn on FLASHBACK DATABASE logging.ORA-38707: Media recovery is not enabled.

exemple d’étapes manuelles :

SQL> –Passage en mode archivage si nécessaire…
SQL> select log_mode from v$database;
LOG_MODE
————
NOARCHIVELOG
SQL> shutdown immediate;
Database shhutdown
SQL> startup mount
ORACLE instance started.
Total System Global Area 499122176 bytes
Fixed Size 2021824 bytes
Variable Size 142607936 bytes
Database Buffers 348127232 bytes
Redo Buffers 6365184 bytes
Database mounted

SQL> alter system archive log start;
System altered.
SQL> alter database archivelog;
Database altered.

SQL> alter database open;
Database altered.
SQL> — passage en mode Flashback
SQL> alter database flashback ON;
Database altered.
SQL> –vérification pour les inquiets…
SQL> SELECT FLASHBACK_ON FROM v$database;
FLASHBACK_ON
————
NO

flashback coté systeme

SQL> show parameter recovery_file_dest
NAME TYPE VALUE
—- —- —–
db_recovery_file_dest string /oracle/10GDB/flash_recovery_a rea
db_recovery_file_dest_size big integer 2G

$ pwd
/oracle/10GDB/flash_recovery_area/PORT64/flashback
oracle@sli-portail-4 flashback]$ ls -l
total 242352
-rw-r—– 1 oracle dba 8200192 mai 3 17:23 o1_mf_25k5pzmz_.flb
-rw-r—– 1 oracle dba 8200192 mai 3 18:00 o1_mf_25klr420_.flb
-rw-r—– 1 oracle dba 4104192 mai 3 18:14 o1_mf_25knwwbz_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 18:51 o1_mf_25koq0w9_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 19:00 o1_mf_25kqw7bf_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 19:15 o1_mf_25krdxhx_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 19:44 o1_mf_25ks9462_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 20:00 o1_mf_25kv0c3h_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 20:21 o1_mf_25kvyobd_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 20:59 o1_mf_25kx567w_.flb

ou l’on voit que les fichiers flashback ont l’extension ‘.flb’ et sont créés de manière relativement régulière, quelle que soit l’activité de la base.

note : la zone de restauration rapide (flashback area) sert à stocker les Flshback logs mais aussi tous les fichiers important de la BD, à savoir :
- datafiles,
- control files,
- redologs files curants,
- redolog files archivés.

Peut on faire la récupération ?

En d’autres terme, est que les FLASHBACK LOGs permettent de ‘remonter’ suffisamment loin dans le temps ?
C’est le paramètre db_flashback_retention_target qui va le déterminer :

SQL> SELECT VALUE/60 “Durée en heures ”
FROM v$PARAMETER
WHERE NAME = ‘db_flashback_retention_target’;

Durée en heures
—————
24

Quels flashback logs sont utiles ? (ceux depuis 9H30 du matin, pour etre sur, par exemple ici ):

select NAME , LOG# , THREAD# ,SEQUENCE#,BYTES ,
TO_CHAR(FIRST_TIME,’DD/MM HH24:MI’) “Modifié à ”
from V$FLASHBACK_DATABASE_LOGFILE
WHERE TO_CHAR(FIRST_TIME,’DD/MM HH24:MI’) >= ‘05/05 09:30′

NAME LOG# THREAD# SEQUENCE# BYTES Modifié à
…/flashback/o1_mf_25m79d8f_.flb 57 1 143 3981312 05/05 09:35
…/flashback/o1_mf_25m95vkq_.flb 58 1 144 3981312 05/05 10:00
…/flashback/o1_mf_25m9nqn0_.flb 59 1 145 3981312 05/05 10:00

Récupération d’un fichier control file perdu

Supprimons un control file (ca soulage) :
$> cd /oracle/oradata/DD1
$> rm control01.ctl

Tout se passe bien pendant un certain temps (si, si) mais au bout d’un moment tout de même on a :

ERROR at line 1:
ORA-00210: cannot open the specified control file
ORA-00202: control file: ‘/oracle/oradata/DD1/control01.ctl’
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

Pour restaurer le fichier il suffit d’arreter la base, de prendre une copie multiplexée du fichier et de le copier en lieu et place du fichier perdu, pusi de redémarrer la base

– vérifions l’emplacement du fichier  :
SQL> select name from v$controlfile;
NAME
——————————————————————————–
/oracle/oradata/DD1/control01.ctl
/oracle/oradata2/DD1/control02.ctl

ou bien :

SQL> show parameter control_files
NAME               TYPE   VALUE
control_files     string     /oracle/oradata/DD1/control01. ctl, /oracle/oradata2/DD1/cont                       rol02.ctl

S
SQL> SHUTDOWN ABORT
SQL> !cp ../../oradata2/DD1/control02.ctl control01.ctl
SQL> startup
You’re done  ;-)

Il se peut cependant que les fichier de controle ne soient pas en phase, dans ce cas on aura une erreur au reedémarrage du style :

SQL> startup
ORACLE instance started.

Total System Global Area  263049216 bytes
Fixed Size            2143496 bytes
Variable Size          234883832 bytes
Database Buffers       20971520 bytes
Redo Buffers            5050368 bytes
ORA-00214: control file ‘/oracle/oradata2/DD1/control02.ctl’ version 3801
inconsistent with file ‘/oracle/oradata/DD1/control01.ctl’ version 3785

Dans ce cas :

  1. arreter la base
  2. editer le init.ora pour ne laisser le control file OK (avec la dernière version : control02 ici)
  3. redemarrer avec ce init.ora ( startup pfile= )
  4. arreter la base
  5. copier le control 2 vers le control 1
  6. modifier le init.ora pour remettre le 2eme fichier de controle
  7. redémarrer la base

Récupération d’un fichier datafile perdu

Avec Oracle 11gR1 ou 11gR2 il est désormais très facile de restaurer un fichier de données perdu.

Supposons qu’on ait donc perdu un datafile.
Au bout d’un moment (si, si) Oracle va finir par s’en apercevoir et on aura une erreur ORA-1157.
Oracle ERROR at line 1:
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: ‘/tmp/dd.dbf’ DATAFILE

Datafile recovery en 6 clics

(oui je sais c’est un peu long)

L’hypothèse est toujours qu’on ait une sauvegarde RMAN en place qui tienne la route ( voir mon article : Sauvegarde Oracle 11g avec RMAN en 5 clics ,  pour + d’infos)

Avec la console OEM :

Cliquer sur l’onglet ‘Availability’, puis le lien ‘perform recovery’, choisir ‘recovery scope = datafile’ , clic ‘recover’, clic ‘Next’, clic ‘Next’ et ‘Submit’.

C’est fini ;-(

Datafile recovery en 3 commandes RMAN

On va voir ici comment récupérer un fichier perdu…sans savoir lequel ni connaitre RMAN !
En fait 2 commandes suffisent : ADVISE FAILURE et REPAIR FAILURE. C’est tout bonnement miraculeux ca s’appelle Data Recovery Advisor !

Les étapes de restauration sont très simples grace à DATA RECOVERY ADVISOR disponible avec Oracle 11g.
Concrètement ce Data recovery advisor consiste en qq commandes que l’on pourra lancer sous RMAN.

3 commandes utiles :

RMAN> LIST FAILURE : liste les pbs en cours détectés (fichiers manquents, corrompus, etc…)

RMAN> ADVISE FAILURE : propose des solution de recovery et produit un script associé

RMAN> REPAIR FAILURE : execute le script de récupération

Voici un exemple concret :

Connexion a RMAN

$> rman target sys@portab2-a-dd:1521/DD1.dd.com
connected to target database: DD1 (DBID=1767735647, not open)
RMAN>

Recherche de problemes éventuels :

RMAN> list failure;
using target database control file instead of recovery catalog
List of Database Failures
=========================
Failure ID Priority Status    Time Detected Summary
———- ——– ——— ————- ——-
1242       HIGH     OPEN      23-JUL-10     One or more non-system datafiles are missing

Ou si l’on souhaite avoir des infos plus détaillées sur le problème on utilise l’ID qui nous intéresse , ici 1242

RMAN> list failure 1242 detail;

List of Database Failures
=========================
Failure ID Priority Status    Time Detected Summary
———- ——– ——— ————- ——-
1242       HIGH     OPEN      23-JUL-10     One or more non-system datafiles are missing
Impact: See impact for individual child failures
List of child failures for parent failure ID 1242
Failure ID Priority Status    Time Detected Summary
———- ——– ——— ————- ——-
1245       HIGH     OPEN      23-JUL-10     Datafile 6: ‘/tmp/dd.dbf’ is missing
Impact: Some objects in tablespace DD might be unavailable

En suite la partie Assistance / conseil proprement dite (ADvisor) :

RMAN> advise failure;

analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=155 device type=DISK
analyzing automatic repair options complete

Mandatory Manual Actions
========================
no manual actions available
Optional Manual Actions
=======================
1. If file /tmp/dd.dbf was unintentionally renamed or moved, restore it
Automated Repair Options
========================
Option Repair Description
—— ——————
1      Restore and recover datafile 6
Strategy: The repair includes complete media recovery with no data loss
Repair script: /oracle/diag/rdbms/dd1/DD1/hm/reco_1841908370.hm

On peut dès lors récupérer le fichier de données effacé en une étape :

RMAN> REPAIR FAILURE

Ou si l’on veut mieux maitriser ce que l’on fait, visualiser le script et lancer les étapes de restauration et recovery manuellement :

Vérification du script généré :

$> more /oracle/diag/rdbms/dd1/DD1/hm/reco_1841908370.hm
# restore and recover datafile
restore datafile 6;
recover datafile 6;

Restauration (récupération) du fichier perdu à partir des Backups Sets de la sauvegarde RMAN :

RMAN> restore datafile 6;

Starting restore at 23-JUL-10
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00006 to /tmp/dd.dbf
channel ORA_DISK_1: reading from backup piece /oracle/flash_recovery_area/DD1/DD1/backupset/2010_07_22/o1_mf_nnnd1_BACUP_INCR_DEL_BAC_0_64jlhkvc_.bkp
channel ORA_DISK_1: piece handle=/oracle/flash_recovery_area/DD1/DD1/backupset/2010_07_22/o1_mf_nnnd1_BACUP_INCR_DEL_BAC_0_64jlhkvc_.bkp tag=BACUP_INCR_DEL_BAC_072210033828
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 23-JUL-10

Récupération de données supplémentaires et synchronisation des fichiers si nécessaire :

RMAN> recover datafile 6;

Starting recover at 23-JUL-10

using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:01
Finished recover at 23-JUL-10

Récupération d’un fichier redolog perdu

( Solution des erreurs ORA-00313 , ORA-00312, ORA-27037 ) et de messages du genre :
Errors in file /oracle/diag/rdbms/dd1/DD1/trace/DD1_arc0_2728.trc: ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: ‘/oracle/oradata/DD1/redo01.log’ ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3

On le sait mais on le rappelle quand même les REDOLOG files sont utilisés de manière séquentielle et circulaire ( voir     mon article sur l’introduction  aux sauvegardes Oracle )

Tout d’abord récupérons quelques informations sur les REDOLOG de la base. L’emplacement et le nombre des REDO LOG files est donné par la requete :

SQL> select group#,member from v$logfile

GROUP# MEMBER
------ --------------------------------
     3 /oracle/oradata/DD1/redo03.log
     2 /oracle/oradata/DD1/redo02.log
     1 /oracle/oradata/DD1/redo01.log
     1 /oracle/oradata2/DD1/redo01.log
     2 /oracle/oradata2/DD1/redo02.log
     3 /oracle/oradata2/DD1/redo03.log

Pour savoir quel groupe est le groupe courant actif on regarde la table v$log :

SQL> select group#, members, sequence#, archived, status
  from v$log
    GROUP#    MEMBERS  SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------------
     1        2          61 YES INACTIVE
     2        2          62 NO  CURRENT
     3        2          60 YES INACTIVE

Si l’on supprime un REDO LOG par exemple le 1er qui se trouve sur /oracle/oradata IL NE SE PASSE RIEN !!! pas d’erreurs !!! même si l’on fait des update, insert, create , commit, alter system switch logfile, alter system flush, etc…
Plus fort : si on arrete la base et la redemarre …ca fonctionne toujours ! Décidémmment Oracle est UNBREAKABLE (tant qu’il reste un membre dans le groupe mirroré…).

On peut quand même s’en apercevoir dans le dictionnaire un REDOLOG est Invalide !

SQL> select group#, member, status from v$logfile

    GROUP# MEMBER			       STATUS
---------- ----------------------------------- -------
	 3 /oracle/oradata/DD1/redo03.log
	 2 /oracle/oradata/DD1/redo02.log
	 1 /oracle/oradata/DD1/redo01.log      INVALID
	 1 /oracle/oradata2/DD1/redo01.log
	 2 /oracle/oradata2/DD1/redo02.log
	 3 /oracle/oradata2/DD1/redo03.log

-- voire en utilisant RMAN :
RMAN> list failure;

using target database control file instead of recovery catalog
List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
2444       HIGH     OPEN      05-AUG-10     Redo log file /oracle/oradata/DD1/redo01.log is missing

remarque : malheureusement a la différence des autre types de fichier on ne peut pas utiliser l’ Advisor et ses commandes miraculeuses ADVISE FAILURE et REPAIR FAILURE. La récupération devra être manuelle…
C’est pas grave il existe une autre commande miraculeuse : ALTER DATABASE CLEAR LOGFILE .
Pour ce faire la base doit être seulement montée et non ouverte :

Récupération de lignes spprimées dans une table

Sous certaines conditions il est possible de revenir en arrière sur des suppressions de lignes COMMITées !
(si elles ne sont pas COMMITées…un ROLLBACK suffit of course).

Ceci se fait en utilisant les UNDO tablespaces, si tant est que la base n’ait pas eu trop d’activité transactionnelle et ait une durée de rétention suffisante.

Le principe est de remonter dans le temps (FLASHBACK QUERY) avec des instructions SELEC…AS OF TIMESTAMP…jusqu’a une date avant la suppression.
Voici un petit exemple :

SQL> create table ddd as select * from scott.emp;
SQL> select count(*) from ddd;
COUNT(*)
——–
14
SQL> delete from ddd where sal < 2000;
8 ligne(s) supprimées.
SQL> commit;

On remonte dans le temps progressivement avec des SELECT AS OF de + en + anciens

SQL> SELECT count(*) FROM ddd
AS OF TIMESTAMP TO_TIMESTAMP(’13/09/10 10:30′,’DD/MM/YY HH:MI’)

SQL> SELECT count(*) FROM ddd
AS OF TIMESTAMP TO_TIMESTAMP(’13/09/10 09:30′,’DD/MM/YY HH:MI’)

SQL> SELECT count(*) FROM ddd
AS OF TIMESTAMP TO_TIMESTAMP(’13/09/10 1 08:30′,’DD/MM/YY HH:MI’)

et on finit par tomber (si le UNDO n’a apa été réutilisé !!!!) sur les 14 lignes.

Réinsertion des lignes comme avant la suppression :

SQL> delete from ddd;
SQL> insert into ddd
SELECT * FROM ddd
AS OF TIMESTAMP TO_TIMESTAMP(’13/09/10 08:30′,’DD/MM/YY HH:MI’);
14 ligne(s) insérée(s)
CQFD !

Rem : cette fonctionnalité peut s’avérer pratique pour retrouver la date du suppression accidentelle, et mieux cerner l’utilisateur ou le batch coupable de la suppression (dénoncer un coupable qui n’est pas le DNA est vital pour votre survie dans l’entteprise ;-)

Protégé : Récupération de TOUS les CONTROL_FILES perdus

Cet article est protégé par mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :


Récupération rapide d’une base (Database FLASHBACK RECOVERY)

La récupération rapide d’une base, permet un retour arrière…grace aux images avant modification, à partir de l’état courant. Il ne nécessite pas comme la restauration jusqu’à une date donnée (POINT IN TIME RECOVERY), de sauvegarde des fichiers préalable. La durée de restauration est indépendante de la taille de la base, mais simplement fonction du nombre d’opérations à annuler.
A la différence du FLASHBACK DROP TABLE qui n’a besoin d’aucune ressource optionnelle, le FLASHBACK DATABASE s’appuie sur :
- une zone de récupération (RECOVERY AREA) qui contient des fichiers LOGs supplémentaires spéciaux : les Flashback Database LOGs
- un process de fond spécifique : RVWR (Recovery Writer) qui écrit dans ces LOGs.

note : le mode FLASHBACK DATABASE utilise aussi les redologs file en ligne ou non, et nécessite donc d’être en mode ARCHIVELOG !

Passage en mode FLASHBACK DATABASE

On va préciser les spécifications de la zone de récupération (emplacement et taille) et passer la base en mode FLASHBACK. Pour cette opération la base doit être dans l’état montée non ouverte. Trois paramètres d’initilisation nous seront utiles :

DB_RECOVERY_FILE_DEST : répertoire contenant la zone de récupération (Flashback logs) DB_RECOVERY_FILE_DEST_SIZE : taille en KO(K) ou MO(M) de cette zone DB_FLASHBACK_RETENTION_TARGET : limite supérieure du temps de récupération en minutes (défaut 1440)Les paramètres de récupération rapide, peuvent être visualisés / spécifiés avec la console enterprise manager 10g, onglet ‘maintenance’ lien ‘paramètres de récupération’

flashback_db.jpg

Le passage en mode récupération rapide se fait ensuite avec la commande ‘ALTER DATABASE’ :

SQL> alter database flashback on;

alter database flashback on*ERROR at line 1:ORA-38706: Cannot turn on FLASHBACK DATABASE logging.ORA-38707: Media recovery is not enabled.

exemple d’étapes manuelles :

SQL> –Passage en mode archivage si nécessaire…
SQL> select log_mode from v$database;
LOG_MODE
————
NOARCHIVELOG
SQL> shutdown immediate;
Database shhutdown
SQL> startup mount
ORACLE instance started.
Total System Global Area 499122176 bytes
Fixed Size 2021824 bytes
Variable Size 142607936 bytes
Database Buffers 348127232 bytes
Redo Buffers 6365184 bytes
Database mounted

SQL> alter system archive log start;
System altered.
SQL> alter database archivelog;
Database altered.

SQL> alter database open;
Database altered.
SQL> — passage en mode Flashback
SQL> alter database flashback ON;
Database altered.
SQL> –vérification pour les inquiets…
SQL> SELECT FLASHBACK_ON FROM v$database;
FLASHBACK_ON
————
NO

flashback coté systeme

SQL> show parameter recovery_file_dest
NAME TYPE VALUE
—- —- —–
db_recovery_file_dest string /oracle/10GDB/flash_recovery_a rea
db_recovery_file_dest_size big integer 2G

$ pwd
/oracle/10GDB/flash_recovery_area/PORT64/flashback
oracle@sli-portail-4 flashback]$ ls -l
total 242352
-rw-r—– 1 oracle dba 8200192 mai 3 17:23 o1_mf_25k5pzmz_.flb
-rw-r—– 1 oracle dba 8200192 mai 3 18:00 o1_mf_25klr420_.flb
-rw-r—– 1 oracle dba 4104192 mai 3 18:14 o1_mf_25knwwbz_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 18:51 o1_mf_25koq0w9_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 19:00 o1_mf_25kqw7bf_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 19:15 o1_mf_25krdxhx_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 19:44 o1_mf_25ks9462_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 20:00 o1_mf_25kv0c3h_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 20:21 o1_mf_25kvyobd_.flb
-rw-r—– 1 oracle dba 3989504 mai 3 20:59 o1_mf_25kx567w_.flb

ou l’on voit que les fichiers flashback ont l’extension ‘.flb’ et sont créés de manière relativement régulière, quelle que soit l’activité de la base.

note : la zone de restauration rapide (flashback area) sert à stocker les Flshback logs mais aussi tous les fichiers important de la BD, à savoir :
- datafiles,
- control files,
- redologs files curants,
- redolog files archivés.

Peut on faire la récupération ?

En d’autres terme, est que les FLASHBACK LOGs permettent de ‘remonter’ suffisamment loin dans le temps ?
C’est le paramètre db_flashback_retention_target qui va le déterminer :

SQL> SELECT VALUE/60 “Durée en heures ”
FROM v$PARAMETER
WHERE NAME = ‘db_flashback_retention_target’;

Durée en heures
—————
24

Quels flashback logs sont utiles ? (ceux depuis 9H30 du matin, pour etre sur, par exemple ici ):

select NAME , LOG# , THREAD# ,SEQUENCE#,BYTES ,
TO_CHAR(FIRST_TIME,’DD/MM HH24:MI’) “Modifié à ”
from V$FLASHBACK_DATABASE_LOGFILE
WHERE TO_CHAR(FIRST_TIME,’DD/MM HH24:MI’) >= ‘05/05 09:30′

NAME LOG# THREAD# SEQUENCE# BYTES Modifié à
…/flashback/o1_mf_25m79d8f_.flb 57 1 143 3981312 05/05 09:35
…/flashback/o1_mf_25m95vkq_.flb 58 1 144 3981312 05/05 10:00
…/flashback/o1_mf_25m9nqn0_.flb 59 1 145 3981312 05/05 10:00

Récupération rapide d’une table supprimée (FLASHBACK DROP RECOVERY)

Les suppressions de table, ne sont plus désormais physiques et défintives, mais mettent simplement l’objet à la corbeille (RECYCLE BIN). Tant que cette dernière n’est pas vidée, il est possible de récupérer l’objet supprimé.

Des infos dans le dictionnaire…

Les informations concernant la corbeille peuvent être consultées dans le dictionnaire :

SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
————- ————— ———– ———
T1 BIN$EkKm2r93vZfgQKjAhw1XeA==$0 TABLE 2006-04-25:15:51:52

ou via les tables USER_RECYCLEBIN et DBA_RECYCLEBIN.

exemple
SQL> select original_name nom, object_name “nom interne”,
operation, createtime “date création “,
droptime “date suppression “, can_undrop “récupérable ? “, can_purge “purgeable ?”
FROM user_recyclebin

NOM NOM INTERNE OPERATION date création date suppression récupérable? purgeable?
— —————————— ——— ——————- ——————- ———— ———-
T1 BIN$Ejia7J3wZRXgQKjAhw0prg==$0 DROP 2006-04-25:15:10:17 2006-04-25:15:10:22 YES YES
T2 BIN$Ejia7J3vZRXgQKjAhw0prg==$0 DROP 2006-04-25:15:09:30 2006-04-25:15:09:35 YES YES

note : les colonnes CREATETIME et DROPTIME sont des…VARCHAR (?)

exemples de récupération

SQL> FLASHBACK TABLE T2 TO BEFORE DROP
SQL> FLASHBACK TABLE “BIN$Ejia7J3vZRXgQKjAhw0prg==$0″ TO BEFORE DROP

note : on peut donc également utiliser le nom interne ET CE QUEL QUE SOIT LA COMMANDE SQL !
Il est conseillé de l’encadrer par des guillemets pour masquer les caractères spéciaux

Une table T1 peut avoir été supprimée plusieurs fois, et apparaître plusieurs fois dans la corbeille.
Pour éviter toute ambiguité, il faut vérifier le contenu de la poubelle avant récupération
et utiliser le nom interne le cas échéant plutot que le nom logique.

exemple
SQL> create table t1 (n integer);
SQL> drop table t1;
SQL> create table t1(new_n integer);
SQL> drop table t1;
et dans la corbeille on a :
NOM nom interne OPERATION date création date suppression
T1 BIN$EkKm2r92vZfgQKjAhw1XeA==$0 DROP 2006-04-25:15:51:14 2006-04-25:15:51:28
T1 BIN$EkKm2r93vZfgQKjAhw1XeA==$0 DROP 2006-04-25:15:51:44 2006-04-25:15:51:52

SQL> desc “BIN$EkKm2r93vZfgQKjAhw1XeA==$0″
Name Type
NEW_N NUMBER(38)

SQL> –c’est bien celle que je veux recuperer…dont acte
SQL> FLASHBACK TABLE “BIN$EkKm2r93vZfgQKjAhw1XeA==$0″ TO BEFORE DROP;

Suppression permanente

On peut supprimer une table de la corbeille avec la commande ‘PURGE’ :

SQL> PURGE TABLE T3

ou indirectement en utilisant des commandes affectant le tablespace utilisateur :

SQL> PURGE TABLESPACE users;
– purge tous les objets du tablespace
SQL> PURGE TABLESPACE users USER scott;
–purge tous les objets de SCOTT du tablespace USERS

ou vider en une fois la poubelle utilisateur ou la poubelle générale :

SQL> PURGE recyclebin;
SQL> PURGE dba_recyclebin;

Eviter la poubelle

On peut également supprimer physiquement et directement une table, en évitant de la conserver dans la corbeille donc, avec l’option ‘PURGE’ de la commande ‘DROP TABLE’
SQL> DROP TABLE T5 PURGE

Ou invalider l’utilisation de la poubelle de manière transversale,
grace au paramètre d’initialisation ‘RECYCLEBIN’

SQL> show parameter recyclebin
NAME TYPE VALUE
recyclebin string ON

SQL> ALTER SYSTEM SET recyclebin = OFF;
System Altered

SQL> show parameter recyclebin
NAME TYPE VALUE
recyclebin string OFF

sauvegarder une base avec RMAN en 5 clics !

RMAN est réputé compliqué à utiliser car il faut connaitre son langage de SCRIPT.
Tant pis pour les geeks … on va mettre en place une sauvegarde quotidienne (automatique et incrémentale) de la base Oracle 11g, sans une seule ligne de commande avec Enterprise Manager…en 5 clic.
Pour faire simple on va choisir les backup préconisés par Oracle (Oracle-suggested Backups) c’est a dire des Backup Incrementaux (sauf le premier bien sur) fais quotidiennement.

Prérequis avoir une Flashback Recovery Area définie et de taille suffisante pour accueillir les backups…
Verifier avec :

SQL> SHOW PARAMETER DB_RECOVERY

0) lancer la console Oracle Enterprise Manager ( OEM ) si nécessaire avec :

$> emctl start dbconsole

1) dans la console EM aller sur l’onglet Availability / Disponibilité , puis cliquer sur le lien ’schedule backup’

manage_backup1

Choisir l’option Shedule Oracle-suggested Backup (1er bouton) puis

laisser les choix des écrans suivants par défaut (backup sur disque dans la FLASH RECOVERY AREA,

disk

sauf celui de l’heure planifiée du backup …choisisez une heure :

time1

Cliquer sur Next, puis soumettre le JOB pour automatiser les sauveagrdes quotidiennes.
Pour info le script RMAN généré automatiquement est le suivant :

Daily Script:
run {
allocate channel oem_disk_backup device type disk;
recover copy of database with tag ‘ORA$OEM_LEVEL_0′;
backup incremental level 1 cumulative  copies=1 for recover of copy with tag ‘ORA$OEM_LEVEL_0′ database;
}

Si vous souhaitez vérifier votre JOB , vous pouvez clique sur le bouton ‘View Job’ :

view_backup_job1

Bon bah…c’est fini ;-(

remarque : il est possible également de faire des suavegardes immédiates ou planifiés toutes les x heures, en choisissant la deuxieme option dans l’ecran ‘ schedule backups ‘ à savoir : ‘ Schedule Customized Backups ‘.