Malheureusement mon opérateur me le commercialise pas encore... Enfin, d'ici quelques jours, je l'aurai dans ma poche, d'ici là... voyez comme il est extraordinaire :
-GarK!
30 juin 2007
29 juin 2007
Un service RedHat/Oracle EL pour vos instances
J'ai développé trois programmes pour démarrer automatiquement les instances et listeners Oracle avec Linux. Cela permet aussi d'arrêter proprement une instance lorsqu'on change de niveau ou lorsqu'on arrête le système proprement (aucun intérêt pour cette dernière fonctionnalité et Oracle, j'avoue !).
Bien sur, il n'y a aucune garantie que vous arriviez à le faire fonctionner ! Enfin, je m'en sers maintenant, voici une brève description :
Pour installer ces scripts, il faut :
-GarK!
PS: Il arrive qu'on se fasse insulter parce qu'un programme ne fonctionne pas... Si ces attitudes sont vos habitudes, merci de passer votre chemin.
Bien sur, il n'y a aucune garantie que vous arriviez à le faire fonctionner ! Enfin, je m'en sers maintenant, voici une brève description :
- lin-srvctl est une commande à la srvctl dans le cas de RAC. Ce permet de démarrer, arrêter ou valider le statut de la base des instances et des listeners
- oradb-ORCL est le script que vous pourrez modifier et mettre dans /etc/init.d pour assurer la logique de gestion d'une instance par les services linux
- oralsnr est le script que vous pourrez modifier et mettre dans /etc/init.d pour assurer la logique de gestion d'un listener par les services linux
Pour installer ces scripts, il faut :
- Copier lin-srvctl dans le répertoire $ORACLE_HOME/bin chacun de vos logiciels de bases de données. Changer les droits et le propriétaire du script pour que les dba puissent exécuter le script et positionner correctement la variable d'environnement ORACLE_HOME.
- Copier les 2 autres fichiers et adaptez-les à vos besoins.
- Changer leur nom
- Changer les variables d'environnement inclues en entête pour qu'elles correspondent à vos instances, listeners, etc
- Copier vos scripts dans /etc/init.d. Associer les bons droits et propriétaires.
- Enregistrer les script avec chkconfig --add
- Adapter le "level" avec chkconfig et tester avec /sbin/service
- Vos scripts peuvent également être utilisés et configurer avec system-config-services ou redhat-config-services !
-GarK!
PS: Il arrive qu'on se fasse insulter parce qu'un programme ne fonctionne pas... Si ces attitudes sont vos habitudes, merci de passer votre chemin.
Labels:
database,
linux,
oracle
Links to this post
27 juin 2007
Créer un service sous Linux
Ou plus exactement sous des versions comme RedHat, Fedora, CentOs ou Oracle EL. Les services permettent de démarrer automatiquement des programmes comme VNC Server ou même une base de données lors du démarrage du système d'exploitation. Dans ce qui suit, vous trouverez comment créer un service et un exemple trouvé sur le web et légèrement modifié pour mes besoins personnels.
Avant tout, familiarisez vous avec l'initialisation de Linux. Ce document l'explique très simplement. Ensuite, il faut créer le script qui va gérer votre service. Ce script a les caractéristiques suivantes :
Il existe un script /etc/init.d/functions qui contient un ensemble de fonctions très pratiques comme killproc qui tue le process dont le nom est passé en paramètre. Voici le script pour gérer Xvfb (encore utile !)
Une fois que vous avez ajouté le script dans /etc/init.d (il doit s'appeler xvfb), vous devez :
Une fois le script enregistré, vérifiez que le service peut être démarré, arrêté, vérifié et que bien sur, qu'il fait son travail... Voici quelques exemples de commandes que vous pouvez utiliser à cet effet.
Vous pouvez utiliser la commande init et redémarrer votre serveur de test pour vous assurer du bon fonctionnement de votre nouveau service.
Voila... Maintenant, pourquoi pas démarrer VNC Server en level 3 ? Plus généralement, pourquoi ne pas utiliser que les services dont vous avez besoin et désactiver les autres ? Pourquoi continuer de démarrer les mêmes processus à la main ?
Un dernier commentaire.
Si vous utilisez le display :1 pour Xvfb, comme dans mon script, Cf ci-dessous :
Avant tout, familiarisez vous avec l'initialisation de Linux. Ce document l'explique très simplement. Ensuite, il faut créer le script qui va gérer votre service. Ce script a les caractéristiques suivantes :
- le nom du fichier script sera le nom du service
- le script doit contenir 2 lignes dans ses commentaires d'entête dont la première ressemble à celle qui est écrite ci-dessous
# chkconfig: 2345 20 80 - le premier nombre définit les différents "level" dans lesquels le script doit s'exécuter,
- le deuxième nombre indique la position de démarrage du service parmi les autres services (par exemple, vous devez démarrer un serveur FTP seulement après le réseau)
- le troisième nombre indique la position d'arrêt du service parmi les autres (même remarque que pour le précédent ; gardez à l'esprit que les scripts d'arrêt sont exécutés lors des changements de "level" et que ça permet notamment de passer de init 5 à init 3.
- La seconde ligne (qui peut être étendue sur d'autres lignes, si vous positionnez le caractère backslash (\) à la fin de la ligne) contient la description du service comme ci-dessous :
# description: Start and Stop the Oracle Database with \
# the dbshut and dbstart scripts. Make sure you've \
# correctly set /etc/oratab entries with 'Y' at the end - Enfin le script prend un paramètre en entrée. Chacune des valeurs ci-dessous pour ce paramètre doivent être traitées :
- start : démarre votre service
- stop : arrête votre service
- restart : arrête et redémarre votre service
- condrestart : arrête et redémarre votre service seulement s'il est déjà démarré
- status : renvoi le status de votre service (0 pour OK, 1 pour KO)
Il existe un script /etc/init.d/functions qui contient un ensemble de fonctions très pratiques comme killproc qui tue le process dont le nom est passé en paramètre. Voici le script pour gérer Xvfb (encore utile !)
#!/bin/shEnregistrer le script
#
# Startup script for Xvfb
#
# chkconfig: 2345 79 21
# description: Xvfb - virtual frame buffer
# processname: Xvfb
#
# Source function library.
. /etc/rc.d/init.d/functions
## See how we were called.
case "$1" in
start)
echo -n "Starting Xvfb services: "
Xvfb :1 -screen 0 800x600x8 &
export DISPLAY=:1
echo
touch /var/lock/subsys/Xvfb
;;
stop)
echo -n "Stopping Xvfb services: "
killproc Xvfb
echo
rm -f /var/lock/subsys/Xvfb
;;
status)
status Xvfb
;;
restart|reload)
$0 stop
$0 start
;;
condrestart)
$0 status
if [ $? -eq 0 ]; then
$0 stop
$0 start
fi
;;
*)
echo "Usage: xvfb {start|stop|status|restart}"
exit 1
esac
exit 0
Une fois que vous avez ajouté le script dans /etc/init.d (il doit s'appeler xvfb), vous devez :
- Changer son propriétaire
- Changez ses droits d'exécution
- Ajouter le service aux autres services
- Vérifier qu'il est bien à la place voulue en comparant par rapport aux autres
- Changez l'état du service (on|off) en fonction du "level" voulu
- Tester le service
chown root root xvfbTester le script
chmod 755 xvfb
chkconfig --add xvfb
chkconfig --list | \
grep -e vncserver -e xvfb
xvfb 0:off 1:off 2:on ...
vncserver 0:off 1:off 2:off ...
chkconfig --level 24 xvfb off
Une fois le script enregistré, vérifiez que le service peut être démarré, arrêté, vérifié et que bien sur, qu'il fait son travail... Voici quelques exemples de commandes que vous pouvez utiliser à cet effet.
/sbin/service xvfb stopUne fois effectué, vous pouvez vérifier que les liens qui correspondent au démarrage et a l'arrêt du service dans les différents "level" sont correctement définis. Naviguez dans le répertoire /etc et exécuter la commande suivante :
/sbin/service xvfb status
/sbin/service xvfb start
ps -ef |grep Xvfb |grep -v grep
/sbin/service xvfb condrestart
[root@kilian etc]# ls -ltr rc[0-6].d/*xvfbLe résultat doit ressembler au suivant. Les liens commençant par K indiquent les "level" pour lesquels le service est arrêté, alors que les liens commençant par S, indiquent les "level" pour lesquels il est démarré :
lrwxrwxrwx 1 root root 14 Jun 27 21:38 rc6.d/K21xvfb -> ../init.d/xvfbUtiliser le script.
lrwxrwxrwx 1 root root 14 Jun 27 21:38 rc5.d/S79xvfb -> ../init.d/xvfb
lrwxrwxrwx 1 root root 14 Jun 27 21:38 rc1.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx 1 root root 14 Jun 27 21:38 rc0.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx 1 root root 14 Jun 27 21:41 rc4.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx 1 root root 14 Jun 27 21:41 rc3.d/K21xvfb -> ../init.d/xvfb
lrwxrwxrwx 1 root root 14 Jun 27 21:41 rc2.d/K21xvfb -> ../init.d/xvfb
Vous pouvez utiliser la commande init et redémarrer votre serveur de test pour vous assurer du bon fonctionnement de votre nouveau service.
Voila... Maintenant, pourquoi pas démarrer VNC Server en level 3 ? Plus généralement, pourquoi ne pas utiliser que les services dont vous avez besoin et désactiver les autres ? Pourquoi continuer de démarrer les mêmes processus à la main ?
Un dernier commentaire.
Si vous utilisez le display :1 pour Xvfb, comme dans mon script, Cf ci-dessous :
Xvfb :1 -screen 0 800x600x8 &Alors il n'est plus utilisable par VNC Server. Pour contourner ce problème utiliser le display :2 ou :3 dans VNC Server. Le fichier /etc/sysconfig/vncserver ressemble donc à ceci, plutôt qu'à celui décrit dans mon post précédent à propos de VNC :
VNCSERVERS="2:oracle"-GarK!
VNCSERVERARGS[2]="-geometry 1280x1024 -depth 16 -nolisten tcp"
Labels:
linux,
oracle
Links to this post
Empêcher le démarrage automatique de RAC
C'est plus compliqué à trouver sur le Web (ou Metalink) que j'imaginais ! Si vous ne voulez pas que votre base de données (Appelons la RACDB) démarre automatiquement avec cluster, utilisez la commande suivante :
-GarK!
srvctl modify database \BTW, ça permet aussi de découvrir que c'est la configuration cluster qui permet de démarrer sur un spfile ou un init.ora...
-d RACDB -y manual
srvctl config database \
-d RACDB -a,
-GarK!
Labels:
clusterware,
oracle,
rac
Links to this post
Don't do that /*+ kill -9 Clusterware */
Si vous voulez vous faire des amis, je vous recommande la commande suivante à exécuter sous root exclusivement :
GarK!
ps -ef | \L'effet sur le clusterware est garanti...
grep d.bin | \
grep -v grep | \
awk '{ print "kill -9", $2 }' | \
sh
GarK!
Labels:
clusterware,
linux,
rac
Links to this post
24 juin 2007
Subversion et Berkeley DB sur Linux
Pour compléter le post précèdent a propos de Subversion et JDeveloper, voici comment installer Subversion sur Linux avec Berkeley DB.
Télécharger les logiciels
Créer un référentiel qui utilise Berkeley DB
Par défaut, les référentiels utilisent le système de fichier. Si vous voulez utiliser Berkeley DB parce que c'est plus robuste (et notamment en cas de crash), il faut utiliser une option lorsque vous créerez le référentiel comme ci-dessous :
Autres opérations,
Le post précèdent Subversion et JDeveloper explique plusieurs aspects de l'utilisation de Subversion avec JDeveloper et c'est identique que vous utilisiez Windows ou Linux... Je ne reviendrai pas sur ces opérations. Notez toutefois que :
Télécharger les logiciels
- Subversion, la version subversion-1.x.x.tar.gz peut être téléchargée ici.
- Le package qui inclut les dépendances de subversion (sauf si vous avez déjà la bonne version et les bon modules installés au préalable. "subversion-deps-1.x.x.tar.gz" peut être téléchargé ici.
- Berkeley DB 4.4.20.
- Faites l'extraction des fichiers de Berkeley DB. Utilisez la commande "tar -zxvf db-4.4*.tar.gz" par exemple.
- Naviguez dans le répertoire build_unix en utilisant une commande comme "cd db-4.4*/build_unix"
- Lancez le programme Configure à l'aide de la commande "../dist/Configure"
- Compiler les programme en tapant "make"
- Installez Berkeley DB avec la commande "make install" depuis le même répertoire. Pour cette dernière commande, vous devez être root.
- Pour plus d'information, le répertoire docs
- Faite l'extraction des 2 fichiers au même endroit (subversion-1.x.x.tar.gz et subversion-deps-1.x.x.tar.gz). Le second fichier s'ajoute sur la même arborescence que le premier.
- Naviguez dans le dossier crée à l'étape précédente et exécutez les commandes suivantes :
./configure --with-berkeley-db=/usr/local/BerkeleyDB.4.4La dernière commande doit être exécutée sous le compte root. Vous devez être dans le répertoire créé précédemment pour chacune d'entre-elles. Pour vérifier l'installation, tapez la commande ci-dessous :
make
make install
svn --version
Créer un référentiel qui utilise Berkeley DB
Par défaut, les référentiels utilisent le système de fichier. Si vous voulez utiliser Berkeley DB parce que c'est plus robuste (et notamment en cas de crash), il faut utiliser une option lorsque vous créerez le référentiel comme ci-dessous :
svnadmin create --fs-type bdb demo"demo" est le répertoire dans lequel vous voulez que l'ensemble des fichiers soient stockés.
Autres opérations,
Le post précèdent Subversion et JDeveloper explique plusieurs aspects de l'utilisation de Subversion avec JDeveloper et c'est identique que vous utilisiez Windows ou Linux... Je ne reviendrai pas sur ces opérations. Notez toutefois que :
- Le site suivant offre l'ensemble de la documentation associée a Subversion
- Pour demarrer le daemon subversion sur Linux, il faut utiliser la commande suivante :
export SVN_REPS=<path_to_repositories>-GarK!
svnserve -d -r $SVN_REPS &
Labels:
java,
linux
Links to this post
Oracle SQL*Developer et MySQL
Un peu d'imagination... vous vous connecterez à MySQL avec Oracle SQL*Developer. Voici comment :

Comme ça, je sens la présence rassurante de mes outils quand je travaille sur ces bases de données exotiques... Bon pour pas perdre mes repères, j'ai ajouté un utilisateur Oracle. Après tout, il est très probable que vous reversiez un peu d'argent à une célèbre filiale d'Oracle si vous utiliser MySQL ;-).
-GarK!
- D'abord ajoutez le driver JDBC MySQL que vous pouvez télé-charger ici. Le fichier .zip ou .tar.gz contient un fichier nommé mysql-connector-java-x.y.z-bin.jar ou x.y.z identifie la version du driver. Extrayez ce fichier dans un des répertoires de SQL*Developer
- Enregistrez ensuite le driver dans SQL*Developer, pour cela, utiliser le menu 'Tools | Preferences... | Database | Third Party JDBC Drivers'. Au moyen du bouton "Add Entries", sélectionnez le fichier extrait précédemment.
- Créez enfin une nouvelle connexion et sélectionnez l'onglet MySQL. Vous pouvez saisir les informations qui vous permettront de vous connecter à votre base de données.

Comme ça, je sens la présence rassurante de mes outils quand je travaille sur ces bases de données exotiques... Bon pour pas perdre mes repères, j'ai ajouté un utilisateur Oracle. Après tout, il est très probable que vous reversiez un peu d'argent à une célèbre filiale d'Oracle si vous utiliser MySQL ;-).
-GarK!
23 juin 2007
VNC Server... plus sexy sous linux !
Comment changer le L&F du Window Manager par défaut de VNC Server sur Linux n'est pas chose complexe... Encore faut-il le savoir. Dans l'ordre :
1) Vérifiez que votre fichier vncservers généralement dans /etc/sysconfig contient les informations nécessaires pour lancer un serveur VNC. Il faut être root (ou administrateur système). Voici par exemple le contenu de mon fichier :
~/.vnc de l'utilisateur. Le fichier contient par défaut la ligne suivante qui indique de Tab Window Manager est le gestionnaire de fenêtres par défaut de VNC Server :

Vous pouvez vous connectez à votre serveur VNC avec tout le confort de votre PC...
-GarK!
1) Vérifiez que votre fichier vncservers généralement dans /etc/sysconfig contient les informations nécessaires pour lancer un serveur VNC. Il faut être root (ou administrateur système). Voici par exemple le contenu de mon fichier :
VNCSERVERS="1:oracle"
VNCSERVERARGS[1]="-geometry 1280x1024 -depth 16 -nolisten tcp -nohttpd"
- VNCSERVERS indique qu'un serveur tourne sur le 1er port dédié à cet effet sous l'utilisateur oracle.
- VNCSERVERARGS[1] indique que les paramètres pour ce serveur sont :
- un écran de 1280x1024
- 16 bits par pixel
- le serveur VNC n'est pas accessible par http ni ne peut servir de serveur X
vncpasswd3) Lorsque vous relancez le serveur VNC, l'ensemble des fichiers (log et configuration) sont crees le répertoire ~/.vnc de l'utilisateur qui execute le serveur VNC. Connectez-vous root (ou administrateur système) sous Redhat, CentOS ou Oracle EL et saisissez :
/sbin/service vncserver restart4) Une fois le serveur lancé , vous allez pouvoir modifier le fichier xstartup dans le répertoire
/sbin/service vncserver status
~/.vnc de l'utilisateur. Le fichier contient par défaut la ligne suivante qui indique de Tab Window Manager est le gestionnaire de fenêtres par défaut de VNC Server :
twm &Changez pour Gnome ou KDE est aussi simple que de remplacer la ligne ci-dessus par une des lignes ci-dessous :
gnome-session &
kde &5) Relancez le service VNC comme a l'étape 3 et vous avez fini...
Vous pouvez vous connectez à votre serveur VNC avec tout le confort de votre PC...
-GarK!
Labels:
linux,
oracle
Links to this post
A quoi ça sert... les ordinateurs ?
J'ai toujours su que l'informatique changerait le monte tel qu'il est. En voici 2 exemples :
Pas si loin de la réalité et pourtant inquiétants...
-GarK!
Pas si loin de la réalité et pourtant inquiétants...
-GarK!
PL/SQL et Grant
Par défaut les procédures, fonctions et packages PL/SQL héritent des droits de leur propriétaire... Voici l'illustration assez surprenante de ce point ci-dessous (n'utilisez pas le compte system pour ce genre de choses bien sur...) :
-GarK!
SQL> create table gark(id number);En donnant les privileges, ça marche parfaitement.
Table created
SQL> create or replace procedure hr.test is
2 gark number;
3 begin
4 select count(*) into gark from system.gark;
5 end;
6 /
Warning: Procedure created with compilation errors.
SQL> show errors
Errors for PROCEDURE HR.TEST:
LINE/COL ERROR
-------- --------------------------------------------------
4/4 PL/SQL: SQL Statement ignored
4/42 PL/SQL: ORA-00942: table or view does not exist
SQL> desc system.gark
Name Null? Type
----------------------------------------- -------- -------
ID NUMBER
SQL> grant select on system.gark to hr;Bon mais vous savez tout ça... et peut-être que vous vous dites que donner les droits d'exécution non pas au propriétaire mais a l'utilisateur qui exécute le script pouvait être une autre solution ? Et tout cas, c'est ce que je me suis dit et bien non :
Grant succeeded.
SQL> grant select on system.gark to hr.test;
SQL> alter procedure hr.test compile;
Procedure altered.
Dans ce cas aussi les privilèges sont valides en fonction du propriétaire du schéma au moment de la compilation... Enfin j'ai rien trouvée pour forcer la compilation dans ce cas. Peut-être quelqu'un a-t-il une astuce ?
SQL> create or replace procedure hr.test
2 authid current_user is
3 gark number;
4 begin
5 select count(*) into gark from system.gark;
6 end;
7 /
Warning: Procedure created with compilation errors.
SQL> show errors
Errors for PROCEDURE HR.TEST:
LINE/COL ERROR
-------- ---------------------------------------------------------
5/4 PL/SQL: SQL Statement ignored
5/42 PL/SQL: ORA-00942: table or view does not exist
-GarK!
Labels:
oracle,
sql
Links to this post
Oracle Enterprise Linux 5
Si Oracle 10g R2, n'est pas encore disponible sur Oracle Enterprise Linux 5 (ni d'ailleurs sur Redhat EL 5), ça ne devrait plus trop tarder.... OEL5 est disponible depuis 2 jours :

