Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUM ORACLE F.A.Q ORACLE TUTORIELS ORACLE TUTORIELS SQL SCRIPTS SQL LIVRES ORACLE QUIZ

Installer Oracle 11G sous Linux et créer une base de données

Date de publication : 30/08/2007 , Date de mise à jour : 30/08/2007

Par Jaouad Zouaghi (Accueil)
 

Installer la derniére version du RDBMS d'Oracle: Oracle 11G et créer une base de données sur une plateforme Linux 32 Bits Fedora 7.

I. Introduction
II. Pré-requis
III. Installation
IV. Erreur Linux
V. Créer une base de données
VI. Quelques nouveautés
VII. Remerciements


I. Introduction

Oracle vient d'annoncer la toute dernière version de son RDBMS, Oracle 11G. Cette version est attendue notamment pour corriger quelques Bugs
de la dernière version mais également, comme toute nouvelle version, voir les nouveautés présentées par Oracle.


II. Pré-requis

Vérifier la mémoire (1Go nécessaire)
[oracle@dsiege103829 oracle]$ grep MemTotal /proc/meminfo
MemTotal:      1024364 kB


Déterminer la taille du Swap
grep SwapTotal /proc/meminfo
[oracle@dsiege103829 oracle]$ grep SwapTotal /proc/meminfo
SwapTotal:     1048568 kB


Déterminer la mémoire partagé
[oracle@dsiege103829 oracle]$ df -k /dev/shm/
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                   512180         0    512180   0% /dev/shm


Déterminer l'espace disponible du TMP ( il faut environ 150Mo à 200Mo)
[oracle@dsiege103829 oracle]$ df -m /tmp
Filesystem           1M-blocks      Used Available Use% Mounted on
/dev/mapper/VGsys-tmpLV
                           992        36       906   4% /tmp


Vérifier les packages d'installer

rpm -qa | grep package_name


Liste des packages nécessaires
compat-libstdc++-33.2.3-47.3
elfutils-libelf-0.97-5
elfutils-libelf-devel-0.97-5
glibc-2.3.9.4-2.19
glibc-common-2.3.9.4-2.19
glibc-devel-2.3.9.4-2.19
gcc-3.4.5-2
gcc-c++-3.4.5-2
libaio-devel-0.3.105-2
libaio-0.3.105-2
libgcc-3.4.5
libstdc++-3.4.5-2
libstdc++-devel-3.4.5-2
make-3.80-5
sysstat-5.0.5
unixODBC-2.2.11
unixODBC-devel-2.2.11




III. Installation


Dé zipper les fichiers et lancer l'installation:
[oracle@dsiege103829 database]$ unzip linux_11gR1_database.zip 
(..)
[oracle@dsiege103829 database]$cd database
[oracle@dsiege103829 database]$ export DISPLAY=dsiege104855
[oracle@dsiege103829 database]$ ./runInstaller
Starting Oracle Universal Installer...

Checking Temp space: must be greater than 80 MB.   Actual 1392 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 1023 MB    Passed
Checking monitor: must be configured to display at least 256 colors.    Actual 16777216    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2007-08-14_02-14-05PM. Please wait ..


Ecran de lancement :
Nous allons renseigner l'ORACLE_HOME, l'ORACLE_BASE (qui servira pour la variable diagnostic_dest) le type d'installation et le groupe de l'utilisateur qui va installer le moteur.
On remarquera au passage qu'Oracle laisse tomber la couleur rouge dominante dans ces écrans pour un bleu plus discret



écran de lancement
Premier écran de lancement :
premier écran de lancement
Problème de création Orainventory

Il est possible de rencontrer une erreur de création de l'OraInventory:


Erreur OraInventory


En appuyant sur Ok on peut spécifier un autre emplacement pour l'OraInventory


Emplecement OraInventory

Vérification des pré-requis Systéme:


Vérification des pré requis systémes

