Rechercher sur arkzoyd.com

30 juillet 2007

Le support "Premier" d'Oracle 9i, c'est terminé !

Annoncé depuis longtemps, le support "Premier" d'Oracle 9.2 est terminé le 1er août 2007. Deux possibilités maintenant s'il vous reste des bases de données 9.2 :
Pour tout savoir sur les conditions de support d'Oracle 9i, reportez- vous à ce lien sur oracle.com. et à la note Metalink N°161818.1.

Dans tous les cas rien ne change presque pour l'instant. Quoique : "Effective August 1, 2007 all CPUs and Fixes will be created against the 9.2.0.8 code line."

29 juillet 2007

Nouvelles Souscriptions

J'ai changé l'adresse pour l'abonnement à ce blog. Ce nouveau lien feedburner est compatible avec plus de "news readers" et offre des possibilités avancées de publications :

Cliquez ici pour vous abonner

Si vous n'utilisez pas encore régulièrement de "News Reader", allez faire un tour sur Google Reader ou un autre outils et vous ne pourrez plus vous en passer ! Tous les jours vous pouvez recevoir les dernières nouvelles d'OTN ou juste les news de l'équipe à propos du Rugby en France et ça sans passer des heures à surfer.

Si vous n'êtes pas convaincu, vous pouvez aussi recevoir un e-mail pour chaque Post. Inscrivez simplement votre mail dans la case ci-dessous :

Enter your email address:

Delivered by FeedBurner

28 juillet 2007

Déployez Oracle 10g (et 11g) comme à l'Usine !

Le provisioning pack m'a vraiment enthousiasmé la première fois que je l'ai vu. En fait à l'époque, ses fonctionnalités faisaient partie du Configuration Management Pack mais je m'éparpille. Avec DUPLICATE, j'en crée des bases de données : encore 1,5 TB pas plus tard qu'aujourd'hui. Mais toujours la galère pour installer mon soft préféré, Oracle 10g et bientôt 11g.

Bien sur, j'utilise les installations en mode silent. Mais, vous ne trouvez pas que c'était bien le temps d'Oracle 8i ou un "tar -xvf" installait vos "images" d'Oracle sur tout vos serveurs ? Puis avec 9i est apparut, l'"Inventory" et OPatch qui, c'est vrai, permettent de gérer les configurations plus finement mais au détriment de la simplicité d'installer Oracle 10.2.0.3 plus patch X,Y,Z en moins de 20 minutes... Sauf avec le provisioning pack !

C'est ce que je me pensais jusqu'aujourd'hui et... c'est faux ! L'Annexe B des guides d'installation par plate forme comme par exemple celle de Linux 32bits ou celle de Solaris Sparc 64bits, expliquent en détail comment cloner un ORACLE_HOME ou, si vous préférez, créer ses propres "master" Oracle. Et c'est très simple. En 30 minutes, j'ai fait le tour de la question :
  • Une fois que vous avez réussi à obtenir l'installation de votre master (OS, Version, patchset, patch...), arrêtez tous les services Oracle qui utilisent votre ORACLE_HOME et faites un tar ou un zip de votre répertoire. Vous avez votre master ! Ne prenez pas les fichiers .ora, de $ORACLE_HOME/network/admin, ni les répertoires admin, flash_recovery_area et oradata si vous n'aviez pas positionné ORACLE_BASE comme il faut !
  • Pour l'installer sur un serveur :
    • Poussez et faites l'extraction de votre Master sur votre serveur
    • Positionnez vous dans le répertoire oui/bin de votre master
    • Positionnez les variable ORACLE_HOME et ORACLE_HOME_NAME pour faire l'installation :
      • ORACLE_HOME est votre future répertoire d'installation
      • ORACLE_HOME_NAME doit être unique sur le serveur. Si vous avez déjà d'autre ORACLE_HOME, verifiez avec "opatch lsinventory" les autres ORACLE_HOME_NAME
    • Exécutez le script ci-dessous :
./runInstaller -silent -clone \
ORACLE_HOME="$ORACLE_HOME" \
ORACLE_HOME_NAME="$ORACLE_HOME_NAME"
Remarque :
Il est possible de personnaliser votre installation avec un fichier de réponse en ajoutant l'option -responseFile suivi du nom du fichier avec son chemin complet. Avec un peu de travail, j'imagine que mes problèmes sont terminés pour toujours.

Un dernier point : Je n'ai rien trouvé pour Windows ; j'espère que ça marche aussi ?

27 juillet 2007

1.5TB | rm -rf *