Pour le télé-charger, allez sur la section Linux de eDelivery. On sent qu'on prépare l'arrivée de la 11g...
-GarK!
Pour le télé-charger, allez sur la section Linux de eDelivery. On sent qu'on prépare l'arrivée de la 11g...
-GarK!
Labels:
linux,
oracle
Links to this post
17 juin 2007
ADF Rich Faces 11 /*+ Impressionant */
J'ai joué toute l'après-midi avec EJB 3.0, JPA, JSR-227, les nouveaux composants JSF d'Oracle (ADF Rich Faces 11g) et Jdeveloper 11g : C'est impressionnant, comme vous pouvez le voir ci-dessous :

En quelques minutes, vous créez des tableaux avec des colonnes que vous pouvez trier, déplacer ou filtrer. Vos menus flottent, vos panneaux sont découpés, le rendu est incroyable et le développement étonnamment facile. Prenez quelques heures pour vous faire une idée vous même : le tutorial qui vient avec la version JDeveloper 11g vous permettra de découvrir, si vous le réalisez que, ça y est le développement d'application web en Java est entré dans une nouvelle dimension...
-GarK!

En quelques minutes, vous créez des tableaux avec des colonnes que vous pouvez trier, déplacer ou filtrer. Vos menus flottent, vos panneaux sont découpés, le rendu est incroyable et le développement étonnamment facile. Prenez quelques heures pour vous faire une idée vous même : le tutorial qui vient avec la version JDeveloper 11g vous permettra de découvrir, si vous le réalisez que, ça y est le développement d'application web en Java est entré dans une nouvelle dimension...
-GarK!
Subversion et JDeveloper
Un aspect important du développement est la gestion des évolutions... Subversion est un logiciel open source de gestion de versions (Version Control Software ou VCS). Ce Post détaille les différentes étapes de la mise en oeuvre de Subversion avec JDeveloper 11g sous Windows.
Télécharger et installer la dernière version de Subversion
Vous pouvez télécharger sur le site web Tigris.org dans le dossier associée ici et vous reporter au document d'installation. Si vous prenez la version .zip, l'installation consiste dans les opérations suivantes :
Créer un référentiel et démarrer le serveur Subversion
Subversion fonctionne avec Apache. Toutefois pour une installation simple, vous pouvez utiliser un serveur avec un protocole dédié appelé svnserver. Pour démarrer svnserver opérez comme suit :
Positionner authentification et autorisation pour votre référentiel
Assurez-vous que vous avez mis en place une authentification sur Subversion pour pouvoir non seulement lire mais également écrire dans le référentiel. Pour cela :
Ajouter votre référentiel Subversion a JDeveloper
Une fois JDeveloper 11g démarré, vous pouvez ajouter votre référentiel en sélectionnant le menu "File | New... | General | Connections | Subversion Repository Connections". La boite de dialogue ci-dessous apparait :