Aujourd'hui la 11G n'est disponible que pour Linux, cela n'incluant que certaines versions, malheureusement la version sur laquelle
Nous effectuons l'installation n'est pas certifiée. Cependant il est possible d'effectuer une installation sur toutes les versions de Linux x86.

Voici les versions certifiés pour l'instant :

Les versions supportés par Oracle
  1. enterprise-4
  2. enterprise-5
  3. redhat-4
  4. redhat-5
  5. SuSE-10
  6. asianux-2
  7. asianux-3



Il est possible de visualiser la matrice de certification avant de commencer l'installation:


Il est donc logique que la vérification échoue :

Echec des vérifications

Summary:

Summary

Installation:


Premier écran d'installation

Link des sources :

Link des binaires

Setting-Up :


Setting-up

Script à lancer sous le User Root :

Scripts Root
Exécution du premier script :

Ici nous allons définir les droits sur l'installation

[oracle@dsiege103829 database]$ [root@dsiege103829 product]# ./orainstRoot.sh
Changing permissions of /opt/oracle/product/ to 770.
Changing groupname of /opt/oracle/product/ to dba.
The execution of the script is complete


Exécution du second script :

Ce script sert à définir les variables d'environnement et le fichier /etc/oratab
[root@dsiege103829 111]# ./root.sh
Running Oracle 11g root.sh script...

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /opt/oracle/product/111

Enter the full pathname of the local bin directory: [/usr/local/bin]:
   Copying dbhome to /usr/local/bin ...
   Copying oraenv to /usr/local/bin ...
   Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specific root actions.




Fin de l'installation :


Fin de l'installation
Vérification des produits installés :
Produits installés

IV. Erreur Linux



Il peut vous demander lors de la première connexion la librairie suivante :
$ORACLE_HOME/lib/stubs/libaio.so.1
Sur un système SELinux (Security Enhanced Linux) il faut ouvrir certaines permissions :

module oracle 1.0.0;
require {
        type unconfined_t;
        type file_t;
        class file { read getattr execmod };
}<br/>
<br/>
#============= unconfined_t ==============
allow unconfined_t file_t:file {read getattr execmod };
2. Compiler, packager et installer ce module


 checkmodule -M -m -o oracle.mod oracle.te
semodule_package -o oracle.pp -m oracle.mod
semodule -i oracle.pp

V. Créer une base de données

Création du FS pour accueuillir la base de données :


 [root@dsiege103829 product]# vgs
  VG    #PV #LV #SN Attr   VSize   VFree
  VGsys   1   8   0 wz--n- 113.38G 86.88G
 [root@dsiege103829 product]# lvcreate -L 40G -n oradataLV VGsys
  Logical volume "oradataLV" created
[root@dsiege103829 product]# vgs
  VG    #PV #LV #SN Attr   VSize   VFree
  VGsys   1   9   0 wz--n- 113.38G 46.88G
 [root@dsiege103829 product]# pvs
  PV         VG    Fmt  Attr PSize   PFree
  /dev/hda2  VGsys lvm2 a-   113.38G 46.88G
[root@dsiege103829 product]# mkfs -t ext3 /dev/VGsys/oradataLV
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
5242880 inodes, 10485760 blocks
524288 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
320 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@dsiege103829 product]# mkdir -p /oracle/data/
[root@dsiege103829 product]# vi /etc/fstab
[root@dsiege103829 product]# mount /oracle/data
[root@dsiege103829 product]# chown -R oracle:dba /oracle/data

[root@dsiege103829 product]# df -h /oracle/data
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VGsys-oradataLV
                       40G  177M   38G   1% /oracle/data
[root@dsiege103829 product]#


Création de l'instance :


SQL> startup nomount pfile=/oracle/admin/orcl/initorcl.ora
ORA-32006: BACKGROUND_DUMP_DEST initialization parameter has been deprecated
ORA-32006: USER_DUMP_DEST initialization parameter has been deprecated
ORACLE instance started.