Petit plaisir du matin (Ca faisait longtemps !) :
df -k /oradata
1619143200 1609484184 9659016 100% /oradata
rm -rf /oradata/*/*
df -k /oradata
1619143200 201580 1536693940 1% /oradata
Et voila 1,5TB en fumée sur Mon Linux

Changez de Workspace en 3D - Niveau 2

Excellent ! Looking Glass 3D Desktop (cf mon post précédent) n'a pas pour vocation d'offrir un Window Manager 3D mais un framework pour développer des GUI en 3D. Compiz ou Beryl en revanche montrent vraiment les prémices de ce que pourra être la 3D et l'utilisation d'effets graphiques sous Linux avec Gnome et KDE.

Mes premiers pas avec Compiz ont été très simples et je suis toujours aussi surpris par la facilité avec laquelle on installe des modules sur Ubuntu. Voici une copie d'écran de mon nouveau bureau 3D :


Pour l'installer Compiz, lancez "Synaptic Package Manager" à partir du menu "System" | "Administration", Recherchez ensuite les packages qui contiennent compiz dans leur nom et installez ( Si ce n'est pas déjà fait) :
  • compiz
  • compiz-core
  • compiz-gtk
  • compiz-extra
  • compiz-gnome
  • compiz-plugin
  • gnome-compiz-manager
Une fois que les packages sont installés, vous devez voir apparaitre dans le menu "System" | "Preference" un nouveau menu "GL Desktop". Sélectionnez-le et cochez la case "Enable GL Desktop". Après quelques tests et essais de configuration, (Maintenez appuyées les touches + en utilisant si vous avez configurer la navigation entre les "workspaces" au moyen d'un cube ), vous ne pourrez plus vous en passer !

Changez de Workspace en 3D

Pas de raison que Ubuntu soit en reste, 3D Desktop ajoute un peu d'effet à mon laptop. Inutile ? Juste de montrer que Linux peut avoir un look sexy :


Comme toujours avec Ubuntu, très simple à mettre en place et en quelques minutes. Regardez ici pour plus d'infos. Pour ma part, une fois installé, j'ai utilisé les valeurs suivantes pour configurer mes touches :
#Lance l'éditeur de configuration
gconf-editor

  • /apps/metacity/keybindings_commands (vous pouvez changez les numeros de commandes si celles ci sont déjà utilisées) :
    • command_1 : 3ddesk --gotoleft
    • command_2 : 3ddesk --gotoright
  • /apps/metacity/global_keybindings
    • run_command_1 : <ctrl>Left
    • run_command_2 : <ctrl>Right
"Left" et "Right" signifient respectivement les touches flèches vers la gauche et la droite

Un exemple d'utilisation de INDEX SKIP SCAN

Index Skip Scan ou INDEX_SS, pour ceux qui préfèrent les HINTS, est un algorithme qui permet d'utiliser un index même si la ou les premières colonnes de cet index ne sont pas dans la clause WHERE de votre requête. Vous me direz qu'à la veille de la sortie de 11g, je pourrais parler d'autre chose que des nouveautés de 9i... Il n'empêche que j'ai eu une intéressante conversation à ce propos aujourd'hui et le CBO n'utilisera cet algorithme que si c'est intéressant (selon ses statistiques, entendons nous !). C'est à dire si la cardinalités des première colonnes n'est pas trop élevé. Eh ! Oubliez la dernière phrase que je viens d'écrire ! vous ne pouvez pas décrire avec des règles le comportement du CBO puisque sinon, il s'appèlerait encore RBO !

Le mieux c'est de vous montrer un exemple (Utilisez 9i, 10g ou plus mais pas moins!)

Etape 1 : Créer une table et l'alimenter
create table gark(a number,
b number);

begin
for i in 1..50000 loop
insert into t1 values
(mod(i,10),i);
end loop;
commit;
end;
/

create index gark_idx on gark(a,b);

exec dbms_stats.gather_table_stats(user ,-
'GARK', cascade=>true, -
method_opt=>'FOR ALL COLUMNS SIZE 254');

Etape 2 : Constater que l'index peut être utilisé
set autotrace traceonly explain
select * from gark
where b=56 -- b est la seconde colonne de l'index
;
Execution Plan
----------------------------------------------------------
Plan hash value: 4099952983

------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 1 |
|* 1 | INDEX SKIP SCAN | GARK_IDX | 1 | 26 | 1 |
------------------------------------------------------------

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

1 - access("B"=56)
filter("B"=56)
Etape 3 : Nettoyer
drop table gark;
En même temps, j'en suis réduit à publier des choses à propos de 9i et 10 g puisque la 11g n'est toujours pas là et comme de toute façon tout le monde est en vacances (sauf moi), on s'en fout !

25 juillet 2007

Pas encore sur Linux ? Utiliser MSIE sous Linux...

Une des raisons principales de ne pas passer à Linux, c'est encore tous les sites internes de votre multi-nationale qui ne fonctionnent qu'avec MSIE - en fait IE 6 parce que 7 ça demande trop de trucs à ré-écrire. La magie de Microsoft sans doute ? Voilà mon problème d'hier : ActiveX, je vous hais ! Impossible d'accéder au site web de mon client ! Jusqu'à ce que mon "ami" l'expert de MySQL m'explique gentillement que j'étais un âne et que MS IE fonctionne bien avec Linux à condition d'avoir payé sa licence Windows. Ce qui est mon cas même si je ne l'utilise pas !


Grâce à IE4Linux, MSIE fonctionne sous Linux sans Virtuelle Machine. Si vous utilisez Ubuntu, ça prend vraiment 5 minutes à faire. Alors plus d'hésitation, il est tant de mettre à la poubelle votre CD Windows (Gardez la licence !) et de tourner la page définitivement.

-Grégory!

PS : Oracle Web Conferencing a failli fonctionner mais, en plus d'utiliser un ActiveX, ça utilise une Applet Java... Quelqu'un a-t-il une idée ?
PPS : Il restera toujours une bonne raison de rester sous Windows mais il y a sans doute encore plus de bonne raison de le quitter, non ?

24 juillet 2007

OOM Killer, Profession : Nettoyeur !

"OOM Killer", c'est le Victor de Linux. Quand ça va trop mal et que le système est "Out Of Memory", cette partie particulière du noyau se met à tirer dans tous les sens des "kill -9". Par design les process qu'il tue sont choisis de manière aléatoire. Il y a quelques jours, OOM Killer c'est occupé d'un de nos process ocssd. Devinez : le serveur à rebooté !

Si vous n'avez qu'Oracle sur votre serveur, ça ne doit pas vous arriver puisque la mémoire est fixée, à quelques exceptions prêt -c'est une autre histoire-, par SGA_TARGET et PGA_AGREGATE_TARGET en 9i ou 10g. Attention quand vous ajoutez une instance ou modifiez un de ces paramètres.

J'avais déjà rencontré quelque chose comme ça sur Aix, maintenant ça fait deux ! Quelqu'un sait-il comment Windows réagit quand il devient OOM ?

-Grégory!

Quand les problèmes commencent... /*+ Part 2 */

J'ai commencé une série de Posts à propos des pires bêtises que je peux faire avec l'espoir que mon second post viendrait le plus tard possible... J'ai bien peur que le jour de ce second post soit arrivé ! Celui-ci aurait pu s'intituler comment être plus intelligent que tous le monde, "dans la précipitation". Bon, commençons par poser le décors ; "urgence", il faut récupérer une table 7 jours en arrière !