Subversion est installé et configuré avec JDeveloper. Vous allez maintenant enregistrer un projet ou un workspace existant dans votre référentiel nouvellement créé. Pour cela, sélectionnez votre projet ou workspace et le menu contextuel "Versioning | Import files..." comme ci-dessous :

A travers l'assistant vous aller pouvoir ainsi enregistrer votre workspace ou projet entier dans subversion... Sélectionner "perform checkout" si vous voulez que votre projet soit synchroniser avec la version stockée dans subversion.
Si vous voulez enregistrer un nouveau projet dans Subversion, la procédure est identique.
Travailler avec Subversion
Une fois que votre projet/workspace est dans un référentiel subversion, tous les nouveaux fichiers seront automatiquement proposés comme candidat pour ajouter dans subversion. Il en est de même pour les fichiers mis à jour ou supprimés. Sélectionner le menu "Versioning Pending Changes" pour visualiser les modification effectuées sur vos fichiers et pas encore mis à jour dans Subversion. La fenêtre ci-dessous doit s'afficher :

Dans l'onglet "Outgoing" contient les changement en cours, L'onglet Candidates contient les nouveaux fichiers :
Voila pour les bases et pour plus d'informations...
Télécharger et installer la dernière version de Subversion
Vous pouvez télécharger sur le site web Tigris.org dans le dossier associée ici et vous reporter au document d'installation. Si vous prenez la version .zip, l'installation consiste dans les opérations suivantes :
- Décompresser le contenu du fichier .zip dans un répertoire de votre choix. Vous trouverez dans le sous-répertoire bin, les fichiers suivants :
- svn est le client subversion
- svnadmin est l'outil d'administration du serveur Subversion
- svnlook permet de réaliser des rapports sur vos référentiels subversions
- Pour utiliser subversion, il suffit d'utiliser le mode ligne de commande de Windows, sélectionnez le menu "Démarrer | Exécuter...". Tapez cmd.exe et une console doit s'afficher. Positionnez les variables d'environnement comme ci-dessous en remplaçant <path_to_svn>\svn-win32-1.4.4 par le répertoire d'installation que vous avez choisi
set SVN_HOME=<path_to_svn>\svn-win32-1.4.4
set PATH=%SVN_HOME%\bin;%PATH%
set APR_ICONV_PATH=%SVN_HOME%\iconv
- Vous pouvez ensuite vérifier que votre installation est correcte en tapant la commande ci-dessous :
svn --versionLe résultat de la commande doit ressembler à ce qui suit :
svn, version 1.4.4 (r25188)
compiled Jun 8 2007, 18:49:42
Copyright (C) 2000-2006 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository access (RA) modules are available:
* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
- handles 'http' scheme
- handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
- handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
- handles 'file' scheme
Créer un référentiel et démarrer le serveur Subversion
Subversion fonctionne avec Apache. Toutefois pour une installation simple, vous pouvez utiliser un serveur avec un protocole dédié appelé svnserver. Pour démarrer svnserver opérez comme suit :
- Créez un répertoire qui contiendra vos référentiels. Pour la suite, nous dirons que la variable SVN_REPS contient ce répertoire.
- Utilisez svnadmin pour créer un nouveau référentiel. Dans la console Windows, les variables d'environnement étant positionnées, exécutez les commandes qui suivent :
cd %SVN_REPS%
svnadmin create TestRepository
- Dans une autre Console Windows, positionnez également les variables d'environnement et lancez le serveur Subversion comme avec la commande ci-dessous :
svnserve -d -r %SVN_REPS%La console Windows doit rester ouverte tant que vous voulez utiliser le serveur subversion.
Positionner authentification et autorisation pour votre référentiel
Assurez-vous que vous avez mis en place une authentification sur Subversion pour pouvoir non seulement lire mais également écrire dans le référentiel. Pour cela :
- Editez le fichier svnserve.conf contenu dans le sous répertoire conf de votre référentiel. Assurez-vous que le répertoire contient les lignes suivantes :
anon-access = none # Indique que les acces anonymes n'ont aucun droit
auth-access = write # Indique que les acces authentifiés ont les droits de
# lecture/écriture
password-db = passwd # Indique que le fichier de mots de passe est le
# fichier passwd situe dans le meme répertoire
authz-db = authz # Indique que le fichier d'autorisation est le fichier
# authz situe dans le même répertoire
- Editez le fichier passwd contenu dans le même sous-répertoire et assurez-vous qu'il contient les username/password pour se connecter a Subversion comme ci-dessous :
arkzoyd = arkzoydpassord # Ou la valeur a droite du signe = indique le nom
# de l'utilisateur et celle de gauche
# son mot de passe
- Enfin, editez le fichier authzd contenu dans le meme sous-repertoire et assurez-vous qu'il permet a l'utilisateur de lire et écrire dans le referentiel. Ajoutez par exemple :
[/]
arkzoyd = rw # indique que l'utilisateur arkzoyd a le droit
# de lecture/écriture a la racine du referentiel
Ajouter votre référentiel Subversion a JDeveloper
Une fois JDeveloper 11g démarré, vous pouvez ajouter votre référentiel en sélectionnant le menu "File | New... | General | Connections | Subversion Repository Connections". La boite de dialogue ci-dessous apparait :