Comme nous pouvons le remarquer, Oracle dans sa nouvelle version de base de données, s'est basé sur la gestion de l'arborescence
de la Flash RECOVERY AREA pour supprimer les répertoires d'administration et laisser à Oracle le soin d'organiser cette structure.
Cela se fait automatiquement. En effet, la variable chargée de déterminer le répertoire racine de cette installation est fixée par
DIAGNOSTIC_DEST qui prend par défaut la valeur de l'ORACLE_BASE.

En règle générale elle est initialisée à $ORACLE_BASE/diag/rdbms/DATABASE_NAME/$ORACLE_SID/trace

SQL> show parameter diagnostic

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest string /opt/oracle/product
info Cependant ce paramètre peut être modifié soit en le renseignant lors de la création de l'instance via le pfile soit après la création de cette instance de manière dynamique :

SQL> alter system set diagnostic_dest='/oracle/admin/orcl' scope=both ;

System altered.

SQL> show parameter diag

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest                      string      /oracle/admin/orcl
Il va créer l'arborescence dans le répertoire spécifié :

[oracle@dsiege103829 orcl]$ pwd
/oracle/admin/orcl
[oracle@dsiege103829 orcl]$ ll
total 16
-rw-r--r-- 1 oracle oradba 1354 Aug 14 10:27 initorcl.ora
drwxr-sr-x 3 oracle dba    4096 Aug 14 11:12 diag
Création de la base de données :
	create database orcl	
		user sys identified by *****
		user system identified by *****
		controlfile reuse
		maxdatafiles 32
		maxinstances 1
		character set WE8ISO8859p15
		national character set al16utf16
		logfile
			group 1 '/oracle/redo/orcl/log1.log' size 50M,
			group 2 '/oracle/redo/orcl/log2.log' size 50M,
			group 3 '/oracle/redo/orcl/log3.log' size 50M
		maxlogfiles 8
		maxlogmembers 2
		noarchivelog
		extent management local
		datafile '/oracle/data/orcl/system_01.dbf' size 1 G reuse autoextend on maxsize 2 G
		sysaux datafile '/oracle/data/orcl/sysaux_01.dbf' size 256 M reuse autoextend on maxsize 512 M
		default tablespace USERS
			datafile '/oracle/data/orcl/users_01.dbf'
			size 256 M reuse autoextend on maxsize 1 G
			extent management local autoallocate
		default temporary tablespace TEMP
			tempfile '/oracle/data/orcl/temp_01.dbf'
			size 256 M reuse autoextend on maxsize 1 G
		undo tablespace UNDOTBS
			datafile '/oracle/data/orcl/undotbs_01.dbf'
			size 256 M reuse autoextend on maxsize 1 G ;
Lors de la création de la base si nous observons le fichier de trace de la base, nous nous apercevons qu'Oracle exécute certains scripts :
processing ?/rdbms/admin/dfmap.bsq
processing ?/rdbms/admin/denv.bsq
processing ?/rdbms/admin/drac.bsq
processing ?/rdbms/admin/dsec.bsq
processing ?/rdbms/admin/doptim.bsq
processing ?/rdbms/admin/dobj.bsq
processing ?/rdbms/admin/djava.bsq
processing ?/rdbms/admin/dpart.bsq
processing ?/rdbms/admin/drep.bsq
processing ?/rdbms/admin/daw.bsq
processing ?/rdbms/admin/dsummgt.bsq
processing ?/rdbms/admin/dtools.bsq
processing ?/rdbms/admin/dexttab.bsq
processing ?/rdbms/admin/ddm.bsq
processing ?/rdbms/admin/dlmnr.bsq
Les packages crées lors du lancement des scripts :

  • @?/rdbms/admin/catalog
  • @?/rdbms/admin/catproc
  • @?/rdbms/admin/catblock
  • @?/rdbms/admin/utlxplan
  • @?/sqlplus/admin/pupbld
  • @?/xdk/admin/initxml
  • @?/xdk/admin/xmlja
  • @?/javavm/install/initjvm
  • @?/rdbms/admin/catjava
  • @?/rdbms/admin/catoctk
