All posts by Vincent

Oracle DBA OCP 10g, 9i, 8 Electronic music producer

VLDB Management

Rédacteur: Vincent Fenoll DBA Oracle à Montreal & Oracle Doc.

BIGFiles : Présentation

Un Tablespace Bigfile (BFT) contient un fichier unique ; taille max entre 8 et 128To.
Toutes les opérations que l’on pouvait effectuer sur les DF peuvent maintenant être effectuées sur les TS (ALTER tablespace ____  resize ___) ; c’est ce qu’on appelle la transparence avec les fichiers de données.

Les BFT simplifient donc la gestion de l’espace pour les grosses bases et permet une certaine.

Les BFT sont pris en charge pour tous les TS gérés localement et avec bitmaps.

Il faut éviter de créer des BFT sur un système ne prenant pas en charge le stripping.

La taille des extents est également définie avec AUTOALLOCATE ou avec UNIFORM.

La définition de leur taille est importante car de trop nombreux extents peuvent ralentir les opérations de type DDL

Pour créer un BFT dans EM cocher la case «Use Bigfile ».

Le type de TS par défaut, BIGFILE ou SMALLFILE est stocké de manière persistante dans le dict. Ces mots clé sont utilisés dans la clause datafile du CREATE TS.

CREATE DATABASE test

SET DEFAULT BIGFILE TABLESPACE

Datafile ‘________’ size 1G

SMALLFILE DEFAULT TEMPORARY TS temp

SMALLFILE UNDO TS undo datafile ‘__’;

ALTER DB SET DEFAULT BIGFILE TABLESPACE;

ALTER TABLESPACE users AUTOEXTEND ON;

Pour la migration d’un TS vers l’un ou l’autre, il faut utiliser soit Datapump ou « ALTER TABLE MOVE » ou « CREATE TABLE AS SELECT ».

Bigfiles; dictionnaire de données

Ajout de la colonne BIGFILE aux vues: DBA_TABLESPACES et V$TABLESPACE.

Ajout d’une ligne dans la vue database_properties ;

where property_name=’DEFAULT_TBS_TYPE’

Bigfiles; dbverify

Avec les BFT il est impossible de lancer en parallèle des instances de dbverify sauf en mentionnant explicitement les adresses de blocs de début et de fin.

Bigfiles; dbms_utility

Les fonctions DATA_BLOCK_ADDRESS_FILE et DATA_BLOCK_ADDRESS_BLOCK ne doivent pas être utilisées avec les BFT.

 

Ces fonctions renvoient le numéro de fichier et de block à partir d’une structure d’adresse du bloc de données.

Le numéro de fichier est toujours 1024 pour les BFT et l’adresse du bloc représente le numéro du bloc.

Bigfiles ; ROWID

Pour les BFT il n’est pas nécessaire d’inclure le numéro de fichier (FFF) dans les ROWID

SMALLFILE :             000000            FFF BBBBBB              RRR

BIGFILE :                   000000 LLL LLLLLLL             RRR

Avec,

000000 numéro d’objet

FFF numéro de fichier relatif

BBBBBBB numéro de bloc de données

RRR numéro de ligne

LLL numéro de bloc encodé

Pour les BFT, les numéros de blocs sont relatifs par rapport au tablespace et sont uniques dans un tablespace.

Il faut toujours utiliser DBMS_ROWID pour obtenir les composantes des ROW ID étendus

Groupes de TS temporaires

Regroupe plusieurs TS temporaires. Il est créé implicitement lorsque le premier TS lui est affecté et est supprimé lors de la suppression du dernier TS TEMP.

Il a le même espace de nom que les TS ; par conséquent il ne peut pas porter un nom identique à un TS.

Avantages :

–         Permet d’utiliser plusieurs TS TEMP dans plusieurs sessions

–         Permet aux processus esclaves d’un opération en parallèle d’utiliser plusieurs TS TEMP

–         Permet d’indiquer plusieurs TS TEMP par défaut au niveau base de données

Dans EM : « Temporary TS Groups ».

CREATE TEMPORARY TABLESPACE temp1 ________________

TABLESPACE GROUP group1 ;

CREATE TEMPORARY TABLESPACE temp1 ________________

TABLESPACE GROUP ‘’;

à affecté à aucun groupe, équivaut à la syntaxe historique.
ALTER TABLESPACE temp1 GROUP group2 ;