- Remplissez-la avec les valeurs de connexion a votre serveur subversion. Tester la connexion pour vous assurer que tout est bien paramétré et cliquez sur OK.
- Sélectionnez ensuite le menu "Versioning | Version System | Subversion" Pour vous assurer que le système de versioning utilise sera bien Subversion.
Subversion est installé et configuré avec JDeveloper. Vous allez maintenant enregistrer un projet ou un workspace existant dans votre référentiel nouvellement créé. Pour cela, sélectionnez votre projet ou workspace et le menu contextuel "Versioning | Import files..." comme ci-dessous :

A travers l'assistant vous aller pouvoir ainsi enregistrer votre workspace ou projet entier dans subversion... Sélectionner "perform checkout" si vous voulez que votre projet soit synchroniser avec la version stockée dans subversion.
Si vous voulez enregistrer un nouveau projet dans Subversion, la procédure est identique.
Travailler avec Subversion
Une fois que votre projet/workspace est dans un référentiel subversion, tous les nouveaux fichiers seront automatiquement proposés comme candidat pour ajouter dans subversion. Il en est de même pour les fichiers mis à jour ou supprimés. Sélectionner le menu "Versioning Pending Changes" pour visualiser les modification effectuées sur vos fichiers et pas encore mis à jour dans Subversion. La fenêtre ci-dessous doit s'afficher :

Dans l'onglet "Outgoing" contient les changement en cours, L'onglet Candidates contient les nouveaux fichiers :
- Vous pouvez simplement accepter les nouveaux fichiers en les sélectionnant et en cliquant sur le bouton "+" dans l'onglet Candidates
- Vous pouvez Valider les changement dans Subversion en validant les modifications dans l'onglet "Outgoing". Vous pouvez egalement tous valider en selectionnant le menu "Versioning | Commit Working Copy..."
Voila pour les bases et pour plus d'informations...
- Dans la documentation JDeveloper (Menu "Help | Table of Content") Il y a un chapitre "Desiging and Developing Applications -> Using Versioning -> Using Subverion with JDeveloper" , un chapitre entier
- Vous pouvez utiliser RapidSVN comme client Subversion
- http://dark.clansoft.dk/~mbn/svnservice/ permet d'enregistrer snvserver comme un service Windows
Labels:
java,
oracle
Links to this post
16 juin 2007
SQL*Developer Plug-In Update #3
J'ai mis à jour la Plug-In SQL*Developer aujourd'hui ! J'y ai maintenant intègré quelques rapports utiles et notamment pour visualiser des éléments de RAC et de AWR. Je l'ai également renommée puisqu'elle s'enrichit.
Mes rapports préférés sont les 2 rapports TopSQL dans la section "SGA Performance Queries". Ils permettent non seulement d'afficher les ordres SQL dans la shared pool mais également le plan et les objets associés pour répondre à un commentaire sur mon précédent (ici). Voila ce que ça donne :