Certaines procédures sont wrappées :

Procédures Wrappés
Vérification de l'état de la base de données :
SQL> set linesize 250
SQL> col comp_name format a40
SQL> r
  1* select comp_name , version, status from dba_registry

COMP_NAME                                VERSION                        STATUS
---------------------------------------- ------------------------------ -----------
Oracle Database Catalog Views            11.1.0.6.0                     VALID
Oracle Database Packages and Types       11.1.0.6.0                     VALID
Oracle XDK                               11.1.0.6.0                     VALID
JServer JAVA Virtual Machine             11.1.0.6.0                     VALID

4 rows selected.
Création du Spfile :
SQL> create spfile from pfile='/oracle/admin/orcl/initorcl.ora'
  2  ;

File created.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  368263168 bytes
Fixed Size                  1299988 bytes
Variable Size             318769644 bytes
Database Buffers           29360128 bytes
Redo Buffers               18833408 bytes
Database mounted.
Database opened.
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /opt/oracle/product/111/dbs/sp
                                                 fileorcl.ora


Ajout du fichier de password:

[oracle@dsiege103829 111]$ orapwd file=orcl.pwd password=dillon01
[oracle@dsiege103829 111]$ ls -ltr orcl.pwd
-rw-r----- 1 oracle dba 1536 2007-08-22 14:48 orcl.pwd

[oracle@dsiege103829 111]$ orapwd
Usage: orapwd file=<fname> password=<password> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>

  where
    file - name of password file (required),
    password - password for SYS (optional),
    entries - maximum number of distinct DBA (required),
    force - whether to overwrite existing file (optional),
    ignorecase - passwords are case-insensitive (optional),
    nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only).

  There must be no spaces around the equal-to (=) character.


Nous remarquerons deux nouvelles options : ignorecase pour ne plus avoir un mot de passe Case sensitive et l'option nosysdba nouvelles fonctionnalités issu du DataBase Vault.


Création et démarrage du listener :
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dsiege103829)(PORT = 1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = orcl)
    )
)
Démarrage du LISTENER:
[oracle@dsiege103829 admin]$ lsnrctl start

LSNRCTL for Linux: Version 11.1.0.6.0 - Production on 14-AUG-2007 11:19:32

Copyright (c) 1991, 2007, Oracle.  All rights reserved.

Starting /opt/oracle/product/111/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.1.0.6.0 - Production
System parameter file is /opt/oracle/product/111/network/admin/listener.ora
Log messages written to /opt/oracle/product/diag/tnslsnr/dsiege103829/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dsiege103829.brinks.fr)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dsiege103829)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.1.0.6.0 - Production
Start Date                14-AUG-2007 11:19:33
Uptime                    0 days 0 hr. 0 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/111/network/admin/listener.ora
Listener Log File         /opt/oracle/product/diag/tnslsnr/dsiege103829/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dsiege103829.brinks.fr)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
 [oracle@dsiege103829 admin]$ ps -eaf | grep tns
oracle   16919     1  0 11:19 ?        00:00:00 /opt/oracle/product/111/bin/tnslsnr LISTENER -inherit
oracle   16927 16106  0 11:19 pts/3    00:00:00 grep tns
[oracle@dsiege103829 admin]$
info On s'aperçoit que le fichier Log, en XML se sert également de l'ORACLE_BASE

Les background processes :

Oracle a intrdoduit de nouveaux backgrounds process avec cette version de la 11 G :