Merci on fait des exports réguliers de nos bases de données; Ils sont compressés avec gzip. Comme vous le savez, il est possible de décompresser et importer en même temps, avec GZIP, ça donne quelque chose comme ça:,
mknod imp_pipe p
gunzip -c myexport.dmp >imp_pipe
imp newuser file=imp_pipe \
fromuser=orig_user tables=(mytab) \
log=import.log
C'est ce que j'ai fait, du moins je croyais, jusqu'à ce que je réalise que j'avais tapé ma seconde commande comme ceci :
gunzip -c >myexport.dmp >imp_pipe
Le reste de ma journée a été assez pénible comme vous pouvez l'imaginer. Merci logMiner pour m'en avoir sorti sans trop de soucis...

-Grégory

PS : Bonne résolution de la journée : "Ne pas écrire le post 3 avant au minimum 1 mois !"

23 juillet 2007

Niveaux d'isolation de MySQL (pour DBA Oracle)

J'ai eu aujourd'hui une discussion plus qu'instructive avec mon "ami" de MySQL. Il faut dire que je fais maintenant le pitre avec MySQL aussi pendant que lui, apprend Oracle ! Enfin, si je peux générer un peu de revenu pour Oracle : j'utilise uniquement InnoDB...

Voilà comment ça commence : "Il ne comprend pas que les données validées par un commit sont accessibles des autres transactions en cours ; l'isolation des transactions n'est pas respecté avec Oracle [sic]". Pour ceux qui me connaissent, je vous laisse imaginer comment ce genre de trucs me tue.

Par défaut, le niveau d'isolation d'Oracle est READ COMMITED qui signifie justement ce qui est validé par un commit est lu des autres sessions, même si elles ont une transaction en cours. REPEATABLE READ est le niveau d'isolation par défaut de MySQL et... Ça n'existe pas dans Oracle ! Avant que vous ne vous mettiez à rigoler, c'est parce que ce niveau autorise les lignes fantômes qu'Oracle ne le supporte pas. Tom Kyte l'explique 1000 fois que moi les différents niveaux d'isolation et ce n'est pas le sujet de ce post. Et pourtant...

Alors si REPEATABLE READ "sucks", pourquoi MySQL/InnoDB a-t-il ce niveau par défaut ? Parce que InnoDB ne laisse pas apparaître de lignes fantômes en READ COMMITED dans la majorité des cas ! merci à l'algorithme dit "Next-Key Locking" qui verrouille visiblement tous les plages de valeurs parcourues, y compris avant la première valeur et après la dernière valeur, sur les index (ou les tables s'il s'agit d'un table scan). J'avoue que la page qui décrit le fonctionnement me laisse perplexe... Ça ressemble à un niveau SERIALIZABLE (même si j'ai bien compris que le niveau SERIALIZABLE de MySQL est carrément inutilisable à plus d'un utilisateur concurrent) avec une faiblesse quand même.

Ne nous arrêtons pas là, tout ça donne plein d'exemples très intéressants ! Evidemment pour limiter ces effets, MySQL vient aussi par défaut avec autocommit=on ;).

Etape 1 : Créer une table et des index pour MySQL

Avant tout, créer un utilisateur pour faire des tests sous MySQL :
mysql -u root -p
mysql> create user scott identified by 'tiger';
mysql> create database users;
mysql> grant all on users.* to scott;
mysql> exit;
Ensuite, créer une table et quelques index :
mysql -u scott -p -D users

create table gark(a int, b int, c int)
engine innodb;
create unique index gark_a_uk on gark(a);
create index gark_b_idx on gark(b);
insert into gark(a,b,c) values (1,1,10);
insert into gark(a,b,c) values (2,2,9);
insert into gark(a,b,c) values (3,1,8);
insert into gark(a,b,c) values (4,2,7);
insert into gark(a,b,c) values (5,1,6);
insert into gark(a,b,c) values (6,2,5);
insert into gark(a,b,c) values (7,1,4);
insert into gark(a,b,c) values (8,2,3);
insert into gark(a,b,c) values (9,1,2);
insert into gark(a,b,c) values (10,2,1);
[Pas besoin de commit ;0 ; vous êtes en autocommit=on !]
Etape 2 : Créer les mêmes structures sous Oracle XE (gratuit et disponible pour Linux Ubuntu) :

Les structures sont semblables à celles créées dans MySQL :
sqlplus scott
create table gark(a number,b number,c number);
create unique index gark_a_uk on gark(a);
create index gark_b_idx on gark(b);
insert into gark(a,b,c) values (1,1,10);
insert into gark(a,b,c) values (2,2,9);
insert into gark(a,b,c) values (3,1,8);
insert into gark(a,b,c) values (4,2,7);
insert into gark(a,b,c) values (5,1,6);
insert into gark(a,b,c) values (6,2,5);
insert into gark(a,b,c) values (7,1,4);
insert into gark(a,b,c) values (8,2,3);
insert into gark(a,b,c) values (9,1,2);
insert into gark(a,b,c) values (10,2,1);
commit;
Etape 3 : Update de la 5eme valeur d'une colonne non indexée dans MySQL en REPEATABLE READ :

Ouvrez 2 sessions sur MySQL ; Les tests qui suivent ont été réalisés avec MySQL Beta 5.1.20 sur Linux, mais j'imagine que ça n'a pas beaucoup d'importance :

1ère session :

mysql -u scott -p -D users
set autocommit=off;
select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
select * from gark where c=5 for update;
+------+------+------+
| a | b | c |
+------+------+------+
| 6 | 2 | 5 |
+------+------+------+

2ème session (pas la peine de se mettre en autocommit off) :
mysql -u scott -p -D users
select * from gark where c=3 for update;
[un peu de patience...]
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
[Remarquez que les "waits" sur les verrous sont limités dans le temps par défaut...On comprend bien pourquoi]
Ça n'arrive pas si la colonne dans la clause where est indexée. Nous verrons plus tard que même dans le cas de colonnes indexées, ça a un impact. mais avant...