Si vous utilisez déjà la Plug-In, faites simplement une mise à jour. Sinon, reportez-vous à mon Post précédent pour l'installer. Son nom est désormais "GarK! Plugin". Si vous avez des idées, des commentaires ou des requêtes à ajouter... tout le monde pourra en bénéficier.
GarK!
Mes rapports préférés sont les 2 rapports TopSQL dans la section "SGA Performance Queries". Ils permettent non seulement d'afficher les ordres SQL dans la shared pool mais également le plan et les objets associés pour répondre à un commentaire sur mon précédent (ici). Voila ce que ça donne :

Si vous utilisez déjà la Plug-In, faites simplement une mise à jour. Sinon, reportez-vous à mon Post précédent pour l'installer. Son nom est désormais "GarK! Plugin". Si vous avez des idées, des commentaires ou des requêtes à ajouter... tout le monde pourra en bénéficier.
GarK!
Labels:
database,
oracle,
rac,
sql
Links to this post
15 juin 2007
Exporter et Importer les clichés AWR
Les clichés AWR comme ceux de Statspack peuvent-être exportés de leur base de données d'origine pour être ensuite analysés sur une base de données différente de celle de production. Merci au DBA de dbmsdirect.com de m'avoir aider a trouver comment :
-GarK!
- Utiliser le script awrextr.sql inclus dans $ORACLE_HOME/rdbms/admin sous le compte SYS. Avant d'effectuer cette opération, assurez que vous avez créer un directory pour effectuer l'export. Executez le script ci-dessous a cet effet :
col owner format a10
col DIRECTORY_NAME format a25
col DIRECTORY_PATH format a100
set pages 200
set lines 150
select * from dba_directories;
- Pousser ensuite le fichier sur une machine de test
- Enfin vous pouvez l'importer en vous connectant SYS avec SQL*Plus et le script awrload.sql inclut dans $ORACLE_HOME/rdbms/admin.
-GarK!
Labels:
database,
oracle,
rac
Links to this post
10 juin 2007
Latches & Enqueues /*+ 3. Global Enqueues */
Ce post termine la description des latches, enqueues et global enqueues sans entrer dans le détail de l'utilité ni du fonctionnement particulier de chacun d'entre eux . Si vous voulez plus de détails sur un latch ou un enqueue, ajoutez un commentaire avec le nom du latch ou de l'enqueue que vous aimeriez voir traité... mais avant d'adresser ces questions, répondons d'abord à : Qu'est-ce qu'un Global Enqueue ?
Pourquoi enqueues ne suffisent-il pas ?
Si les enqueues répondent parfaitement à l'ensemble des besoins complexes de gestion d'accès à des ressources des instances Oracle, ils ne permettent pas de gérer des accès concurrents entre plusieurs instances d'un environnement RAC. Les global enqueues sont donc simplement les enqueues généralisés pour plusieurs instances d'un RAC
Global Enqueue, comment ca marche ?
Les global enqueues sont des structures très semblables à celles des enqueues décrites dans le post précédent. Elles sont également située dans la Shared Pool. Toutefois :

Un exemple concret
Apres la théorie, la pratique, voici une première requête qui montre les différentes zones de mémoire de la SGA, i.e. la Shared Pool, associées aux GES sur l'instance locale. Vous voyez en particulier l'espace occupé par les global enqueues surligné en rouge
1- La requête suivante permet de trouver la valeur object_id de la table :
Conclusion
Je souhaite que cette série vous ait apportee une vision plus claire du fonctionnement de ces mécanismes internes a RAC et aux bases de données Single instance. Si ça continue à vous intéresser, n'hésitez pas, encore une fois à ouvrir la discussion sur un latch ou un enqueue particulier : J'attends vos commentaires !
-GarK!
Pourquoi enqueues ne suffisent-il pas ?
Si les enqueues répondent parfaitement à l'ensemble des besoins complexes de gestion d'accès à des ressources des instances Oracle, ils ne permettent pas de gérer des accès concurrents entre plusieurs instances d'un environnement RAC. Les global enqueues sont donc simplement les enqueues généralisés pour plusieurs instances d'un RAC
Global Enqueue, comment ca marche ?
Les global enqueues sont des structures très semblables à celles des enqueues décrites dans le post précédent. Elles sont également située dans la Shared Pool. Toutefois :
- Les structures des global enqueues sont distribuées entre plusieurs instances de manière a assurer une redondance suffisante des informations pour continuer quelque soit le nombre de serveurs qui "crash".
- Alors que les process mettent directement à jour les enqueues qu'ils utilisent, dans le cas des global enqueues, si les process manipulent les structures des global enqueues de l'instance sur laquelle ils s'exécutent, ils doivent faire appel à un mecanisme plus évolué pour manipuler les global enqueues des autres instances quand c'est nécessaire. Les process d'instances specifiques de RAC LMON (GES Monitor) et LMD (GES Daemon) permettent de mettre a jour les global enqueues des autres instances. L'ensemble de ces process est appelé Global Enqueue Services ou GES et doit faire l'objet d'une attention particulière dans le cas de RAC et notamment lorsque vous examinez les performances d'un système.