oracle   16756     1  0 11:07 ?        00:00:00 ora_pmon_orcl
oracle   16758     1  0 11:07 ?        00:00:00 ora_vktm_orcl
oracle   16762     1  0 11:07 ?        00:00:00 ora_diag_orcl
oracle   16764     1  0 11:07 ?        00:00:00 ora_dbrm_orcl
oracle   16766     1  0 11:07 ?        00:00:00 ora_psp0_orcl
oracle   16770     1  0 11:07 ?        00:00:00 ora_dia0_orcl
oracle   16772     1  0 11:07 ?        00:00:00 ora_mman_orcl
oracle   16774     1  0 11:07 ?        00:00:00 ora_dbw0_orcl
oracle   16776     1  0 11:07 ?        00:00:00 ora_dbw1_orcl
oracle   16778     1  0 11:07 ?        00:00:00 ora_dbw2_orcl
oracle   16780     1  0 11:07 ?        00:00:00 ora_dbw3_orcl
oracle   16782     1  0 11:07 ?        00:00:00 ora_lgwr_orcl
oracle   16784     1  0 11:07 ?        00:00:00 ora_ckpt_orcl
oracle   16786     1  0 11:07 ?        00:00:00 ora_smon_orcl
oracle   16788     1  0 11:07 ?        00:00:00 ora_reco_orcl
oracle   16790     1  0 11:07 ?        00:00:00 ora_mmon_orcl
oracle   16792     1  0 11:07 ?        00:00:00 ora_mmnl_orcl
oracle   16794     1  0 11:08 ?        00:00:00 ora_p000_orcl
oracle   16796     1  0 11:08 ?        00:00:00 ora_p001_orcl
oracle   16798     1  0 11:08 ?        00:00:00 ora_p002_orcl
oracle   16800     1  0 11:08 ?        00:00:00 ora_p003_orcl
oracle   16808     1  0 11:08 ?        00:00:00 ora_fbda_orcl
oracle   16810     1  0 11:08 ?        00:00:00 ora_smco_orcl
oracle   16812     1  0 11:08 ?        00:00:00 ora_qmnc_orcl
oracle   16820     1  0 11:08 ?        00:00:00 ora_w000_orcl
oracle   16834     1  0 11:08 ?        00:00:00 ora_q000_orcl
oracle   16836     1  0 11:08 ?        00:00:00 ora_q001_orcl
La définition des processus dans la 11G est très bien détaillée dans la documentation Oracle :

DIA0	- Hang and dead lock resolution

DIAG	- Diagnostic dumps

DBRM	- Resource manager process

EMNC	- event monitor co-ordinator

VKTM	- Virtual time keeper

FBDA	- Flashback archive

GMON	- Disk membership in ASM

ACMS	- for RAC

KATE	- I/O to an ASM when disk offline

GTX0j	- Xa Global transaction in a RAC

PSP0	- Spawn a process

RMSn	- RAC management process

RMSN	- manage slave process in RAC

SMC0/
Wnnn	- Space management coordination process

VI. Quelques nouveautés



Mot de passe Case - sensitive :
SQL> create user dvp identified by DVP ; 

Utilisateur créé.

SQL> grant dba to dvp ; 

Autorisation de privilèges (GRANT) acceptée.

SQL> conn dvp/dvp@orcl
ERROR:
ORA-01017: invalid username/password; logon denied


Attention : vous n'êtes plus connecté à ORACLE.
SQL> conn dvp/DVP@orcl
Connecté.


Mettre un wait time aux ordres DDL :

Auparavant lors d'une requête DDL, Oracle renvoyait une erreur s'il n'était pas possible d'avoir le lock en mode exclusif.
Maintenant nous pouvons mettre en place un Temps d'attente avant que l'erreur ne soit renvoyée laissant ainsi le temps à la session détenant le verrou de le libérer.

Création de la table :

SQL> create table dvp ( username varchar2(10)) ; 

Table créée.

SQL> insert into dvp values ('jaouad') ; 

1 ligne créée.

SQL>  insert into dvp values ('orafrance'); 

1 ligne créée.

SQL>  insert into dvp values ('Bouyao'); 

1 ligne créée.

