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.
[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 displayat 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
Premier écran de lancement :
Problème de création Orainventory
Il est possible de rencontrer une erreur de création de l'OraInventory:
En appuyant sur Ok on peut spécifier un autre emplacement pour l'OraInventory
Vérification des pré-requis Systéme:
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.
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.shscript...
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 fileas needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.shscript.
Now product-specific root actions will be performed.
Finished product-specific root actions.
Fin de l'installation :
Vérification des 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 };
Création du FS pour accueuillir la base de données :
[root@dsiege103829 product]# vgs
VG #PV #LV #SN Attr VSize VFree
VGsys 180 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 190 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=0320 block groups32768 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
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> altersystemset 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 1410:27 initorcl.ora
drwxr-sr-x 3 oracle dba 4096 Aug 1411:12 diag
Création de la base de données :
createdatabase orcl
user sys identifiedby *****
usersystemidentifiedby *****
controlfilereusemaxdatafiles 32
maxinstances 1
characterset WE8ISO8859p15
national characterset al16utf16
logfilegroup 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
noarchivelogextent 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
defaulttablespace USERS
datafile '/oracle/data/orcl/users_01.dbf'
size 256 M reuse autoextend on maxsize 1 G
extent management local autoallocate
defaulttemporarytablespace 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 :
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 :
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 immediateDatabase closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total SystemGlobal 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 15362007-08-2214: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.
[oracle@dsiege103829 admin]$ lsnrctl start
LSNRCTL for Linux: Version 11.1.0.6.0 - Production on 14-AUG-200711: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-200711: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 169191011:19 ? 00:00:00 /opt/oracle/product/111/bin/tnslsnr LISTENER -inherit
oracle 1692716106011:19 pts/300:00:00grep tns
[oracle@dsiege103829 admin]$
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 :
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
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> createtable dvp ( username varchar2(10)) ;
Table créée.
SQL> insertinto dvp values ('jaouad') ;
1 ligne créée.
SQL> insertinto dvp values ('orafrance');
1 ligne créée.
SQL> insertinto dvp values ('Bouyao');
1 ligne créée.
SQL> insertinto dvp values ('Sheik');
1 ligne créée.
SQL> insertinto dvp values ('Magnus');
1 ligne créée.
SQL> insertinto 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> altertable dvp add (phone number );
altertable dvp add (phone number )
*
ERREUR à la ligne 1 :
ORA-00054: ressource occupée et acquisition avec NOWAIT ou temporisation
indiqué
SQL> altersessionset ddl_lock_timeout = 10;
Session modifiée.
SQL> altertable 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> altertable 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> createtable 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> insertinto dvp (username) values ('jaouad');
1 ligne créée.
SQL> insertinto dvp (username) values ('orafrance') ;
1 ligne créée.
SQL> insertinto 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> createindex 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 NORMALSQL> insertinto dvp (username, salary ) values ('Marc', 0) ;
insertinto 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> createindex 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 insertinto dvp (username) values ('developpez') ;
7 endloop;
8 commit ;
9 end ;
10 /
Procédure PL/SQL terminée avec succès.
SQL> selectcount (*) from dvp;
COUNT(*)
----------
1004
SQL> explainplanforselect * from dvp where username ='jaouad' ;
Explicité.
SQL> set linesize 250
SQL> r
1* select plan_table_output fromtable(dbms_xplan.display('plan_table',null,'serial'))
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------Planhash value: 709340066
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECTSTATEMENT | | 1 | 25 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BYINDEXROWID| DVP | 1 | 25 | 2 (0)| 00:00:01 |
|* 2 | INDEXRANGE SCAN | I_DVP | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (identifiedby operation id):
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------------
2 - access("USERNAME"='jaouad')
Note
-----
- dynamic sampling used for this statement
18 ligne(s) sélectionnée(s).
SQL> alterindex i_dvp invisible ;
Index modifié.
SQL> explainplanforselect * from dvp where username ='jaouad' ;
Explicité.
SQL> select plan_table_output fromtable(dbms_xplan.display('plan_table',null,'serial')) ;
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------Planhash value: 2450334311
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECTSTATEMENT | | 1 | 25 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| DVP | 1 | 25 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identifiedby 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 booleanFALSESQL> altersessionset optimizer_use_invisible_indexes= true ;
Session modifiée.
SQL> explainplanforselect * from dvp where username ='jaouad' ;
Explicité.
SQL> set linesize 250
SQL> r
1* select plan_table_output fromtable(dbms_xplan.display('plan_table',null,'serial'))
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------Planhash value: 709340066
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECTSTATEMENT | | 1 | 25 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BYINDEXROWID| DVP | 1 | 25 | 2 (0)| 00:00:01 |
|* 2 | INDEXRANGE SCAN | I_DVP | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (identifiedby 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> insertinto dvp ( username ) values ('Magnus') ;
1 ligne créée.
SQL> commit ;
Validation effectuée.
SQL> altertable dvp readonly ;
Table modifiée.
SQL> insertinto dvp ( username ) values ('Marc') ;
insertinto 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