ALTER TABLESPACE temp1 GROUP ‘’;  (dissociation)

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE group2;

CREATE USER __________ TEMPORARY TABLESPACE group2;

Un TS temp ou un groupe de TS temp ne peut être supprimé que s’il ne fait plus partie de la liste des TS ou group par défaut.

Nouvelle vue : DBA_TABLESPACE_GROUPS

Partitions

EM prend en charge la création complète des tables partitionnées ainsi que leur maintenance.

Améliorations IOT partitionnées

Nouvelles options prises en charge :

–         Par liste de valeurs (avant juste par intervalle)

–         Maintenance des index globaux pour les IOT partitionnées ; quelque soit les opérations de maintenance effectuées sur les partitions les index restent USABLE

–         Index bitmap locaux partitionnés

–         Les colonnes LOB sont prises en charge dans tous les types de tables IOT partitionnées.

Améliorations index partitionnés locaux

Dans les versions antérieures les opérations de maintenance effectuées sur les partitions rendaient les index UNUSABLE (add, split, merge, move), en outre, les partitions d’index locales associées étaient placées dans le TS par défaut ou dans le même TS.

Avec 10g, nouvelle clause UPDATE INDEXES pour indiquer les attributs de stockage et pour les reconstruire automatiquement.

ALTER TABLE t1 MOVE PARTITION p3 TABLESPACE usr

UPDATE INDEXES (___________ TABLESPACE exemple)

Cette fonctionnalité augmente la disponibilité des données

Ignorer les index UNUSABLE

SKIP_UNUSABLE_INDEXES est maintenant dynamique, valeur par défaut est TRUE.

Par contre il faut surveiller DBA_IND_PARTITIONS et les nouvelles entrées de l’Alert.log.

Ce paramètre ne désactive pas les erreurs remontées pour les index uniques (sinon pb d’intégrité référentielle).

Index globaux partitionnés par hashage

C’est une nouveauté (avant juste par plage).