SQL>  insert into dvp values ('Sheik'); 

1 ligne créée.

SQL>  insert into dvp values ('Magnus'); 

1 ligne créée.

SQL>  insert into dvp values ('Lalystar'); 

1 ligne créée.

SQL> commit ;

Validation effectuée.

SQL> select * from dvp ; 

USERNAME
----------
jaouad
orafrance
Bouyao
Sheik
Magnus
Lalystar

6 ligne(s) sélectionnée(s).

SQL> update dvp set username ='tat' ; 

6 ligne(s) mise(s) à jour.


Nous ouvrons une autre session :

SQL> alter table dvp  add (phone number ); 
alter table dvp  add (phone number )
            *
ERREUR à la ligne 1 :
ORA-00054: ressource occupée et acquisition avec NOWAIT ou temporisation
indiqué


SQL> alter session set ddl_lock_timeout = 10;

Session modifiée.

SQL>  alter table dvp  add (phone number );

Le temps d'attente est de 10 secondes.
Après avoir effectué un Commit dans l'autre session nous nous apercevons que les deux modifications ont bien été reportées.

SQL>  alter table dvp  add (phone number ); 

Table modifiée.

SQL> select * from dvp ; 

USERNAME        PHONE
---------- ----------
tat
tat
tat
tat
tat
tat

6 ligne(s) sélectionnée(s).


Colonnes virtuelles

SQL> create table dvp 
  2   (  username varchar2(10),
  3     phone number ,  
  4     salary varchar2(6)
  5  generated always as  ( 
  6   case  
  7   when username  ='jaouad' then '1'  
  8   when username  = 'sheik' then '2'
  9   when username ='orafrance' then '3'
 10   when username ='bouyao' then '4'
 11   else '4'  
 12   end ) 
 13   virtual  );

Table créée.

SQL> desc dvp  ;
 Nom                                       NULL ?   Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                                           VARCHAR2(10)
 PHONE                                              NUMBER
 SALARY                                             VARCHAR2(6)

SQL> select data_default from user_tab_columns where column_name ='SALARY' ;

DATA_DEFAULT
--------------------------------------------------------------------------------
CASE "USERNAME" WHEN 'jaouad' THEN '1' WHEN 'sheik' THEN '2' WHEN 'orafrance' TH

SQL> insert into dvp (username) values ('jaouad'); 

1 ligne créée.


SQL> insert into dvp (username) values ('orafrance') ;

1 ligne créée.

SQL> insert into dvp (username) values ('JAOUAD'); 

1 ligne créée.

SQL> select * from dvp; 

USERNAME        PHONE S
---------- ---------- -
jaouad                1
orafrance             3
JAOUAD                4

SQL>


Ces colonnes ont une valeur par défaut en fonction de certains paramètres, Cela peut par exemple remplacer la gestion des curseurs. Attention comme nous pouvons le voir elles sont Case-Sensitive.


Comme nous pouvons le voir il est possible de créer des index (de type fonction),
mais il sera impossible d'insérer dans ces colonnes afin de garantir l'intégrité des données.

SQL> create index i_dvp on dvp (salary) ; 

Index créé.

SQL> 
SQL> select index_type 
  2  from user_indexes  
  3  where index_name = 'I_DVP';

INDEX_TYPE
---------------------------
FUNCTION-BASED NORMAL

SQL> insert into dvp (username, salary ) values ('Marc', 0) ; 
insert into dvp (username, salary ) values ('Marc', 0)
            *
ERREUR à la ligne 1 :
ORA-54013: Opération INSERT interdite sur les colonnes virtuelles


Les Indexs Invisibles :

La bonne gestion des indexes est une question sous Oracle.
En effet un index permet de gagner beaucoup de temps lors de la consultation, mais ne dégrade t'il pas les mises à jour,
suppressions ou insertions. Avec la 11G ne vous posez plus ces questions.
Il est possible de mettre en place des indexes de types invisibles pour les requêtes n'ont pas l'utilité de l'index.