- Il existe un agorithme assez évolué en 10g qui permet de définir que pour chaque ressource, une instance qui sera dite le "Resource Master", conservera une copie complète de toutes les infomations de Global Enqueue. Cet algorithme tient compte des instances ouvertes, d'un algorithme de HASH pour répartir les "Resource Master" de manière équitable entre les noeuds. Cet algorithme tient également compte de l'activité précédente des instances (cf ce Post sur le blog de Fairlie Rego). Je n'irai pas plus loin dans cette description mais dans l'exemple ci-dessous l'instance 2 est le "Resource Master" de l'enqueue TM sur la table GARK.
- Si un utilisateur fait une opération qui nécessite qu'un Global Enqueue TM soit posé sur cette table, alors une structure est associée dans la Shared Pool de l'instance à partir de laquelle l'enqueue est posé et (via le GES) sur l'instance "Resource Master"
- Dans une seconde phase, imaginons qu'un utilisateur sur une autre instance réclame le même verrou exclusif sur la table GARK. Il crée alors une structure dans la shared pool qui contiendra l'image locale du Global enqueue et via le GES et l'instance "Resource Master", la ressource sera reclamée a l'instance qui est désormais propriétaire de la ressource du fait de son précédent lock sur la table. A vrai dire, je ne sais pas si les informations sont également conservée par le "Resource Master" mais, à condition d'avoir un RAC 3 instances ou plus, ce doit être assez facile de le déterminer avec les requêtes de la section suivantes.
Un exemple concret
Apres la théorie, la pratique, voici une première requête qui montre les différentes zones de mémoire de la SGA, i.e. la Shared Pool, associées aux GES sur l'instance locale. Vous voyez en particulier l'espace occupé par les global enqueues surligné en rouge
select pool, name, bytesPour ce qui suit, il serait beaucoup plus intéressant d'avoir 3 instances... malheureusement je n'ai pour l'instant pour mes tests qu'une configuration à deux noeuds... Désolé donc mais contentons nous de ça pour montrer quelques point interéssants. Pour commencer pour qu'aucune ressource ne soit en mémoire, arrêtez et redémarrer l'ensemble de vos instances après avoir créé la table GARK (Voir mon exemple précédent à propos des enqueues pour créer cette table). On verifiera d'abord qu'il n'y a aucun Global Enqueue associé a notre table GARK...
from v$sgastat
where name like 'ges%';
POOL NAME BYTES
------------ -------------------------- ----------------------
shared pool ges enqueue cur. usage pe 12
shared pool ges deadlock xid hash tab 11036
shared pool ges recovery domain table 108
shared pool ges process hash table 8640
shared pool ges lmd process descripto 2684
shared pool ges process array 256000
shared pool ges enqueue max. usage pe 12
shared pool ges reserved msg buffers 1242532
shared pool ges scan queue array 108
shared pool ges resource hash seq tab 8192
shared pool ges resource pools 456
shared pool ges deadlock xid freelist 7040
shared pool ges regular msg buffers 441004
shared pool ges enqueues 1635568
shared pool ges res mastership bucket 3072
shared pool ges resource hash table 221184
shared pool ges ipc instance maps 384
shared pool ges big msg buffers 3979396
shared pool ges resource 1626072
shared pool ges enqueue multiple free 300
shared pool ges lms process descripto 2684
shared pool ges shared global area 22724
select RESOURCE_NAME,
CURRENT_UTILIZATION,
MAX_UTILIZATION
from v$resource_limit
where resource_name like 'g_s\_%' escape '\';
1- La requête suivante permet de trouver la valeur object_id de la table :
select object_id2- Remplacez la valeur de object_id avec votre valeur pour verifier qu'il n'y a aucun global enqueue en rêquetant la table GV$GES_ENQUEUE comme ci-dessous :
from dba_objects
where object_name='GARK'
and OWNER='SYS'
and OBJECT_TYPE='TABLE';
OBJECT_ID
----------------------
11739
select inst_id,Ensuite, effectuez un simple select for update sur tous les noeuds dont vous disposez, vous constaterez que le nombre de global enqueue diffère selon que vous êtes sur le noeud master de la ressource ou non. Utilisez le script ci-dessous sur chacune des instances
substr(resource_name2,instr(resource_name2,',',1,2)+1, 2) CODE,
substr(resource_name2,1, instr(resource_name2,',',1,1)-1) ID1,
substr(resource_name2,instr(resource_name2,',',1,1)+1,
instr(resource_name2,',',1,2)
-instr(resource_name2,',',1,1)-1) ID2,
GRANT_LEVEL,
REQUEST_LEVEL,
STATE,
OWNER_NODE,
BLOCKED,
BLOCKER
from gv$ges_enqueue
where substr(resource_name2,instr(resource_name2,',',1,2)+1, 2)='TM'
and substr(resource_name2,1, instr(resource_name2,',',1,1)-1)
= to_char(11739);
INST_ID CODE ID1 ID2 GRANT_LEVEL REQUEST_LEVEL STATE OWNER_NODE
-------- ---- --------- ---- ----------- ------------- ------ ----------
0 rows selected
select * from sys.garkEntre parenthèses, si vous cherchez la signification des GRANTED_LEVEL, la voici ci-dessous :
where id=1 for update;
select inst_id,
substr(resource_name2,instr(resource_name2,',',1,2)+1, 2) CODE,
substr(resource_name2,1, instr(resource_name2,',',1,1)-1) ID1,
substr(resource_name2,instr(resource_name2,',',1,1)+1,
instr(resource_name2,',',1,2)
-instr(resource_name2,',',1,1)-1) ID2,
GRANT_LEVEL,
REQUEST_LEVEL,
STATE,
OWNER_NODE,
BLOCKED,
BLOCKER
from gv$ges_enqueue
where substr(resource_name2,instr(resource_name2,',',1,2)+1, 2)='TM'
and substr(resource_name2,1, instr(resource_name2,',',1,1)-1)
= to_char(11739);
KJUSERNL : NullEt voilà, vous pouvez également requêter GV$ENQUEUE pour vous persuader que si les Global Enqueues sont distribués, ce n'est pas le cas des enqueues... C'est presque tout ! Ah si : une dernière remarque, contrairement aux autres enqueues "les enqueues transaction (TX) n'ont vraiment de sens que si l'instance sur laquelle la transaction s'effectue est en vie. Pour cette raison, les enqueues TX n'ont pas de global enqueue correspondant"
KJUSERCR : Row-S (SS)
KJUSERCW : Row-X (SX)
KJUSERPR : Share
KJUSERPW : S/Row-X (SSX)
KJUSEREX : Exclusive
Conclusion
Je souhaite que cette série vous ait apportee une vision plus claire du fonctionnement de ces mécanismes internes a RAC et aux bases de données Single instance. Si ça continue à vous intéresser, n'hésitez pas, encore une fois à ouvrir la discussion sur un latch ou un enqueue particulier : J'attends vos commentaires !
-GarK!
Labels:
database,
oracle,
rac,
sql
Links to this post
Julie Kouamo bientôt en France
A voir absolument, le travail de Julie Kouamo sera exposé à Paris dans une semaine. Je vous invite à y passer une heure pour découvrir cette artiste qui vit maintenant à Londres !

Malheureusement, à Ottawa, je ne pourrais pas encore en profiter.
-GarK!

Malheureusement, à Ottawa, je ne pourrais pas encore en profiter.
-GarK!
05 juin 2007
Blogger Tips and Tricks
Avant de parler de sujets plus sérieux, voici auelques trucs utiles à propos de Blogger.com pour améliorer votre (et surtout mon !) utilisation :
-GarK!
- Pour ne plus perdre d'espaces dans l'affichage de SQL*Plus, il faut utiliser la balise <pre> autours du text convenu. Utilisez l'attribut style pour surligner le texte obtenu comme par exemple ci dessous :
xxxx
- Le site suivant : http://blogger-templates.blogspot.com contient plein de trucs pour jouer avec les Templates ou Widgets de blogger. En particulier il explique comment enlever la barre de navigation en haut de votre site ici.
- Enfin le site suivant http://code.google.com/apis/blogger présente tout un ensemble d'API pour manipuler Blogger depuis un client (Java, .Net, Python ou n'importe quel langage capable de dialoguer en HTTP !)
-GarK!
Labels:
web 2.0
Links to this post
04 juin 2007
Firefox #1
Si MS IE est toujours en tête sur le web, depuis toujours vous qui visitez ce blog utilisez en majorité Firefox. Vous trouverez ci-dessous le graphique des browsers web sur ce coin de la toile ce mois ci :

Ce qui est encore plus étonnant dans cette distribution, c'est que si pour FX 80% des utilisateurs fonctionnent en version 2.0+, pour Microsoft IE, moins de 30% utilisent la version 7.0 de l'homme le plus riche du monde.
J'ai bien une explication à tant d'engoument ! Quand vous avez un problème comme par exemple transporter (ou sauvegarder) ses mots de passe enregistrés dans le navigateur, il existe toujours une Plug-In pour effectuer le travail (cf Firefox Password Exporter Add-On)
Voilà, Il faut bien terminez par quelque chose alors si vous faîtes encore parti des quelques pourcent qui utilisent IE, n'hésitez plus, cliquez et téléchargez Firefox :

-GarK!
PS : Pour des statistiques sur le reste de la toile, regardez ici !

Ce qui est encore plus étonnant dans cette distribution, c'est que si pour FX 80% des utilisateurs fonctionnent en version 2.0+, pour Microsoft IE, moins de 30% utilisent la version 7.0 de l'homme le plus riche du monde.
J'ai bien une explication à tant d'engoument ! Quand vous avez un problème comme par exemple transporter (ou sauvegarder) ses mots de passe enregistrés dans le navigateur, il existe toujours une Plug-In pour effectuer le travail (cf Firefox Password Exporter Add-On)
Voilà, Il faut bien terminez par quelque chose alors si vous faîtes encore parti des quelques pourcent qui utilisent IE, n'hésitez plus, cliquez et téléchargez Firefox :