L’optimiseur procède à la sélection des partitions avec les prédicats « IN (__,__,__ » ou « d’égalité ».

Cette nouvelle méthode de partitionnement améliore les perf des index au cours d’insertion en parallèle de numéros de séquence qui se suivent ; permet de réduire la contention et le déséquilibre du b-tree à droite (dans ce cas de figure ce sont les mêmes feuilles d’index qui sont mises à jour en même temps) .

Les avantages sont expliqués en détail P13-37 (complexe).

Avec le hashage, la contention est répartie sur le nombre de partitions définies car les numéros de séquences sont répartis sur toutes les partitions

Les interrogations les performances sont égales avec les index non partitionnés sauf si on utilise le hint /*+ PARALLEL_INDEX(indx1) */

CREATE INDEX _____on t1(order_id)   GLOBAL

PARTITION BY HASH (order_id)  (

partition p1 tablespace t1

partition p2 tablespace t2);

ou

CREATE INDEX _____on t1(order_id)   GLOBAL

PARTITION BY HASH (order_id)  (

PARTITIONS 4

STORE IN (t1, t2);

Ajouter une partition :

ALTER INDEX indx1 ADD PARTITION p4 TABLESPACE t4 PARALLEL ;

Réduire le nombre de partitions :

ALTER INDEX indx1 COALESCE PARTITION PARALLEL ;

Opérations non prises en charge :

ALTER TABLE SPLIT INDEX PARTITION

ALTER TABLE MERGE INDEX PARTITIONS

ALTER INDEX REBUILD

ALTER INDEX MODIFY PARTITION

Index bitmaps: Améliorations

Ils offrent de meilleures performances et sont moins sujets à fragmentation lorsque de nombreuses opérations LMD impliquant une seule ligne sont effectuées.

Mais il faut respecter COMPATIBLE >=10.0.0.0.

Il est fortement conseillé de reconstruire les index bitmaps après une migration en 10g.

Journalisation des erreurs LMD

(avant) L’abandon et le rollback d’opérations LMD en masse dont l’exécution est longue représente une perte de temps.

Leur journalisation permet de poursuivre le traitement de ces opérations : les erreurs sont consignées dans une table de journalisation des erreurs (comme pour SQL*Loader).

Créer la table de journalisation des erreurs :

exec DBMS_ERRLOG.CREATE_ERROR_LOG(‘table_a_charger’, ‘errlog’)

INSERT INTO___ SELECT ___

LOG ERRORS INTO errlog (‘nom_opération’)  REJECT LIMIT 10;

Remarque: dans les opérations en parallèle, la limite de rejet est appliqué par processus esclave.

La table de journalisation des erreurs est constituée d’un nombre fixe de colonnes d’information, suivies d’un nombre variable de colonnes contenant les valeurs de données issues de la ligne en erreur.

La journalisation s’applique aux cas suivants:

–         valeurs trop grandes

–         contraintes (non différées)

–         erreurs générées par triggers

–         conversions de type

–         mapping de partitions

Ne sont pas prises en charges :

–         Les colonnes LOB, LONG, BFILE, ADT (Abstract Data Type)*

–         Contraintes différées

–         Manque d’espace

–         /*+ direct */

–         Violation de contraintes uniques

Backup/restore improvements

Rédacteur: V. Fenoll DBA Oracle Montreal & Oracle Doc.

Flashback area, une zone de récupération rapide

Il s’agit d’un emplacement centralisé pour les sauvegardes du fichier de contrôle, les fichiers d’archives, les journaux flashback et les sauvegardes de bases de données.

Lorsqu’elle est configurée, l’emplacement de cette zone est affecté à LOG_ARCHIVE_DEST_10.

Si aucun emplacement LOG_ARCHIVE_DEST_n n’est configuré ; l’emplacement par défaut devient alors la zone de récupération rapide.

Flashback area: Configuration

Dans EM : Onglet maintenance + Configure recovery settings

permet de définir l’emplacement DB_RECOVERY_FILE_DEST et la taille DB_RECOVERY_FILE_DEST_SIZE de cette zone.

Pour désactiver cette zone positionner à vide le paramètre de destination : DB_RECOVERY_FILE_DEST

Chaque fois que RMAN crée un fichier dans cette zone, il met également à jour la liste des fichiers obsolètes. Si manque d’espace, il supprime des fichiers obsolètes.

Avertissement d’espace à 85%

Alerte d’espace à 97%

Le message d’alerte peut également être trouvé dans la vue DBA_OUTSTANDING_ALERTS

Lorsque la zone de flashback est utilisée, RMAN utilise automatiquement OMF pour ses fichiers de sauvegarde et les place par défaut dans cette zone.

OMF également utilisé pour les archives ; ARCHIVE___FORMAT n’est pas utilisé.

Dans EM : Onglet maintenance + Backup Settings

Flashback area: Sauvegarde

Dans EM : Onglet maintenance + Schedule backup + All recovery Files on disk + Schedule customized backup.

Pour RMAN:

RMAN > BACKUP RECOVERY AREA

–         Archives

–         Autobackups (CF)

–         Datafiles copies

–         Backupsets

RMAN > BACKUP RECOVERY FILES

–         Idem commande ci-dessus

–         + des fichiers qui ne font pas partie de la zone de récupération

Flashback area: Vues dynamiques

V$RECOVERY_FILE_DEST

–         name : emplacement

–         size

–         used

–         space_reclaimable

–         number_of_files

–         space_limit

V$FLASH_RECOVERY_AREA_USAGE pour connaître l’utilisation de l’espace disque :

–         file_type

–         percent_space_used

–         percent_space_reclaimable

–         number_of_files

Dans V$BACKUP_PIECE et dans RC_BACKUP_PIECE nouvelles colonnes :

–         is_recovery_dest_file (yes | no)

–         bytes (taille en octets)

Oracle recommande d’utiliser OMF (DB_CREATE_FILE_DEST et DB_CREATE_ONLINE_LOG_DEST_n)

OMF + Flashback area : Modification du comportement des instructions SQL

ADD [STANDBY] LOGFILE : si aucun nom n’est spécifié ; crée le fichier dans la flashback area

DROP LOGFILE : supprime dans la flashback area

RENAME FILE : après renommage supprime le fichier dans la flashback area

Ordre de priorité pour la création du fichier de contrôle :

–         Si DB_CREATE_ONLINE_LOG_DEST_n  est défini, un CF de type OMF  est créé dans chaque répertoire

–         Sinon, si l’un ou (et) l’autre des 2 autres paramètres, DB_RECOVERY_FILE_DEST et DB_CREATE_FILE_DEST sont  définis, un CF de type OMF est créé à ces endroits

–         Si aucun de ces 3 paramètres n’est défini, le CF créé ne sera pas OMF

Il en est de même pour la création des online redologs ; ils sont créés jusqu’à la valeur MAXLOGMEMBERS.

Sauvegarde incrémentielle rapide

Effectue le suivi des blocs modifiés depuis la dernière sauvegarde incrémentale lorsque un flux redo est généré..

Background process : Change Tracking WRitter           CTWR

Par défaut il est désactivé.

ALTER DATABASE {ENABLE |DISABLE} BLOCK CHANGE TRACKING  [USING FILE ‘___’]

Si DB_CREATE_FILE_DEST est défini il n’est pas utile de nommer le fichier.

Pour le déplacer : ALTER DATABASE RENAME FILE ‘_______’  TO ‘_______’ ;

Monitoring block change tracking

SELECT filename, status, bytes from V$BLOCK_CHANGE_TRACKING.

Il est possible de calculer à partir de la vue V$BACKUP_DATAFILE le pourcentage de blocks lus dans les DF ; ce pourcentage est réduit lorsque la fréquence des backup incrémentaux est augmentée.s

Incrementally updated backups

RMAN peut maintenant restaurer des images copies en utilisant des backups incrémentaux de fichiers :

–         Les images copies sont mises à jour avec tous les changements jusqu’au SCN de la sauvegarde incrémentale

–         La durée de restauration est réduite

–         Il n’y a pas besoin de faire une image copie après une restauration incrémentale : RECOVER COPY OF DATAFILE 3

Oracle-Suggested Strategy

Dans EM : Maintenance + Backup/recovery + Schedule backup + Oracle-Suggested backup

Oracle effectue alors:

–         Une sauvegarde complete; full database copy

–         Une sauvegarde incrémentale par jour

Incremental roll forward of a database copy

En français: Ré implémentation incrémentielle des modifications d’une copie de base de données.

Incremental backups: RMAN backup command changes (R2)

Nouvelle commande pour effectuer une sauvegarde incrémentale à partir d’un SCN particulier:

RMAN> backup incremental FROM SCN 12323445 DATABASE;

Autres modifications des commandes RMAN

–         Image copies

RMAN> BACKUP AS COPY DATABASE

Avant il fallait utiliser plusieurs commandes COPY (simplifié en 10g)

–         Backup sets

RMAN> BACKUP AS BACKUPSET DATABASE    (défaut)

–         Default disk backup type

RMAN> CONFIGURE DEVICE TYPE DISK

BACKUP TYPE TO COPY

Définir comme comportement par défaut une copie de la base (l’utilisation de RMAN n’est pas obligatoire pour la restauration des fichiers vs backup sets)

Backup type enhancements by using EM

[to be continued]

Flash Back Any Error

Rédacteur: V. Fenoll DBA Oracle Montreal & Oracle Doc.

Navigation temporelle et sur 3 niveaux

Temporelle :

– Flashback query : interroger toutes les données à un point dans le temps.

– Flashback versions query : afficher toutes les versions des lignes entre 2 instants, ainsi que les transactions qui ont modifié la ligne.

– Flashback transaction query : afficher toutes les modifications apportées par une transaction

Récupération à tous les niveaux :

– DB :               Flashback database

– Table :           Flashback table et Flashback drop

– Ligne:             Flashback query (9i : restaurer des lignes)

Architecture

Utilise un nouveau type de fichier journal : les « journaux flashback » contiennent les images « avant » des blocs de données.

Nouveau processus : RVWR qui va puiser dans la nouvelle zone mémoire tampon flashback.

Lors d’une restauration :

–         application des journaux flashbacks

–         application des archives logs

Pour les bases volumineuses, il erst recommandé de positionner LOG_BUFFER = 8M pour garantir un flashback buffer de 16M.

Configurer Flashback Database

Dans EM, onglet maintenance + backup/recovery + recovery settings.

La base doit être en mode ARCHIVELOG et mount : activer la journalisation flashback.

Il est possible de faire un flashback DB à partir de EM.

SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2880;  (min)

SQL> ALTER DATABASE FLASHBACK ON | OFF;

Les 2880 minutes sont un objectifs  uniquement et n’offre aucune garantie.

SELECT flashback_on from v$database ;

( Yes|no)

Flashback Database : exemples

Base en état mount.

Il est possible d’utiliser RMAN ou SQL*Plus, mais attention, les commandes ne sont pas exactement les mêmes.

SQL> FLASHBACK DATABASE  to timestamp (sysdate-1/24) ;

SQL>                                                  to SCN 45678;

RMAN permet en plus la recuperation via SEQ:

RMAN> FLASHBACK DATABASE   to sequence=223 thread=1;

RMAN> FLASHBACK DATABASE   to scn=4153456;

RMAN> FLASHBACK DATABASE   to time = to_date (___);

Surveiller la base de données flashback

V$FLASHBACK_DATABASE_LOG

–         estimated_flashback_size : estimation

–         flashback_size : taille réèlle

–         oldest_flashback_scn, oldest_flashback_time: jusqu’à quand on peut remonter

V$FLASHBACK_DATABASE_STAT

Pour surveiller la surcharge liée à la journalisation ; 24h d’infos, chaque ligne représente un intervalle d’une heure.

Vue utile pour déterminer les changements de fréquence dans la génération des données flashback

Exclure un TS de flashback database

ALTER TABLESPACE test FLASHBACK OFF

Select flashback_on from v$tablespace ;

Avant de faire le flashback, il faudra mettre ce TS OFFLINE.

Flashback database : considérations

Après une opération de flashback, ouvrir la base en lecture seule pour vérifier l’heure ou le SCN, puis faire un resetlogs pour l’ouvrir en modification.

Flashback database ne peut pas être utilisé si :

–         Le fichier de contrôle a été restauré ou recréé

–         Un TS a été supprimé

–         Un DF a fait l’objet d’une récupération d’espace

Flashback drop

Annule une instruction DROP TABLE.

Paramètre RECYCLEBIN = ON

La table et les contraintes sont renommées.

La corbeille est une table qui gère les correspondances entre les  noms originaux et les noms générés par le système.

Depuis EM : Maintenance + backup/recovery + recovery + Table + Flashback dropped tables.

select USER | DBA_RECYCLEBIN original_name, type, droptime, space, …,

where can_undrop = ‘YES’;

SQL> show recyclebin

Restaurer des tables à partir de la corbeille

Restaure également les objets dépendants.

Si utilisation du nom d’origine, le système applique le principe LIFO pour déterminer la table à restaurer.

Il est également possible de modifier le nom d’origine.

FLASHBACK TABLE  matable TO BEFORE DROP  [RENAME TO table2];

Attention: Après restauration d’une table, les index et triggers gardent le nom unique (de la corbeille).

Corbeille : Stratégie de récupération de l’espace

Purge manuelle :

PURGE            TABLESPACE ts1

PURGE            [USER_ | DBA_] RECYCLEBIN

Purge automatique et allocation d’espace, dans ces ordre:

Espace libre ne correspondant pas à des objets de la corbeille

Objets de la corbeille dans l’ordre FIFO

Espace libre alloué par auto-extension

Contourner la corbeille

DROP TABLE t1 PURGE ;

DROP TS including contents ;

DROP user cascade ;

Les objets associés de la corbeille sont purgés automatiquement.

Interroger des tables supprimées

DBA_TABLES : DROPPED = YES

select name from dba_tables where dropped=’yes’

Lire les données de la table supprimée:

select * from “BIN$sfddfsc”;

SQL> desc dba_recyclebin

Name                                      Null?    Type

—————————————– ——– —————————-

OWNER                                     NOT NULL VARCHAR2(30)

OBJECT_NAME                               NOT NULL VARCHAR2(30)

ORIGINAL_NAME                                      VARCHAR2(32)

OPERATION                                          VARCHAR2(9)

TYPE                                               VARCHAR2(25)

TS_NAME                                            VARCHAR2(30)

CREATETIME                                         VARCHAR2(19)

DROPTIME                                           VARCHAR2(19)

DROPSCN                                            NUMBER

PARTITION_NAME                                     VARCHAR2(32)

CAN_UNDROP                                         VARCHAR2(3)

CAN_PURGE                                          VARCHAR2(3)

RELATED                                   NOT NULL NUMBER

BASE_OBJECT                               NOT NULL NUMBER

PURGE_OBJECT                              NOT NULL NUMBER

SPACE                                              NUMBER

Il est impossible d’effectuer des opérations LMD ou LDD sur des objets se trouvant dans la corbeille.

Flashback drop : Considérations

Tables protégées :

–         Autres que SYSTEM

–         TS locally managed

–         N’utilisent pas de stratégies FGA ou VPD

Dépendances non protégées :

–         Index de jointure Bitmap

–         Contraintes d’intégrité référentielles

–         Index supprimés avant les tables

Les tables purgées ne peuvent pas faire l’objet d’un flashback.

Flashback versions Query

Interroger la base de données à un instant donné ou à un SCN donné : utilisation de la clause VERSIONS.

Les lignes renvoyées représentent l’historique des changements.

Dans EM : Onglet maintenance + Perform Recovery + Tables

Flashback versions Query : Syntaxe

SELECT [pseudo_columns]

FROM  tables1

VERSIONS BETWEEN

{ SCN | TIMESTAMP  { MINVALUE  and MAXVALUE }

[AS OF {SCN | TIMESTAMP expr}]

WHERE [pseudo_columns]

Pseudo columns:

Limite inférieure de la plage de validité de la version

VERSIONS_STARTTIME

VERSIONS_STARTSCN

Limite supérieure de la plage de validité de la version

VERSIONS_ENDTIME

VERSIONS_ENDSCN

Identifiant de transaction ayant créé la version

VERSIONS_XID

Opération ayant généré la version

VERSIONS_OPERATION

Ex :

SELECT versions_XID, versions_startscn, versions_endscn,

versions_opérations,

First_name

FROM EMP

VERSIONS BETWEEN  SCN  MINVALUE  and MAXVALUE

AS OF SCN 45889621 (MAXVALUE, si pas de AS OF: sysdate)

WHERE  employee_id=5;

Operation         = Insert

= Delete

= Update

Flashback versions Query : Considérations

VERSIONS ne peut pas être utilisée pour interroger :

–         Tables externes

–         Tables temporaires

–         Vues V$

–         Vues

On ne peut pas obtenir les versions de lignes après la date d’une opération LDD (on a tout même les lignes avant l’opération LDD).

Les opérations de récupération d’espace sont filtrées (supprimées de la liste des versions car les données n’ont pas changées).

Flashback Transaction Query

Utilisation de la vue FLASHBACK_TRANSACTION_QUERY pour déterminer toutes les instructions SQL nécessaires pouvant être utilisées pour annuler les modifications apportées par une transaction spécifique ou au cours d’une période particulière.

Flashback Transaction Query offre un moyen plus rapide que LogMiner pour générer les SQL d’annulation car il utilise également un chemin d’accès indexé pour annuler les données.

select operation, undo_sql, table_name from FLASHBACK_TRANSACTION_QUERY

where XID = …           (numéro de transaction)

|

where start_timestamp >=  …   and commit_timestamp <= …   (intervalle de temps)

order by undo_change#;

Privilège: SELECT ANY TRANSACTION

Dans EM: Recovery wizard + Perform object level recovery + SCN

Utilisation conjointe de Flashback Versions et Transaction Query

SELECT versions_XID, First_name

FROM EMP

VERSIONS BETWEEN  SCN  MINVALUE  and MAXVALUE

AS OF SCN 45889621

WHERE  employee_id=5;

Puis

SELECT operation, undo_sql, table_name from FLASHBACK_TRANSACTION_QUERY

where XID = hextoraw(‘8C545623684A54’);

Flashback Transaction Query : Considérations

Les opérations LDD sont considérées comme des opérations de mises à jour du dictionnaire.

Les update de clé primaire sur IOT : considérées comme Delete + Insert

Les objets supprimés apparaissent comme des numéros d’objets

Les utilisateurs supprimés apparaissent comme des identificateurs d’utilisateurs.

Il peut être nécessaire d’ajouter des « supplemental logs » (ALTER DATABASE ADD SUPPLEMENTAL LOG DATA) en particulier pour prendre en charge les lignes chainées ou les tables en cluster.

Flashback table

Récupération de tables jusqu’à un point dans le temps.

C’est une instruction atomique ; toutes les tables sont récupérées ou aucune.

EM : Maintenance + Perform recovery + Object type = Table + Operation type = Flashback existing table.

Il est nécessaire d’avoir “ENABLE ROW MOVEMENT” car Flashback table utilise des opérations LMD et ne préserve pas les ID de ligne.

FLASHBACK TABLE emp TO TIMESTAMP (sysdate-1);

FLASHBACK TABLE emp, dept TO SCN 54454 ENABLE TRIGGERS;

Il n’y a pas de rollback possible sur les opérations de flashback. Pour revenir en arrière il faut donc faire un nouveau Flashback en utilisant le SCN de la base d’origine (colonne CURRENT_SCN de V$DATABASE).

Flashback table : considérations

Transaction unique.

Des verrous externes LMD sont acquis.

Les stats ne sont pas soumises au flashback.

Les index actuels et les objets dépendants sont conservés.

L’opération est écrite dans l’alerte.

L’intégrité des données est conservée.

Ne fonctionne pas sur les tables externes.

Quick tune

This script shows the different memory pools of the SGA and some indicative ratios for the Oracle DBA

-- ################################################
-- # Creator: Ph de Saint Aignan
-- # Created: 2002/06/02
-- # Name: quicktune.sql
--  ################################################
-- #
-- # Compatible: Oracle 7 8i 9i 10g 11g
-- #
-- ################################################

set echo off linesize 200 pagesize 100 wrap off timing off doc off

COL "MEMORY TYPE" 		FOR A16 
--HEAD "SGA + RATIOS"
--COL "Total_Mem(Ko)" 	FOR A12 
--COL "Free(Ko)"	        FOR A8
COL "|||"		FOR A3
COL "MEMORY RATIOS"	FOR A28
COL "RATIO %"		FOR A7
COL IDEAL 		FOR A8 ;
compute sum of "Total_Mem K" on report
compute sum of "Free K" on report
break on report ;

select pool "MEMORY TYPE", Total_Mem "ALLOCATION K",  Free_Mem "FREE K", '|||' "|||", 
RUBRIQUE "MEMORY RATIOS", to_char(round(RATIO*100,1),'999.9') "RATIO %", IDEAL
from 
------------------First  subset Construction :
(select rownum0,A.pool, A.Total_Mem  , B.Free_Mem  
from
(select (rownum ) rownum0, A.* from (
   select pool, round(sum(bytes)/1024,0) Total_Mem from v$sgastat
   where pool is not null group by pool 
   UNION 
   select name, round(bytes/1024)  from v$sgastat where pool is null and name !='fixed_sga') A
UNION ALL
select 6,'Sort Area Size' ,round(value/1024,0)  from v$parameter 
where  name in ('sort_area_size') 
UNION ALL
select 7,'Hash Area Size' ,round(value/1024,0)  from v$parameter 
where  name in ('hash_area_size') ) 
 A ,
(select pool, round(bytes/1024,0) Free_Mem from v$sgastat 
        where name = 'free memory'
        UNION ALL
 select 'db_block_buffers',
           (select count(*)   from v$bh  where status='free')* 
           (select (round(value/1024,0))  from v$parameter where name = 'db_block_size')
           from dual )
          B
where A.pool=B.pool(+)  ) SGA ,
------------------2nd  subset Construction :
(select 6 rownum0, 'DATA DICTIONARY CACHE' "RUBRIQUE", 
	sum(getmisses)/sum(gets) "RATIO", ' < 15 %' "IDEAL"
from v$rowcache
UNION ALL
select 3,'SHARED POOL HIT RATIO',sum(pinhits-reloads)/sum(pins),' > 85 %'
from v$librarycache
UNION ALL
select 4 ,'SHARED POOL RELOAD %',sum (reloads)/sum(pins), ' <  2 %'
from v$librarycache
UNION ALL
select 2,'BUFFER CACHE Hit Ratio',
     (1-(sum (decode (name, 'physical reads',value,0))/
    (sum(decode(name,'db block gets',value,0)) +
    (sum(decode(name,'consistent gets',value,0)))))
    ),  ' > 95 %'
from v$sysstat 
UNION ALL
select 1,'BUFFER CACHE MISS RATIO',
((G-F)/(G-F+C+E)),' < 15 %'
from
(select sum(value) C  from v$sysstat where name like '%- consistent read gets') c,
--http://www.ixora.com.au/tips/tuning/cache_miss.htm : Steve Adams
(select value E from v$sysstat where name = 'db block gets') e,
(select value F from v$sysstat where name = 'physical reads direct') f,
(select value G from v$sysstat where name = 'physical reads') g
UNION ALL
select 5, 'LOG BUFFER REQUESTS Ratio', -- '#Redo Space requests/#redo entries'
((req.value * 50)/entries.value), 
' < 0.02%' 
from v$sysstat req, v$sysstat entries
where req.name='redo log space requests' and entries.name ='redo entries'
UNION ALL
select 7,'MEM SORTS/TOTAL SORTS',
mem.value/(mem.value+disk.value),' > 95 %'
from v$sysstat mem, v$sysstat disk
 where mem.name = 'sorts (memory)'
 and disk.name = 'sorts (disk)' 
)  RATIOS
where SGA.rownum0(+) = RATIOS.ROWNUM0
order by SGA.rownum0 asc;

--@defaultenv

Rebuild index

Author: Vincent Fenoll, DBA Oracle Montreal

-- ################################################
-- # Created: 2005/01/01
-- # Name: rebuild_indx.sql
-- ################################################
-- #
-- # Compatible: 7 8i 9i 10g 11g
-- #
-- ################################################

spool rebuild_indx.log

drop table v_perso;
create table v_perso (text varchar2(500), index_name varchar2(100));

prompt
ACCEPT spoolfile CHAR prompt 'Fichier de spool : ';
ACCEPT schema CHAR prompt 'Schema (% autorisé) : ';
prompt
prompt
prompt Il faut reconstruire un index quand :
prompt   - le nombre d entrees detruites represente 20% ou plus des entrees courantes
prompt   - la profondeur de l index est superieure a 3
prompt Les candidats possibles pour des index bitmaps :
prompt   - lorsque les donnees sont distinctes a plus de 99%
prompt
spool &spoolfile

set serveroutput on
set verify off
declare
 c_name        INTEGER;
 ignore        INTEGER;
 height        index_stats.height%TYPE := 0;
 lf_rows       index_stats.lf_rows%TYPE := 0;
 del_lf_rows   index_stats.del_lf_rows%TYPE := 0;
 distinct_keys index_stats.distinct_keys%TYPE := 0;
 cursor c_indx is
  select owner, table_name, index_name
  from dba_indexes
  where owner like upper('&schema')
    and owner not in ('SYS','SYSTEM');
begin
 dbms_output.enable (1000000);
 dbms_output.put_line ('Owner           Index Name                              % Deleted Entries Blevel Distinctiveness');
 dbms_output.put_line ('--------------- --------------------------------------- ----------------- ------ ---------------');

 c_name := DBMS_SQL.OPEN_CURSOR;
 for r_indx in c_indx loop
  DBMS_SQL.PARSE(c_name,'analyze index ' || r_indx.owner || '.' ||
                 r_indx.index_name || ' validate structure',DBMS_SQL.NATIVE);
  ignore := DBMS_SQL.EXECUTE(c_name);

  select HEIGHT, decode (LF_ROWS,0,1,LF_ROWS), DEL_LF_ROWS,
         decode (DISTINCT_KEYS,0,1,DISTINCT_KEYS)
         into height, lf_rows, del_lf_rows, distinct_keys
  from index_stats;
--
-- Index is considered as candidate for rebuild :
--   - when deleted entries represent 20% or more of the current entries
--   - when the index depth is more then 2 levels.(height starts counting from 1 so > 5)
-- Index is (possible) candidate for a bitmap index when :
--   - distinctiveness is more than 99%
--
-- VFL ajout de and (del_lf_rows/lf_rows) <> 1) pour enlever les indexes vides
  if ( height > 2 ) OR ( (del_lf_rows/lf_rows) > 0.2 and (del_lf_rows/lf_rows) <> 1) then
    dbms_output.put_line (rpad(r_indx.owner,16,' ') || rpad(r_indx.index_name,40,' ') ||
                          lpad(round((del_lf_rows/lf_rows)*100,3),17,' ') ||
                          lpad(height-1,7,' ') || lpad(round((lf_rows-distinct_keys)*100/lf_rows,3),16,' '));
    -- VFL
    insert into v_perso values ('ALTER INDEX '|| r_indx.owner || '.' || r_indx.index_name || ' REBUILD;', r_indx.index_name );
  end if;

 end loop;
 DBMS_SQL.CLOSE_CURSOR(c_name);
end;
/

select text from v_perso;
-- drop table v_perso;
spool off
set verify on