Création de l'index:

Nous allons voir qu'en fonction de sa visibilité, un index est utilisé ou pas.

SQL> create index i_dvp on dvp (username ); 

Index créé.

SQL> -- insertion 
SQL> declare 
  2  i number ; 
  3  begin 
  4  for i in 0..1000
  5  loop 
  6  insert into dvp (username) values ('developpez') ; 
  7  end loop; 
  8  commit ;
  9  end ; 
 10  /

Procédure PL/SQL terminée avec succès.

SQL> select count (*) from dvp; 

  COUNT(*)
----------
      1004

SQL> explain plan for select * from dvp where username ='jaouad' ;

Explicité.

SQL> set linesize 250
SQL> r
  1* select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial'))

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 709340066

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |     1 |    25 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| DVP   |     1 |    25 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_DVP |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access("USERNAME"='jaouad')

Note
-----
   - dynamic sampling used for this statement

18 ligne(s) sélectionnée(s).

SQL> alter index i_dvp invisible ; 

Index modifié.

SQL> explain plan for select * from dvp where username ='jaouad' ;

Explicité.

SQL> select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial')) ;

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2450334311

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    25 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DVP  |     1 |    25 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------

   1 - filter("USERNAME"='jaouad')

Note
-----
   - dynamic sampling used for this statement

17 ligne(s) sélectionnée(s).

SQL> select index_name , table_name , visibility from user_indexes ;

INDEX_NAME                     TABLE_NAME                     VISIBILIT
------------------------------ ------------------------------ ---------
I_DVP                          DVP                            INVISIBLE


Cette visibilité est paramétrable au niveau session également grâce au paramètre optimizer_use_invisible_indexes : ce qui va nous permettre de nous servir d'un index invisible.
Un autre moyen consiste à forcer l'utilisation de l'index via le hint /*+ index*/

SQL> show parameter optimizer_use_invisible_indexes  ;

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
optimizer_use_invisible_indexes      boolean FALSE
SQL> alter session set optimizer_use_invisible_indexes= true ; 

Session modifiée.

SQL> explain plan for select * from dvp where username ='jaouad' ;

Explicité.
SQL> set linesize 250
SQL> r
  1*  select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial'))

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 709340066

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |     1 |    25 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| DVP   |     1 |    25 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_DVP |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access("USERNAME"='jaouad')

Note
-----
   - dynamic sampling used for this statement

18 ligne(s) sélectionnée(s).


Les tables en mode Read - Only :

Pouvoir mettre une table en mode Read Only, ce qui présente l'avantage de pouvoir se prémunir contre les mises à jour maladroites.
SQL> select table_name, read_only from user_tables where table_name = 'DVP'; 

TABLE_NAME                     REA
------------------------------ ---
DVP                            NO

SQL> insert into dvp ( username ) values ('Magnus') ; 

1 ligne créée.

SQL> commit ;

Validation effectuée.

SQL> alter table dvp read only  ;

Table modifiée.

SQL>  insert into dvp ( username ) values ('Marc') ; 
 insert into dvp ( username ) values ('Marc')
             *
ERREUR à la ligne 1 :
ORA-12081: opération de mise à jour interdite sur la table "BRINKS"."DVP"


SQL> select table_name, read_only from user_tables where table_name = 'DVP'; 

TABLE_NAME                     REA
------------------------------ ---
DVP                            YES

VII. Remerciements

Je tiens particuliérement à remercier Hubert Quarantel- Colombani pour son expertise sur les systémes ouverts et notamment Linux

Les sources présentées sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Jaouad ZOUAGHI. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.



Valid XHTML 1.1!Valid CSS!

Copyright © 2007-2010 . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsable bénévole de la rubrique Oracle : Xavier Vlieghe - Contacter par EMail :
Vos questions techniques : forum d'entraide Oracle - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.