-GarK!
PS : Pour des statistiques sur le reste de la toile, regardez ici !
Labels:
web 2.0
Links to this post
Chuck Lever à propos de NFS4 et OSD
Chuck Lever est l'invité passionant des TechCasts d'OTN ici. En écoutant son podcast, on apprend en particulier les intérêts de NFS4, c'est à dire :
Si ce thème vous intéresse, vous trouverez plus d'info sur parellel FS sur le site du CITI. Le Haifa Research Lab d'IBM présente quant à lui OSD, ses intérêts et des implémentations de référence pour Linux ici. Mais d'abord, passez 10 minutes pour écouter son podcast !
-GarK!
- La possibilité de savoir qui manipule un fichier et ainsi d'adapter le cache et IO du filesystem
- La capacité à déplacer un fichier pendant que celui-ci est accédé par un client
- Avec parallel FS, la possibilité de stocker un fichier sur plusieurs serveurs NFS simultanément
- De nombreuses améliorations en terme d'administration ou de performance
Si ce thème vous intéresse, vous trouverez plus d'info sur parellel FS sur le site du CITI. Le Haifa Research Lab d'IBM présente quant à lui OSD, ses intérêts et des implémentations de référence pour Linux ici. Mais d'abord, passez 10 minutes pour écouter son podcast !
-GarK!
Labels:
linux,
oracle
Links to this post
Latches & Enqueues /*+ 2. Enqueues */
Pourquoi les latches ne suffisent-ils pas ?
Dans un Post précédent nous avons discuté des latches et de leur utilité pour empêcher que plusieurs process (processus ou threads) accèdent simultanément à une structure de la SGA. Les latches ont toutefois beaucoup de limites pour assurer l'utilisation concurrentes de nombreuses opérations d'une base de données et par exemple :
Enqueues : qu'est-ce que c'est ?
Les enqueues sont supportées par des structures mémoires gérées dans la shared pool lorsqu'elles sont nécessaires. La structure mémoire ressemble au schéma ci-dessous :