1ère session :
rollback;

Etape 4 : Le même test sous Oracle en niveau d'isolation SERIALIZABLE

1ère session :
sqlplus scott
set transaction isolation level serializable;
select * from gark where c=5 for update;
A B C
---------- ---------- ----------
6 2 5
2ème session :
sqlplus scott
set transaction isolation level serializable;
select * from gark where c=5 for update;
A B C
---------- ---------- ----------
8 2 3
Un commentaire particulier ?

1ère session :
rollback;
2ème session :
rollback;
Etape 5 : Update d'une ligne avec un index non-unique dans MySQL

Toujours en "repeatable read", nous allons maintenant utiliser une colonne indexée dans la clause where puisque semble-t-il il le faut :

1ère session :

mysql -u scott -p -D users
set autocommit=off;
select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
select * from gark where b=2 for update;
+------+------+------+
| a | b | c |
+------+------+------+
| 2 | 2 | 9 |
| 4 | 2 | 7 |
| 6 | 2 | 5 |
| 8 | 2 | 3 |
| 10 | 2 | 1 |
+------+------+------+

2ème session (pas la peine de se mettre en autocommit off) :
mysql -u scott -p -D users
insert into gark values (11,2,0);
[un peu de patience...]
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Ici, la colonne dans la clause where est indexée. Imaginons que je veuille créer un "batch" qui prenne les valeurs dans une table et pour les traiter avant de les supprimer. Je suppose que la bonne façon, c'est de les sélectionner ensuite sur la clé primaire ou unique "for update"... Avant de continuer :

1ère session :
rollback;
Etape 6 : Même test avec Oracle XE en niveau d'isolation SERIALIZABLE

1ère session :
sqlplus scott
set transaction isolation level serializable;
select * from gark where b=2 for update;
A B C
---------- ---------- ----------
2 2 9
4 2 7
6 2 5
8 2 3
10 2 1
2ème session :
sqlplus scott
set transaction isolation level serializable;
insert into gark values (11,2,0);
commit;
1ère session :
select * from gark where b=2 for update;
A B C
---------- ---------- ----------
2 2 9
4 2 7
6 2 5
8 2 3
10 2 1
Toujours rien à ajouter ?

1ère session :
rollback;
2ème session :
rollback;

Etape 7 : Update d'un ensemble de lignes avec un index unique dans MySQL

Toujours en "repeatable read", nous allons maintenant utiliser une colonne avec un index unique puisqu'il semble que ce soit la solution :

1ère session :

mysql -u scott -p -D users
set autocommit=off;
delete from gark where a=5;
commit;
select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
select * from gark
where a<=8 for update;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 1 | 10 |
| 2 | 2 | 9 |
| 3 | 1 | 8 |
| 4 | 2 | 7 |
| 6 | 2 | 5 |
| 7 | 1 | 4 |
| 8 | 2 | 3 |
+------+------+------+
2ème session (pas la peine de se mettre en autocommit off) :
mysql -u scott -p -D users
insert into gark values (5,1,6);
[un peu de patience...]
ERROR 1205 (HY000): Lock wait timeout exceeded;
try restarting transaction
Ici, la colonne dans la clause where est indexée avec un index unique. Avant de continuer :

1ère session :
rollback;
Etape 8 : Même test avec Oracle XE en niveau d'isolation SERIALIZABLE

1ère session :
sqlplus scott
delete from gark where a=5;
commit;
set transaction isolation level serializable;
select * from gark
where a<=8 for update;
A B C
---------- ---------- ----------
1 1 10
2 2 9
3 1 8
4 2 7
6 2 5
7 1 4
8 2 3
2ème session :
sqlplus scott
set transaction isolation level serializable;
insert into gark values (5,1,6);
commit;
1ère session :
select * from gark
where a<=8 for update;
A B C
---------- ---------- ----------
1 1 10
2 2 9
3 1 8
4 2 7
6 2 5
7 1 4
8 2 3
1ère session :
rollback;
2ème session :
rollback;
Etape 9 : En fait, Oracle ne fonctionne peut-être pas ?

L'objectif de MySQL a travers ce fonctionnement est d'empêcher les clés duplicate. Voyons comment Oracle se comporte si on essaye d'insérer 2 fois la même clé... Juste pour vérifier qu'Oracle fonctionne correctement et n'est pas juste trop optimiste

1ère session :
sqlplus scott
set transaction isolation level serializable;
insert into gark values (12,2,-2);
2ème session :
sqlplus scott
set transaction isolation level serializable;
insert into gark values (12,2,-2);
[Maintenant j'attends... et avec Oracle, ce risque de durer longtemps]
1ère possibilité : rollback de la 1ère session, 2ème session :
1 row created.
2ème possibilité : commit de la 1ère session, 2ème session :
insert into gark values (12,2,-2)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.GARK_A_UK) violated

[Et pourtant... dans la même session...]
select * from gark where a=12;

no rows selected
Etape 10 : Jusque maintenant tout allait bien pour MySQL

Bon, tout ça c'est bien mais revenons au début de nos réflexions... REPEATABLE READ, "it sucks" avec un exemple très simple qui illustre ce qui peut vous arriver si vous utiliser ce niveau d'isolation :Session 2 (On crée une seconde table dans InnoDB avec un Index) :
set autocommit=on;
create table gark2(a int)
engine innodb;
create unique index
select * from gark2;