Les informations que chacune des structures contient sont (de manière non exhaustive) :
Nous discuterons dans un prochain post de comment Oracle utilise certains enqueues en particulier. Retenez simplement ce qui suit :
Si vous n'utilisez pas RAC, les deadlocks sont vérifiés à chaque fois qu'un process utilise un enqueue TM ou TX et devient "waiter" ou "convertors". Dans ce cas, le process parcourt les sessions après lesquelles il attend et celles après qui elles-mêmes attendent et ainsi de suite pour valider qu'il ne fait pas attendre une des sessions après qui lui même attend : c'est à dire qu'il n'y a pas de deadlock
En interne Oracle utilise toujours les enqueues (et latches) dans le même ordre et une seule fois. De cette manière, il n'est théoriquement pas possible (sauf algorithme mathématique erroné) qu'il y ait des deadlocks internes (Ah, si les développeurs faisaient pareils !)
Comment vont vos enqueues ?
De nombreuses vues permettent de suivre l'évolution des enqueues de vos instances :
Conclusion : voulez-vous en savoir plus sur RAC ?
Dans le cas de RAC, les enqueues deviennent "Global Enqueues" et font l'objet d'échanges entre les instances via l'interconnect comme les données des caches. Les enqueues doivent alors, plus encore que dans le cas d'une single instance, faire l'objet d'une attention particulière. Si ça vous intéresse d'en savoir plus sur ce sujet, faites-le savoir et ce pourrait être le sujet d'un prochain Post. Mais cela vous intéresse-t-il ?
-GarK!
Dans un Post précédent nous avons discuté des latches et de leur utilité pour empêcher que plusieurs process (processus ou threads) accèdent simultanément à une structure de la SGA. Les latches ont toutefois beaucoup de limites pour assurer l'utilisation concurrentes de nombreuses opérations d'une base de données et par exemple :
- Quelle serait la CPU utilisée si 10 process attendaient pendant plusieurs secondes un latch ?
- Comment garantir qu'une ressource est utilisée dans l'ordre dans laquelle elle a été demandée ?
- Comment protéger une ressource qui pourrait être utilisée depuis plusieurs noeuds d'un RAC ?
- Comment gérer des règles complexes comme les différents niveaux de verrous ?
- Comment détecter des deadlocks ?
Enqueues : qu'est-ce que c'est ?
Les enqueues sont supportées par des structures mémoires gérées dans la shared pool lorsqu'elles sont nécessaires. La structure mémoire ressemble au schéma ci-dessous :
Les informations que chacune des structures contient sont (de manière non exhaustive) :
- Un identifiant de l'enqueue constitué par son type (e.g. TM, TX, HW), et 2 identifiants ID1 et ID2 qui permettent d'identifier précisémment l'enqueue. Par exemple dans le cas des verrous de tables, ID1 est égal à OBJECT_ID et ID2 est égal à zero. Pour en savoir plus :
- sur les code des enqueues, reportez au manuel de référence d'Oracle 10.2 ou supérieur
- sur la signification des ID1 et ID2 pour certains enqueues à un très ancien document d'Anjo Kolk
- 3 listes ordonnées de sessions (au sens SID de la vue V$SESSION qui peuvent donc être des background process ou des PX). Ces listes indiquent :
- Les propriétaires (owners) de l'enqueue et leur niveau de verrouillage
- Les process en attente (waiters) de l'enqueue et leur niveau de verrouillage
- Les process en attentes de changement (converters) de niveau de verrouillage et le niveau associé
Nous discuterons dans un prochain post de comment Oracle utilise certains enqueues en particulier. Retenez simplement ce qui suit :
- Les structures mémoire des enqueues ne sont allouées que lorsqu'elles sont nécessaires. Par exemple, s'il n'y a pas de verrou sur une table, il n'y a aucun enqueue associé dans la mémoire.
- C'est le process qui utilise un enqueue qui met à jour la structure correspondante avant de manipuler la structure associées éventuellement (e.g. avant d'ajouter les identifiants de transaction dans les blocs modifiés par une nouvelle transaction, le process server créera un enqueue TX, i.e. transaction)
- Pour éviter que plusieurs process manipulent simultanément les structures, les enqueues sont protégés par un ensemble de latches dit "Enqueue Latch Chain"
- Si un process devient waiter d'un enqueue, il sera notifié d'un changement de statut et ne consomme donc pas de CPU. Ce ne serait pas le cas si le process effectuer du pooling de ressource comme dans le cas des latches.
Si vous n'utilisez pas RAC, les deadlocks sont vérifiés à chaque fois qu'un process utilise un enqueue TM ou TX et devient "waiter" ou "convertors". Dans ce cas, le process parcourt les sessions après lesquelles il attend et celles après qui elles-mêmes attendent et ainsi de suite pour valider qu'il ne fait pas attendre une des sessions après qui lui même attend : c'est à dire qu'il n'y a pas de deadlock
En interne Oracle utilise toujours les enqueues (et latches) dans le même ordre et une seule fois. De cette manière, il n'est théoriquement pas possible (sauf algorithme mathématique erroné) qu'il y ait des deadlocks internes (Ah, si les développeurs faisaient pareils !)
Comment vont vos enqueues ?
De nombreuses vues permettent de suivre l'évolution des enqueues de vos instances :
- V$LOCK pour l'ensemble des enqueues de type TX et TM
- V$TRANSACTION_ENQUEUE est la même vue que V$LOCK mais que pour les enqueues TX
- V$LOCKED_OBJECT contient la liste des enqueues TM avec les objets associés et quelques informations sur les sessions associées.
- V$ENQUEUE_LOCK pour les autres types d'enqueues
- DBA_LOCKS, DBA_LOCK_INTERNAL ou DBA_LOCK affichent la liste des verrous ou latch de manière amical (e.g. nom du lock plutôt que les identifiants correspondants)
- DBA_DDL_LOCKS et DBA_DML_LOCKS affichent respectivement les verrous TM et les verrous TX
- DBA_LOCK_ALLOCATED est une table qui permet de visualiser les verrous allour par les utilisateurs pour une gestion plu détaillée et générée avec la procédure DBMS_LOCK.ALLOCATE_UNIQUE
- DBA_WAITERS and DBA_BLOCKERS affichent les sessions qui attendent et celles qui bloquent d'autres sessions. Dans le premier cas, elle présente également le détail des locks associés aux process qui attendent
Conclusion : voulez-vous en savoir plus sur RAC ?
Dans le cas de RAC, les enqueues deviennent "Global Enqueues" et font l'objet d'échanges entre les instances via l'interconnect comme les données des caches. Les enqueues doivent alors, plus encore que dans le cas d'une single instance, faire l'objet d'une attention particulière. Si ça vous intéresse d'en savoir plus sur ce sujet, faites-le savoir et ce pourrait être le sujet d'un prochain Post. Mais cela vous intéresse-t-il ?
-GarK!
Labels:
database,
oracle,
sql
Links to this post
01 juin 2007
Latches & Enqueues /*+ (2-epsilon) Exemple */
Avant d'expliquer ce que sont les enqueues et à quoi ils servent, voici illustré à travers un exemple de quelques lignes qu'Oracle n'est jamais aussi simple que l'on croit a priori. Pour cela, nous allons montrer l'effet d'un verrou de table (Comprenez un TM enqueue).
Pour cette exemple, il ne vous faut pas moins de 4 sessions SQL*Plus et une table que nous créerons avec le script ci-dessous :
Nous utiliserons la 4ème session pour surveiller les locks. Exécutez un script comme celui ci-dessous pour repérer vos sessions :
On notera que les SID des sessions sont : (125, 128, 132, 133). modifiez cette liste avec vos propres valeurs pour la suite du test.
a°) Dans la première session SQL*Plus, verrouiller la table en mode "Row-X" en verrouillant la ligne 1 avec le script ci-dessous :
b°) Effectuez la même opération dans la seconde session SQL*Plus , sur la ligne 2. Vous vérifierez ainsi que 2 verrous "Row-X (SX)" peuvent être posés simultanément sur la même table :
c°) Vérifiez qu'il y a bien des verrous TM posés sur la table GARK à l'aide de la 4° session SQL*Plus :
d°) Dans la première session SQL*Plus tentez maintenant de verrouiller la table en mode exclusif. Utilisez la commande ci-dessous :
La session SQL*Plus ne rend pas la main indiquant que la requête attend pour poser le verrou qu'elle y soit autorisée.
e°) Dans la seconde session SQL*Plus, vous pouvez toujours verouiller une autre ligne :
La requête ayant déjà posé un verrou "Row-X" sur la table n'a plus besoin de poser d'autres verrous
f°) D'ailleurs, si vous vérifiez avec la quatrième session SQL*Plus, vous constaterez que rien dans les verrous n'a changé :
Ou presque... Désormais la session 142 voudrait (request) un verrou de niveau 6 (i.e. exclusive - X). Qu'est-ce que ça change ?
g°) Si une nouvelle session SQL*Plus (la troisième) demande à poser un verrou "Row-X" sur la table, elle est désormais bloquée :
h°) Si vous vérifiez avec la quatrième session SQL*Plus, les verrous, vous constaterez ce qui suit :
La dernière session aimerait avoir un verrou TM Row-X et pourtant elle a un verrou "None" (i.e. 0) seulement positionné. Même si le niveau de verrouillage actuel permettrait à notre troisième session SQL*Plus d'établir un verrou correspondant à ses attentes, le fait qu'une autre session attende d'être augmenté de niveau avant sa demande l'empêche d'obtenir ce verrou.
Nous avons illustré que la base de données Oracle, non seulement trace les niveaux des verrous (et plus généralement des enqueues) mais également les niveaux d'attente supplémentaires des sessions. Nous illustrerons ce point à travers une caractéristique particulière des structures d'enqueue dans le prochain Post.
-GarK!
Pour cette exemple, il ne vous faut pas moins de 4 sessions SQL*Plus et une table que nous créerons avec le script ci-dessous :
create table gark(id number);
insert into gark values (1);
insert into gark values (2);
insert into gark values (3);
insert into gark values (4);commit;
Nous utiliserons la 4ème session pour surveiller les locks. Exécutez un script comme celui ci-dessous pour repérer vos sessions :
SQL> select sid, program from v$session
where username='SYS'
and program like '%sql%'
SID PROGRAM
--- ----------------------------
125 sqlplus@node2 (TNS V1-V3)
128 sqlplus@node2 (TNS V1-V3)
132 sqlplus@node2 (TNS V1-V3)
133 sqlplus@node2 (TNS V1-V3)On notera que les SID des sessions sont : (125, 128, 132, 133). modifiez cette liste avec vos propres valeurs pour la suite du test.
a°) Dans la première session SQL*Plus, verrouiller la table en mode "Row-X" en verrouillant la ligne 1 avec le script ci-dessous :
select * from gark where id=1 for update;b°) Effectuez la même opération dans la seconde session SQL*Plus , sur la ligne 2. Vous vérifierez ainsi que 2 verrous "Row-X (SX)" peuvent être posés simultanément sur la même table :
select * from gark where id=2 /update;c°) Vérifiez qu'il y a bien des verrous TM posés sur la table GARK à l'aide de la 4° session SQL*Plus :
SQL> select sid, type, id1, id2, lmode
from v$lock
where sid in (125, 128, 132, 133);
SID TY ID1 ID2 LMODE
---------- -- ---------- ---------- ----------
132 TM 11739 0 3
128 TM 11739 0 3
128 TX 655383 907 6
132 TX 65573 897 6
SQL> select object_name
from dba_objects
where object_id=11739;
OBJECT_NAME
----------------------------
GARKd°) Dans la première session SQL*Plus tentez maintenant de verrouiller la table en mode exclusif. Utilisez la commande ci-dessous :
lock table gark in exclusive mode;La session SQL*Plus ne rend pas la main indiquant que la requête attend pour poser le verrou qu'elle y soit autorisée.
e°) Dans la seconde session SQL*Plus, vous pouvez toujours verouiller une autre ligne :
select * from gark where id=3 for update;La requête ayant déjà posé un verrou "Row-X" sur la table n'a plus besoin de poser d'autres verrous
f°) D'ailleurs, si vous vérifiez avec la quatrième session SQL*Plus, vous constaterez que rien dans les verrous n'a changé :
SQL> select sid, type, id1, id2, lmode, request
from v$lock
where sid in (125, 128, 132, 133)
SID TY ID1 ID2 LMODE REQUEST
---------- -- ---------- ---------- ---------- ----------
132 TM 11739 0 3 6
128 TM 11739 0 3 0
128 TX 655383 907 6 0
132 TX 65573 897 6 0Ou presque... Désormais la session 142 voudrait (request) un verrou de niveau 6 (i.e. exclusive - X). Qu'est-ce que ça change ?
g°) Si une nouvelle session SQL*Plus (la troisième) demande à poser un verrou "Row-X" sur la table, elle est désormais bloquée :
select * from gark where id=4 for update;h°) Si vous vérifiez avec la quatrième session SQL*Plus, les verrous, vous constaterez ce qui suit :
/
SID TY ID1 ID2 LMODE REQUEST
---------- -- ---------- ---------- ---------- ----------
132 TM 11739 0 3 6
128 TM 11739 0 3 0
133 TM 11739 0 0 3
128 TX 655383 907 6 0
132 TX 65573 897 6 0 La dernière session aimerait avoir un verrou TM Row-X et pourtant elle a un verrou "None" (i.e. 0) seulement positionné. Même si le niveau de verrouillage actuel permettrait à notre troisième session SQL*Plus d'établir un verrou correspondant à ses attentes, le fait qu'une autre session attende d'être augmenté de niveau avant sa demande l'empêche d'obtenir ce verrou.
Nous avons illustré que la base de données Oracle, non seulement trace les niveaux des verrous (et plus généralement des enqueues) mais également les niveaux d'attente supplémentaires des sessions. Nous illustrerons ce point à travers une caractéristique particulière des structures d'enqueue dans le prochain Post.
-GarK!
Labels:
database,
oracle,
sql
Links to this post
Inscription à :
Messages (Atom)