[on est d'accord, il n'y a rien dans la table]
Empty Set (0.00 sec)
Session 1 :
rollback;
set autocommit=off;
select a from gark where a=1 for update;
+------+
| a |
+------+
| 1 |
+------+
[on est d'accord, la transaction a bien commencé]
Session 2 :
insert into gark2 values(1);
[Pas besoin de faire de commit puisqu'on est en autocommit]
Session 1 :
select a from gark2 where a=1 for update;
+------+
| a |
+------+
| 1 |
+------+
[on est d'accord, cette valeur n'existait pas quand la transaction a commencé.
Autrement dit, vous pouvez voir les lignes insérées par d'autres transactions]
Bon, je résume... MySQL formatte les lignes beaucoup mieux qu'Oracle, on est d'accord ? Je vous laisse réfléchir au niveaux d'isolation des transactions dans Oracle et MySQL. Et si vous êtes un fanatique de MySQL, je vous confirme que je suis plutôt agréablement surpris et que dans ce genre de cas, DB2 est bien pire ! Bon je retourne vois ce qu'il a dans le ventre...

-Grégory

Au fait :
  • Vous pouvez utiliser "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE" dans le corps d'une procédure ou d'une fonction
  • Oracle a un autre niveau d'isolation dit READ-ONLY et depuis 10g vous pouvez simplement utiliser une commande comme celle-ci (A condition d'avoir bien dimensionné vos UNDO - Plus à venir en 11g):
select * from my_table
as of timestamp
to_timespamp('22/07/2007 17:12:00',
'DD/MM/YYYY HH24:MI:SS');

22 juillet 2007

Synergy : le Grid fait son entrée sur votre bureau

Synergy est un utilitaire qui permet de partager la souris, le clavier et les Copier/Coller entre plusieurs machines, quelque soit leur OS (Windows, Mac, Linux...). Avec Synergy, vous pouvez travailler sur toutes vos machines comme si vou n'en aviez qu'une . Voici une demo qui partage vos ecrans Ubuntu et Windows Vista.

Maintenant la bonne nouvelle : il est aussi possible de partager le serveur X Ubuntu de mon desktop et celui de mon laptop, aussi sur Ubuntu !

Installer Synergy sur Ubuntu

Lancez le menu "System -> Administration -> Synaptic Package Manager". Recherchez le package "synergy" et installez-le

Configurer le Serveur Synergy

Le serveur Synergy est la machine à partir de laquelle vous allez utiliser le clavier et la souris. Sur cette machine il faut configurer un serveur synergy. Pour cela, créez un fichier de configuration (e.g /etc/synergy.conf) qui ressemble a ce qui suit :
section: screens
arkzoyd:
kilian:
end
section: links
arkzoyd:
right = kilian
kilian:
left = arkzoyd
end
Dans cet exemple, kilian et arkzoyd sont mes 2 machines et leurs adresses IP sont toutes les deux résolues par le DNS (ou /etc/hosts). Il suffit de remplacer les nom ci-dessus par les noms (ou adresses IP) de vos machines.

Démarrer le serveur Synergy.

Sur la machine dont vous allez utiliser Clavier et souris, lancez la commande ci-dessous :
nohup synergys -f --config /etc/synergy.conf >synergys.log 2>&1 &
Démarrer les clients Synergy.

Sur la ou les autres machines, démarrez les clients Synergy avec la commande ci-dessous (remplacez arkzoyd par le nom de votre serveur Synergy) :
nohup synergyc -f arkzoyd >synergyc.log 2>&1 &

Et voilà ce n'est pas du RAC mais c'est le début du Grid, non ? Votre souris et votre clavier se balade entre vos écrans.

-Grégory

20 juillet 2007

Mot de passe root et MySQL...

Il est recommandé de changer le mot de passe de l'utilisateur "root" de MySQL après l'installation. Je ne sais pas si vous remarquez : ça laisse une trace sur votre système et j'ai essayé mais il ne semble pas possible de changer le mot de passe avec mysqladmin sans taper le mot de passe dans la ligne de commande avec 5.1 :
mysqladmin -u root -h localhost \
--password=root password root
mysqladmin -u root -h <hostname> \
--password=root password root
L'autre idée, c'est d'utiliser la commande grant comme ci-dessous :
mysql -u root -p
grant all on *.* to root@localhost
identified by 'root';
Bon le problème c'est que ça laisse une trace dans un autre fichier... .mysql_history de votre utilisateur. Pas de problème, vous pouvez simplement le fichier en espérant que personne ne supervise ce fichier. La bonne nouvelle c'est qu'il faut être administrateur car les droit sur ce fichier sont -rw------- !

La dernière idée, c'est de saisir directement la forme HASH du mot de passe et ainsi d'être plus malin que tout le monde. Pour cela, sur votre machine, tapez :
select password('root');
+-------------------------------------------+
| password('root') |
+-------------------------------------------+
| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+-------------------------------------------+
Sur l'autre machine tapez :
grant all on *.* to root@localhost
identified by password '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B';
Vous me direz, c'est grâce à des idées toujours aussi brillantes qu'il m'arrive ce genre de truc :

J'ai perdu le mot de passe root de MySQL !

Il va falloir arrêter le serveur et le redémarrer. Bien sur, je ne peux pas l'arrêter puisqu'il me faut le mot de passe ! Heureusement, j'ai ma commande magique que je vous recommande de ne *JAMAIS
* utiliser :
ps -ef |grep mysqld| \
awk '{print "kill -9",$2 }'|sh

Une fois que MySQL est arrêté :
  • Redémarrez-le avec l'option "--skip-grant-tables" (Assurez vous que personne ne pourra se connecter pendant cette opération) :
 ./bin/safe_mysqld --skip-grant-tables \
--user=mysql &

  • Connectez-vous avec mysql sous root. Aucun mot de passe est demandé :
mysql -u root@localhost

  • Chargez le dictionnaire avec mysqladmin. Tant que ça n'est pas fait, impossible de changez le mot de passe dans votre session mysql :
mysqladmin flush-privileges

  • Voila, vous pouvez changez le mot de passe de root@localhost depuis votre session mysql :
grant all on *.* to root@localhost
identified by password '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B';
  • Le problème, c'est que comme vous avez lancer safe_mysqld avec l'option skip-grant-tables, si mysqld est tué, il sera redémarré sans mot de passe. Il faut donc arrêter et redémarrer une seconde fois
./bin/mysqladmin -u root -p shutdown
./bin/safe_mysqld --user=mysql &
Bon... J'ai copié le mot de passe du serveur sous mon clavier. Cette fois, je n'aurais plus de problème ! Peut-être que je ne devrais plus utiliser MySQL ?

-Grégory!

15 juillet 2007

Règlement de comptes sur fond de 10g !

J'adore ! Inutile de dire à quel point j'acquiesce à la lecture de ce post de Jonathan Lewis et du commentaire associé. La valeur par défaut minimal du log_buffer est de 2M en 10g. En fait, ça dépend entre autre de CPU_COUNT, de l'utilisation ou non d'ASM... Et il est très improbable, même avec des paramètres cachés que vous arriviez à descendre en dessous !

La copie de rapport Statspack présente donc très improbablement le problème décrit. Ça vous surprend ?

-GarK!

PS: Si vous arrivez à descendre la valeur de log_buffer sous 2M en 10.2, je suis intéressé !

12 juillet 2007

A quand une Price List Oracle 11g ?

Oracle perdrait-il la main ? Plein d'options ont été annoncées :
  • Real Application Testing
  • Total Recall
  • ...
Et elles ne sont pas encore (11 Juillet 2007 à 23H, heure de New York) dans la liste de prix. Et si j'avais envie de m'en payer une moi ? Aujourd'hui !

-GarK!

Oracle 11g DirectNFS

DirectNFS, ou autrement dit, Oracle11g est lui même le client NFS. Quel intérêt ? Oracle ne passe plus par les librairies NFS du système d'exploitation et NFS fonctionne désormais avec Windows. Voici un white-paper à lire absolument !
  • Comme ils disent : "Through this integration, Oracle is able to optimize the I/O path between Oracle and the NFS server providing significantly superior performance.
    • It bypasses any operating system level caches and eliminates any operating system write-ordering locks.
    • Direct NFS Client performs asynchronous I/O
    • Oracle Direct NFS Client currently supports up to 4 parallel network paths to provide scalability and high availability. There is no need to configure bonded network interfaces"
  • Contrairement à ASM (Pour l'instant ?), "These files are also accessible via the operating system kernel NFS client thereby allowing seamless administration."
Je n'arrive pas à savoir si ça permet de faire du RAC sur un serveur NFS qui n'était pas certifié en 10g. Quelqu'un a-t-il une idée ?

-GarK!

11 juillet 2007

Peut-on publier ses tests à propos de 11g ?

"Growing the Grid" et "11g". Maintenant c'est sûr, voilà le slogan et le nom de la nouvelle version d'Oracle Database qui sera disponible en août sur Linux. Beaucoup de fonctionnalités ont été annoncées par Charles Philips, Chuck Roswat et Andy Mendelson et plusieurs clients comme Yahoo!. Pour en savoir plus, regardez ici :
Maintenant, la question, c'est : "Peut on publier ses tests à propos de 11g Beta ?". Probablement pas qu'est-ce que vous en pensez ? Il va falloir attendre avant d'avoir des exemples d'utilisation.

-GarK!

07 juillet 2007

Huge Pages et Oracle 10g

Si vous utilisez Linux 64 bits (RHEL 3, 4 ou Oracle EL 4, par exemple) et Oracle 10g, vous pouvez bénéficier facilement des Huge Pages et donc d'une meilleure utilisation de la mémoire ou du fait que la SGA ne sera jamais mis en swap. Encore faut-il que votre système soit correctement configuré :
  • Le système doit être paramétré pour que la SGA puisse être formée d'un seul bloc.
    • Le paramètre shmmax (cf /etc/sysctl.conf) doit être plus élevé que la taille de la SGA, y compris la "Fixed Size". Regardez la valeur au démarrage de votre instance.
    • Le paramètre memlock (cf /etc/security/limit.conf) pour les valeurs soft et hard et pour l'utilisateur oracle ou le propriétaire du logiciel, s'il est différent, doit permettre également d'allouer l'ensemble de cette mémoire
  • L'utilisateur oracle doit être paramétré pour pouvoir utiliser les Huge Pages, c'est à dire :
    • Le paramètre vm.hugetlb_shm_group (cf /etc/sysctl.conf) doit contenir un identifiant d'un groupe auquel appartient Oracle.
    • Le paramètre vm.nr_hugepages doit avoir une valeur suffisamment élevée pour que la SGA y soit inclue. Attention il s'agit d'un nombre de pages, exécutez "cat /proc/meminfo" pour connaître la taille des pages.
Pour vérifier que ça fonctionne correctement, vous pouvez utilisez "ipcs -m", après avoir redémarré votre instance. les droits sur les Huge Pages sont 600 et non pas 640 ! Vous pouvez également exécuter "cat /proc/meminfo |grep Huge". Si ça ne marche pas, vérifiez que les paramètres sont bien positionnés avec "sysctl -p" ou avec "cat /proc/sys/vm/nr_hugepages" et "cat /proc/sys/vm/hugetlb_shm_group"

Une dernière remarque, les paramètres système pour les utilisateurs sont hérités lors de votre connexion. Reconnectez vous bien à l'utilisateur système oracle après avoir changés vos paramètres.

-GarK!

Pour écrire les accents avec un clavier US

Quand le correcteur orthographique ne vous permet plus de mettre les accents avec votre clavier US, ce tableau regroupe les codes HTML utiles pour écrire en français... Si vous utilisez Firefox, ouvrez-le dans votre sidebar.

Notez aussi qu'avec FF2, vous pouvez "bookmark"er la page et en éditant les propriétés de votre bookmark, sélectionner la boîte à cocher "Load This Bookmark in the Sidebar" pour retrouver facilement la lettre qu'il vous faut !

Le "Copier/Coller" sera alors salvateur pour mettre des accents où vous voulez.

GarK!

Quand les problèmes commencent... /*+ Part 1 */

J'ai décidé de raconter mes expériences pour illustrer le fait que préparer et s'entraîner est le meilleur moyen de réussir une opération quand il s'agit d'intervenir sur Oracle. Ce qui suit et, les moins nombreux possibles, posts qui suivront sur ce thème, raconteront ces histoires où , j'aurais mieux fait de ne pas me lever ou, au moins, laisser quelqu'un d'autres faire le travail. Je ne suis donc pas très fier de ce qui suit mais, au moins, je ne ferai plus jamais ça !

27 heures debout...

Je suppose que le titre explique tout et pourtant, ce n'est pas la cause mais plutôt la conséquence de mes problèmes. La vrai cause serait plutôt de réaliser un job qu'un autre avait préparé et que j'étais loin de maitriser. Enfin, ça commençait par une intervention à 3h15 du matin (la base est dans un autre fuseau horaire) et je suis debout depuis 20h15 environ : export d'une base et import sur une autre machine (facile ? 3 heures maximum ?) . Je ne vous raconte pas ce qui tourne autour de la base et auquel je ne comprends rien... J'aurais du me méfier
  • Erreur #1, ils modifient la base d'origine avant l'export
Pourquoi, j'en sais toujours rien mais il faut supprimer une file d'attente AQ avant d'exporter les données. La conséquence je la paierai plus tard quand je cherche les droits positionnés sur la nouvelle base
  • Erreur #2, ne pas vérifier que les utilisateurs et rôles sont crées dans la base avant de lancer l'import
La base, les utilisateurs et rôles étaient créés pourquoi j'aurais du vérifier ? 4h18 du mat... L'import part en vrille...
  • Erreur #3, mes sessions ssh sur la base d'import et l'import ne veut pas s'arrêter au crtl-C
Je me dépêche de rediriger mes sessions de la base d'import sur la cible et kill -9 de gunzip qui alimente le pipe ! terminer. Je relance ! et pourtant j'utilise toujours nohup d'habitude :
mknod imp_pipe p
nohup gunzip < exp.dmp.gz > imp_pipe &
  • Erreur #4, ne pas faire une copie des privilèges.
C'est le même problème que pour l'erreur 2 sauf que, en plus, les privilèges associées aux objets supprimés ont disparu. Merci d'avoir les procédures invalides pour m'aider.
  • Erreur #5, la pire ! 7H30, j'ai supposé...
Comme prévu dans la checklist, je demande à ce qu'on change le réseau. C'est le milieu de la nuit chez eux ! Quelqu'un me contacte :
lui : "Qu'est ce que je dois faire ?"
moi : "La base X est migrée, change le réseau !"
lui : "Qu'est ce que je dois changer ?"
moi : "(blanc) !"
On m'a dit de changer, on m'a jamais dit quoi et j'ai supposé que le types gens du réseau savaient ! J'aurais dû savoir !
  • Erreur #6, je n'ai pas le mot de passe
Avant de redémarrer l'application, j'informe mon interlocuteur que j'ai du recréer un utilisateur et que je n'ai pas le mot de passe, l'application n'arrivera pas à se connecter... Lui non plus ! Merci le mecanisme de HASH des mots de passe d'Oracle 10g (Ca risque d'etre différent en 11g, quoique j'en sais rien)
sur la base d'export :
select username, password
from dba_users
where username='&username';

sur la base d'import :
alter user &username
identified by values '&passwd_hash';

  • Erreur #7, 11H... tout à l'air bien; les clients sont connectés depuis un moment !
Quelqu'un : la base est en noarchivelog
moi : ...
C'est la que j'ai appris que "to bounce", signifie aussi arrêter et redémarrer une base de données. et que ca pouvait prendre de très longues secondes de faire un "shutdown immediate" même après un "startup exclusive open force". Là, j'avoue, ça a été ma pire journée depuis longtemps et le pire c'est que c'est de ma faute. Et c'est pas fini...

Oracle 10g sur Windows...

J'installe Oracle (10g) sous Windows dans un nouvel Oracle Home sur un serveur qui sert aussi de serveur web (IIS) et bien croyez-le ou non, ça flingue les connexions d'IIS à sa base de données Oracle. Et pas à cause de la registry non ! À cause de la variable d'environnement PATH qui est change par l'installer de la 10g

Finalement, ça c'est bien terminé... Je suis allé me coucher !

-GarK!

01 juillet 2007

Installation "silent" d'Oracle 10g

Entre moi et les serveurs Oracle.... 1, 2 ou 3 rebonds par SSH et parfois avec impossibilité d'utiliser le forwarding X11. Un moyen simple pour s'en sortir ? Effectuer les installations en mode silencieux. Plus de détails maintenant... Cette procédure vous permet également d'enchainer les installations et créations de bases de données comme à l'usine ! Pour plus d'informations sur cette procédure, utilisez le document suivant Oracle® Database Installation Guide - Appendix A Installing and Configuring Oracle Database Using Response Files pour votre plateforme (ici Linux).

1. Distribution Oracle et pré-requis

Il faut que la distribution Oracle soit accessible depuis votre serveur quelque soit le moyen (CD, NFS, scp et Unzip) pour l'installer. C'est évident mais ça va mieux en le disant ! Pour information, le Grid Control 10g utilise wget pour réaliser cette opération (une bonne idée si vous voulez scripter les installations la nuit et utiliser des proxy pour passer a travers les DMZ )

Avant d'installer votre base de donnees, il faut egalement que l'ensemble des pré-requis comme la création des utilisateurs et groupes, les paramètres kernel, les packages ou patchs OS, les droits... soient mis en place. Reportez-vous au document "Oracle® Database Installation Guide" de votre système et à la note Metalink 169706.1 pour plus d'informations

2. Créez le fichier oraInst.loc s'il n'existe pas

Le fichier oraInst.loc permet à l'installer de trouver l'Inventory Oracle. Il contient 2 informations qui sont l'endroit ou est situé l'inventory (inventory_loc) et le groupe auquel il appartient (inst_group). Sous Linux, ce fichier est dans le répertoire /etc, sous Solaris dans /var/opt/oracle et sous Windows, il s'agit en fait de la variable de registre [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\inst_loc]. S'il n'existe pas, c'est sans doute le premier logiciel 10g que vous installez sur votre serveur. Pour le créer, choisissez un répertoire pour l'inventory. Si vous décidez d'utiliser OFA nous supposerons que :
  • ORACLE_BASE est /u01/app/oracle
  • oinstall est le groupe d'installation d'Oracle
  • Le propriétaire et le groupe de /u01/app/oracle sont oracle et oinstall
  • Les droits sur /u01/app/oracle et sont contenu sont 755
Voici un exemple de script pour créer ce fichier
su -
if [-f "/etc/oraInst.loc"]; then
echo "inventory_loc=/u01/app/oracle/oraInventory" >/etc/oraInst.loc
echo "inst_group=oinstall" >>/etc/oraInst.loc
chmod 664 oraInst.loc
fi
3. Copier et les fichiers de réponses

Les fichiers de réponses exemple sont situés avec le logiciel dans le répertoire response. Copier ou les fichiers correspondant à votre besoin dans un autre endroit pour les modifier ensuite. Voici une description des fichiers :
  • standard.rsp est le fichier de réponse pour installer Oracle 10g Standard Edition ou SE One dans la mesure ou il s'agit du même logiciel)
  • enterprise.rsp est le fichier de réponse pour installer Oracle 10g Enterprise Edition
  • custom.rsp est le fichier de réponse pour installer Oracle 10g en selectionnant les composants de manière détaillées.
  • netca.rsp est le fichier de réponse pour créer les listeners et alias TNS
  • emca.rsp est le fichier de réponse pour Installer et paramétrer Enterprise Manager Database Control
  • dbca.rsp est le fichier de réponse pour créer une base de données
4. Modifier le fichier de réponses de l'installation du logiciel

Le contenu du fichier est relativement explicite. Editez le et modifiez les variables pour correspondre a vos besoins. Par exemple pour le fichier enterprise.rsp, il suffit de fixer les valeur ci-dessous :
  • UNIX_GROUP_NAME="oinstall" indique que le groupe Unix d'installation est oinstall
  • ORACLE_HOME="/u01/app/oracle/product/10.2.0/db_1" indique l'emplacement de l'installation du logiciel
  • ORACLE_HOME_NAME="OraDB102Home1" indique le nom de l'installation. Ce nom doit être unique. Vous pouvez retrouvez les autres nom avec la commande "opatch lsinventory -all"
  • SHOW_ROOTSH_CONFIRMATION=false n'affiche pas les ecrans demandant de lancer le script root.sh
  • s_nameForDBAGrp="dba" indique le groupe pour lequel les utilisateurs seront SYSDBA
  • s_nameForOPERGrp="dba" indique le groupe pour lequel les utilisateurs seront SYSOPER
  • n_configurationOption=3 indique que vous voulez seulement installer le logiciel et pas creer une base de données ni configurer ASM.
Remarque
Si vous avez la chance d'avoir une machine de test sous la main qui accède à un serveur X, il est possible d'enregistrer vos paramètres dans un fichier de réponse en lançant l'installer avec l'option -record

5. Exécuter l'installation en mode silencieux avec le fichier de réponses

Connecte Oracle, il suffit d'exécuter la commande suivante :
./runInstaller -silent -responseFile /home/oracle/myinstall.rsp

Le deroulement de l'installation s'affiche sur la console comme ceci
Starting Oracle Universal Installer...

Checking installer requirements...

Checking operating system version: must be
redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0,
asianux-1 or asianux-2
Passed


All installer requirements met.

Preparing to launch Oracle Universal Installer
from /tmp/OraInstall2007-07-01_03-05-04AM.

Please wait ...

Oracle Universal Installer, Version 10.2.0.1.0 Production
Copyright (C) 1999, 2005, Oracle. All rights reserved.

You can find a log of this install session at:
/u01/app/oracle/oraInventory/logs/
installActions2007-07-01_03-05-04AM.log
......................................... 100% Done.

[...]

Installer SDK Component 10.2.0.1.0
Java Runtime Environment 1.4.2.8.0
Sun JDK 1.4.2.0.8
Sun JDK extensions 10.1.2.0.0
-------------------------------------------------------


Installation in progress (Sun Jul 01 03:05:40 EDT 2007)
............................................ 11% Done.
............................................ 23% Done.
............................................ 35% Done.
............................................ 47% Done.
............................ 55% Done.
Install successful

Linking in progress (Sun Jul 01 03:08:30 EDT 2007)
. 55% Done.
Link successful

Setup in progress (Sun Jul 01 03:10:24 EDT 2007)
.................... 100% Done.
Setup successful

End of install phases.(Sun Jul 01 03:10:33 EDT 2007)
Starting to execute configuration assistants
Configuration assistant "Oracle Net ... Assistant" succeeded
Configuration assistant "Oracle Databasee ... Assistant" succeeded
Configuration assistant "iSQL*Plus ... Assistant" succeeded" succeeded
The installation of Oracle Database 10g was successful.
Please check '/u01/app/oracle/...' for more details.
6. Executez le script root.sh

N'oubliez pas s'exécuter le script root.sh sous root !

7. Lancez les autres assistants
Vous pouvez ensuite de la même manière lancer NETCA pour créer la configuration réseau et DBCA pour créer la base de données. Avant tout positionnez la variable d'environnement ORACLE_HOME et PATH. Pour netca en mode silent, exécutez la ligne de commande suivante :
netca /silent /responsefile <fichier de réponse>
Pour en savoir plus sur l'utilisation de DBCA, tapez :
dbca -silent -help
Pour exécutez DBCA en mode silent, exécutez la ligne de commande suivante :
dbca -silent -responsefile <fichier de réponse>
Voila. Prochaine étape, j'installe le clusterware en mode silent...

-GarK!

Bash Prompt

Avec bash, si vous voulez personnaliser le prompt, il faut modifier les variables PS1 et PS2. Pour en savoir, sur les différentes informations disponibles, visitez ce lien. Voici un exemple ci-dessous :
export PS1="[\u@\h(T1) \W]\$ "

-GarK!