Rechercher sur arkzoyd.com

18 février 2009

Afficher le résultat d'un "SELECT" verticalement.

C'est de loin le truc le plus cool de MySQL; le ego ou "\G" : "Send command to mysql server, display result vertically.". Je ne comprends pas qu'Oracle n'ai pas encore inclus la même fonctionnalité dans SQL*Plus; Enfin, pour pallier en partie à ce manque, voici printv; C'est moins facile à utiliser que le "\G" mais ça permet lorsque vous faites une présentation d'avoir des écrans un peu mieux soignés; pour l'installer, lancez le script ci-dessous:
connect / as sysdba

create or replace procedure printv(
query varchar2)
authid current_user as
curid number;
ret number;
desctab dbms_sql.desc_tab;
colcnt number;
maxcoll number:=0;
namevar varchar2(80);
numvar number;
datevar date;
j number:=0;
begin
--
-- Display the Header
--
dbms_output.put_line('**** DISPLAY CONTENT OF ****'||
'****************************');
dbms_output.put_line('. '||query);
dbms_output.put_line('**** IS ********************'||
'****************************');
--
-- Prepare the Query
--
curid := dbms_sql.open_cursor;
dbms_sql.parse(curid, query,dbms_sql.native);
ret:=dbms_sql.execute(curid);
dbms_sql.describe_columns(curid, colcnt, desctab);
--
-- Get the size of the largest column
--
for i in 1..colcnt loop
maxcoll:=greatest(maxcoll,
length(desctab(i).col_name));
end loop;
--
-- Define column returned type
--
for i in 1..colcnt loop
if (desctab(i).col_type = 2) then
dbms_sql.define_column(curid, i, numvar);
elsif (desctab(i).col_type = 12) then
dbms_sql.define_column(curid, i, datevar);
else
dbms_sql.define_column(curid, i, namevar,80);
end if;
end loop;
--
-- Return all the rows
--
while dbms_sql.fetch_rows(curid) > 0 loop
j:=j+1;
dbms_output.put_line('**** ROW #'||rpad(to_char(j),7)
||' **********'||
'****************************');
for i in 1..colcnt loop
if (desctab(i).col_type = 1) then
dbms_sql.column_value(curid, i, namevar);
elsif (desctab(i).col_type = 2) then
dbms_sql.column_value(curid, i, numvar);
namevar:=to_char(numvar);
elsif (desctab(i).col_type = 12) then
dbms_sql.column_value(curid, i, datevar);
namevar:=to_char(datevar,
'DD-MON-YYYY HH24:MI:SS');
end if;
dbms_output.put_line(
rpad(desctab(i).col_name,maxcoll)||
' => '||namevar);
end loop;
end loop;

--
-- Close the Cursor and print the line
--
dbms_sql.close_cursor(curid);
dbms_output.put_line('**** END *******************'||
'****************************');
end;
/

create public synonym printv for sys.printv;
grant execute on sys.printv to dba;
Pour l'utiliser, si vous êtes DBA tapez quelque chose comme ceci:
set serveroutput on
exec printv('select * from dba_capture')
Le résultat sera un peu mieux léché:
 **** DISPLAY CONTENT OF ********************************
. select * from dba_capture
**** IS ************************************************
**** ROW #1 **************************************
CAPTURE_NAME => STREAMS_CAPTURE
QUEUE_NAME => STREAMS_QUEUE
QUEUE_OWNER => STRMADMIN
RULE_SET_NAME => RULESET$_9
RULE_SET_OWNER => STRMADMIN
CAPTURE_USER => STRMADMIN
START_SCN => 1010398
STATUS => ENABLED
CAPTURED_SCN => 2167433
APPLIED_SCN => 2167378
USE_DATABASE_LINK => NO
FIRST_SCN => 1010398
SOURCE_DATABASE => BLACK
SOURCE_DBID => 363224793
SOURCE_RESETLOGS_SCN => 1008631
SOURCE_RESETLOGS_TIME => 679061156
LOGMINER_ID => 21
NEGATIVE_RULE_SET_NAME =>
NEGATIVE_RULE_SET_OWNER =>
MAX_CHECKPOINT_SCN => 2167433
REQUIRED_CHECKPOINT_SCN => 2166351
LOGFILE_ASSIGNMENT => IMPLICIT
STATUS_CHANGE_TIME => 17-FEB-2009 12:16:03
ERROR_NUMBER =>
ERROR_MESSAGE =>
VERSION => 11.1.0.7.0
CAPTURE_TYPE => LOCAL
LAST_ENQUEUED_SCNc => 2167550
CHECKPOINT_RETENTION_TIME => 60
**** END ***********************************************
Pour l'instant, il ne gère pas les LOB, RAW ou autre mais nul doute que vous l'améliorerez facilement et qu'Oracle sortira quelque chose en 11g Release 2 (espérons!)

16 février 2009

J'ai la base Oracle avec le DBID 1 !!!

Ce message est dédié à tous ceux qui pensent que le DBID d'une base Oracle est unique... La France et en l'occurence moi sommes fiers de vous annoncer que WHITE, la base de données dont le DBID est 1 est née en début d'après midi. Aux incrédules, ci-dessous une copie d'écran:


Pour l'instant la petite n'a aucun datafile mais je ne désespère pas de créer bientôt tout un tas de clones à commencer par DEVIL (DBID=666)

15 février 2009

"BECOME USER" sous Linux

En faisant des recherches sur Oracle, je suis tombé sur un article très intéressant intitulé "CHANGE USER" OPI call. En substance, l'article pointe une API OCI non documentée pour changer d'utilisateur et propose un exemple sous Windows pour l'utiliser. Ne disposant malheureusement pas du système d'exploitation de la firme de Redmond, j'ai modifié le programme pour Linux; vous trouverez ci-dessous avec l'accord de l'auteur le code source:
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <dlfcn.h>

#include "oci.h"

typedef int (*UPICUI) (int, int, const char *, int);
typedef int (*KPUSVC2HST) (OCISvcCtx *, OCIError *, int *, int);

int main(int argc, char * argv[])
{
OCIEnv *myenvhp; /* the environment handle */
OCIServer *mysrvhp; /* the server handle */
OCIError *myerrhp; /* the error handle */
OCISession *myusrhp; /* user session handle */
OCISvcCtx *mysvchp; /* the service handle */
OCIStmt *stmt;
OCIDefine *dfn;
char buf[10240];
UPICUI upicui;
KPUSVC2HST kpusvc2hst;
int hst;
void *handle;

#define SID "BLACK"

assert (OCIEnvCreate (&myenvhp, OCI_THREADED|OCI_OBJECT, 0, 0, 0, 0, 0, 0)==0);

assert (OCIHandleAlloc (myenvhp, (dvoid**)&mysrvhp, OCI_HTYPE_SERVER, 0, 0)==0);

assert (OCIHandleAlloc (myenvhp, (dvoid**)&myerrhp, OCI_HTYPE_ERROR, 0, 0)==0);

assert (OCIServerAttach (mysrvhp, myerrhp, (const OraText *)SID, strlen (SID), OCI_DEFAULT)==0);

assert (OCIHandleAlloc (myenvhp, (dvoid**)&mysvchp, OCI_HTYPE_SVCCTX, 0, 0)==0);

assert (OCIAttrSet (mysvchp, OCI_HTYPE_SVCCTX, mysrvhp, 0, OCI_ATTR_SERVER, myerrhp)==0);

assert (OCIHandleAlloc (myenvhp, (dvoid**)&myusrhp, OCI_HTYPE_SESSION, 0, 0)==0);

assert (OCIHandleAlloc (myenvhp, (dvoid**)&stmt, OCI_HTYPE_STMT, 0, 0)==0);

#define USERNAME "sys"
#define PASSWORD "change_on_install"

assert (OCIAttrSet (myusrhp, OCI_HTYPE_SESSION, USERNAME, strlen(USERNAME), OCI_ATTR_USERNAME, myerrhp)==0);

assert (OCIAttrSet (myusrhp, OCI_HTYPE_SESSION, PASSWORD, strlen(PASSWORD), OCI_ATTR_PASSWORD, myerrhp)==0);

assert (OCISessionBegin (mysvchp, myerrhp, myusrhp, OCI_CRED_RDBMS, OCI_SYSDBA)==0);

handle = dlopen ("libclntsh.so", RTLD_LAZY);assert(handle!=NULL);

upicui=(UPICUI) dlsym(handle, "upicui"); assert (upicui!=NULL);

kpusvc2hst=(KPUSVC2HST) dlsym(handle, "kpusvc2hst");
assert (kpusvc2hst!=NULL);

printf ("kpusvc2hst -> %d\n", (kpusvc2hst) (mysvchp, myerrhp, &hst, 1));

#define USERNAME2 "SCOTT"

printf ("upicui -> %d\n", (upicui)( hst, 0, USERNAME2, strlen (USERNAME2) ));

assert (OCIAttrSet (mysvchp, OCI_HTYPE_SVCCTX, myusrhp, 0, OCI_ATTR_SESSION, myerrhp)==0);

#define STMT "select user from dual"

assert (OCIStmtPrepare (stmt, myerrhp, (const OraText *)STMT, strlen (STMT), OCI_NTV_SYNTAX, OCI_DEFAULT)==0);

assert (OCIDefineByPos (stmt, &dfn, myerrhp, 1, buf, 10240, SQLT_STR, 0, 0, 0, OCI_DEFAULT)==0);

assert (OCIStmtExecute (mysvchp, stmt, myerrhp, 1, 0, NULL, NULL, OCI_DEFAULT)==0);

printf ("%s\n", buf);

dlclose(handle);
}
Pour l'utiliser, positionnez l'environnement oracle, y compris LD_LIBRARY_PATH, modifiez les valeurs de SID, USERNAME, PASSWORD et USERNAME2 dans le code et compilez le programme comme ci-dessous:
gcc -I$ORACLE_HOME/rdbms/public \
-L$ORACLE_HOME/lib -lclntsh \
-o demo demo.c
Et voilà, vous pouvez tester le programme comme ci-dessous:
./demo

kpusvc2hst -> 0
upicui -> 0
SCOTT
Bon! Mais ça ne répond pas encore à ma question...

PS: Jetez un œil sur le post de Laurent intitulée su in sqlplus pour une méthode supportée... Celle-ci c'est pour ceux qui cherchent le petite bête.

09 février 2009

RAC gère plusieurs copies d'un même bloc, et alors?

C'est dommage, je n'ai pas relevé où j'ai lu ça: "RAC gère plusieurs copies du même bloc dans son cache global !". Bien sur et alors ? c'est vrai d'une instance non cluster aussi. Voici un exemple pour illustrer ce point:
show parameter cluster_database

NAME TYPE VALUE
-------------------------- ------- -----
cluster_database boolean FALSE
cluster_database_instances integer 1

create table t(c number)
tablespace users;

insert into t values (1);

commit;

select rowid, c
from t;

ROWID C
------------------ -
AAADKPAAEAAAAEGAAA 1

set serveroutput on

declare
v_rowid_type number;
v_object_number number;
v_relative_fno number;
v_block_number number;
v_row_number number;
v_rowid varchar2(30):='&rowid';
begin
dbms_rowid.rowid_info(v_rowid,
v_rowid_type,
v_object_number,
v_relative_fno,
v_block_number,
v_row_number);
dbms_output.put_line('RowID : '||v_rowid);
dbms_output.put_line('Type : '||v_rowid_type);
dbms_output.put_line('Object: '||v_object_number);
dbms_output.put_line('FNO : '||v_relative_fno);
dbms_output.put_line('Block : '||v_block_number);
dbms_output.put_line('RowNum: '||v_row_number);
end;
/

Enter value for rowid: AAADKPAAEAAAAEGAAA

RowID : AAADKPAAEAAAAEGAAA
Type : 1
Object: 12943
FNO : 4
Block : 262
RowNum: 0

update t set c=2;

select FILE#,BLOCK#,STATUS, DIRTY,DIRECT
from v$bh
where FILE#=4
and BLOCK#=262;

FILE# BLOCK# STATUS D D
----- ------ ------ - -
4 262 cr N N
4 262 xcur Y N
Mais vous vous dites peut-être que un bloc "consistent read" et un bloc "current" c'est logique? effectuer des modifications dans d'autres session ou manipulez "set transaction read only" et le hint "parallel" et vous obtiendrez bientot:
select FILE#,BLOCK#,STATUS, DIRTY,DIRECT
from v$bh
where FILE#=4
and BLOCK#=262;

FILE# BLOCK# STATUS D D
----- ------ ------ - -
4 262 cr N N
4 262 cr N N
4 262 xcur Y N
Bon... nettoyez:
drop table t purge;

FILE# BLOCK# STATUS D D
----- ------ ------ - -
4 262 free N N
4 262 free N N
4 262 free N N

07 février 2009

Sécurité des environnements de production, GridControl et sudo

La sécurité sont une des clés des environnements de production. Dans ce cadre administrateurs et outils doivent se plier à de multiples contraintes : VPN, DMZ et firewalls, token ou autre cryptocards, environnements avec authentifications fortes, propagation des identités entre les différents tiers, synchronisation des référentiels utilisateurs...Malgré tout, il faut être de plus en plus efficaces et échanger de plus en plus d'informations avec des systèmes tiers.

Les bugs [1] et les Critical Patch Update ne sont pas la première préoccupations des RSSI mais tracer les changements, tracer les intervenants ou superviser les informations accédées sont encore plus cruciaux. The Pythian Group a un savoir faire particulier dans ce domaine! Nous sommes capables de réaliser plus de 95% de nos interventions sur les environnements de bases de données Oracle (cf installations en mode silent, comme celles qui concernent RAC 10g et 11g) et MySQL sans interfaces graphiques, ce qui favorise leur enregistrement avec des outils simples comme la commande script ou screen. Depuis quelques mois, nous sommes également capables d'enregistrer l'ensemble de nos interventions via X-Window ou Terminal Server et d'archiver tous les fichiers utilisés. Nos clients peuvent ainsi auditer l'ensemble de nos opérations [2]. La solution est utilisée dans le cadre de règlementations comme PCI ou FDA.

Mais revenons à la sécurité et aux outils Oracle!

J'ai déjà posté plusieurs articles sur ce thème comme Grid Control, Agent 10g et HTTPS restreint à 443 ou encore Enterprise Users et iPlanet. Je vais continuer et en touchant 2 mots du paramétrage et l'utilisation du Grid Control dans des environnements avec délégation de privilèges avec en l'occurrence sudo. Ces techniques (1) obligent les administrateurs à se signer avec un compte dédier, (2) sont disponibles sur les environnements Linux, Unix et autre, (3) permettent de limiter les accès et (4) facilitent la traçabilité des opérations puisque chaque appel est stocké dans un fichier journal.

Avant de commencer...

sudo doit être utilisé de manière judicieuse et, trop souvent, l'implémentation associée équivaut à donnez un accès complet à l'utilisateur; voici quelques exemples d'erreurs à ne pas reproduire:
  • Ne pas mettre à jour sudo; comme tous les logiciels sudo contient certains flaws connus et qui peuvent être exploités
  • Positionner un accès sudo sur un script ou un programme modifiable par l'opérateur; l'exemple le plus commun dans le monde Oracle consiste à donner un accès à root.sh depuis Oracle. Celui-ci peut alors, impunément, lancer n'importe quelle instruction sous root en modifiant le dit script
  • Une variante de l'erreur précédente consiste à ne pas positionner le chemin complet du script dans le fichiers sudoers; l'utilisateurs peut alors créer un script avec le même nom dans un autre répertoire et l'utiliser pour exécuter la commande de son choix.
  • Ne pas empêcher le script ou programme d'exécuter un autre programme. Si par exemple, vous permettez l'utilisation de SQL*Plus avec sudo, qu'est-ce qui vous empêchera de taper !rm -rf $ORACLE_HOME ? (cf noexec)
  • Autoriser l'écriture de fichiers depuis le programme auquel vous donnez accès. Si par exemple, sshd est paramétré et permet une authentification par clé publique, vous pourriez alors ajouter les informations adéquates dans le fichier authorized_keys puis vous connectez sans mot de passe depuis un autre serveur ou depuis le compte de l'opérateur
  • Donner accès à des langages comme Perl ou Java en autorisant le passage de n'importe quel paramètre à l'aide du caractère wildcard.
Si vous voulez toujours augmenter vos privilèges, il existe d'autres techniques; vous pouvez utiliser les setuid bits et ownership de certains programmes oracle. Enfin, tout ceci ainsi que l'utilisation de visudo pour changer le paramètrage du fichier /etc/sudoers sont au delà du périmètre de cet article... Quoiqu'intéressant

Créer une configuration sudo dans le GridControl

L'utilisation de sudo ou de Power Broker pour lancer un script OS ou SQL est une nouvelle fonctionnalité d'Enterprise Manager 10.2.0.4. Le paramètrage associé est décrit dans la section Configuring Privilege Delegation Providers de la documentation. Pour commencer, vous devez installer EMCLI et utiliser les commandes create_privilege_delegation_setting et apply_privilege_delegation_setting pour d'une part créer une configuration (i.e. la syntaxe de la commande sudo ou pbrun qui dépend du système) et d'autre part d'associer la configuration au serveur:
  • Pour installer EMCLI, vous devez le télécharger à l'URL correspondante sur le Grid Control http://<oem-gridcontrol-url>:<port>/em/console/emcli/download
    Note: EMCLI peut-être installé sur n'importe quel ordinateur qui a accès au GridControl
  • Une fois emcli.jar téléchargé, installez le programme:
mkdir emcli
export DISTRIB=`pwd`

java -version

java -jar emcli.jar client \
-install_dir=$DISTRIB/emcli
  • Configurez l'utilisation d'EMCLI:
cd emcli

mkdir -p strore/.emcli

./emcli setup \
-url=http://<oem-gridcontrol-url>:<port>/em \
-username=arkzoyd

java -jar emcli.jar client -install_dir=$DISTRIB/emcli
  • Créez une configuration sudo nommée mysudosettings01
./emcli create_privilege_delegation_setting \
-setting_name=mysudosettings01 \
-setting_type=SUDO \
-settings="SETTINGS:/usr/bin/sudo -S -u %RUNAS% %command%"
  • Appliquez la configuration sur le serveur server1
./emcli apply_privilege_delegation_setting \
-setting_name=mysudosettings01 \
-target_type=host \
-target_names=server1

Configurer sudo sur le serveur

Vous voilà presque prêt pour utilisez sudo. Enfin encore faut-il, pour que vous puissiez lancer un script SQL depuis le GridControl que vous ayez le droit d'exécuter le bon programme avec la commande sudo; Vous trouverez ci-dessous un extrait du fichier sudoers pour arriver à lancer un script SQL:
arkzoyd ALL= (oracle) /agent_home/perl/bin/perl /agent_home/sysman/admin/scripts/jobs/runSQLScript.pl *
Vous pouvez tester la configuration sudo depuis le serveur avant de la tester depuis le Grid Control

Autres remarques...
  • Vous pouvez utiliser sudo pour lancer des opérations sous l'utilisateur root. Ca peut-être très utile pour certaines opérations avec le clusterware ou certains scripts avancés
  • Vous remarquerez que ma configuration sudo a une faille; savez vous pourquoi?
  • Avez-vous jeté un oeil aux capacités d'Oracle Configuration Management Change Console (aka Active Reasoning) ?
[2] Un bug peut mener au pire, la preuve dans ce bug enregistrée pour le logiciel Blackgold !
[1] Une solution concurrente est disponible et contient une démonstration enregistrée!

05 février 2009

Notifications Relatives aux Évènements sur les Travaux du Grid Control

Note préliminaire
Ce qui suit s'applique à Enterprise Manager Grid Control 10.2.0.4 et est susceptible d'évoluer dans les prochaines versions.
Il n'est pas toujours aisé de s'assurer du bon fonctionnement de la supervision de vos composants et applications avec Oracle Enterprise Manager GridControl. C'est surtout le cas pour les notifications relatives aux évènements sur les travaux (*, i.e. job) . Non que vous puissiez pas mettre en place un fonctionnel qui réponde à la plupart des besoins, y compris si vos configurations sont étendues et critiques; il faudra toutefois faire un bon effort de compréhension et/ou être bien accompagné lors de l'implémentation; mais quand vous y serez arrivé, dites-vous n'étiez pas le premier.

Dans ce qui suit, vous trouverez une synthèse des paramètres impliqués dans les notifications relatives aux évènements sur les travaux. En effet, celles-ci, bien que différentes des notifications relatives aux alertes, elles sont tout aussi importantes: imaginez que vous ne soyez pas informé qu'une sauvegarde a échouée! Pendant 1 mois!

Avant tout, que vous ayez déjà les licences Oracle Diagnostic Pack ou que vous envisagiez simplement d'utiliser OEM pour superviser vos environnements, lisez "285093.1 How to Troubleshoot Notifications That Are Hung / Stuck and Not Being Sent from EM 10g" et tous les liens associés. Ensuite, validez toujours vos changements, même très simple, par des tests. Enfin, même si vous utilisez les notifications avec succès, organisez de manière régulière, quasi quotidienne, un screening du Grid Control ET des travaux. Ça prendra 5 à 10 minutes par jour et vous permettra d'anticiper de nombreux problèmes, y compris en traitant par ce moyen les avertissements non-critiques.

Notifications sur les travaux

Quelles sont les conditions nécessaires pour qu'une notification soit envoyée à un utilisateurs? C'est en substance la question qu'il faut se poser pour expliquer pourquoi une notification n'a pas été reçue. La réponse dans le cas des travaux tient dans la liste qui suit:
  1. Il faut qu'OEM soit configuré pour envoyer des notifications et que la configuration fonctionne; Autrement dit, si vous voulez être notifié par email, celui-ci étant re-routé sur un pager par exemple, il faut que le serveur email ainsi que les droits soient correctement enregistrés. Il faut aussi que le serveur email envoie le message à la passerelle SMS et que celle-ci la re-route correctement. Il faut que ces messages n'entre dans aucune liste de SPAM qui les détourneraient.
  2. Il faut que l'utilisateur qui doit recevoir les notifications ait des préférences correctes. Autrement dit, dans le cas d'une notification sur une adresse email, il faut que cette adresse soit valide, enregistrée dans ses adresses emails préférées et que son calendrier de notifications soit mis à jour avec les bonnes périodes/adresse email.
  3. Il faut que l'utilisateur ait accès au travail ou job! Je reviendrai sur les conséquences de ce point dans la partie qui suit mais, le fait qu'un utilisateur ait accès à une cible ne signifie pas qu'il voit les travaux sur cette cible, et vice-versa. Pour vérifier ce point, éditez le travail et sélectionnez l'onglet "Access" (Accès?); Vous trouverez la liste des utilisateurs qui voient (View) ou peuvent modifier le travail (Full).
  4. Il faut une règle de notifications qui inclut le travail, nomimativement ou au travers d'une expression de correspondance, ET les évènements dont vous voulez être notifié. Vous noterez qu'une règle de notification ne s'applique qu'à un seul type de cible; le travail doit donc s'appliquer sur le même type de cible que la règle. C'est vrai, même si les cibles d'une règles contiennent un groupe constitué de plusieurs types de cibles; A ce propos, notez qu'une sauvegarde peut-être exécutée sur une instance de base de données ou une base de données en cluster qui sont 2 types de cible différentes.
  5. Enfin il faut que l'utilisateur souscrive à la règle qui inclut le travail et l'évènement dont il voudra être notifié
Nota Bene:
Si vous êtes le propriétaire du travail vous pouvez souscrire aux évènements associés directement dans sa définition et donc sans vérifier les contraintes 3, 4 et 5.

Conséquences sur la gestion des utilisateurs et de leurs droits


L'une des difficultés que vous rencontrerez sans doute avec le Grid Control, si vous supervisez les environnements au travers de notifications, c'est : "Comment faire la transition entre les personnes d'astreinte ?". Jusqu'en 10.2.0.3, une notification n'était envoyée qu'une seule fois; et c'est toujours le comportement par défaut en 10.2.0.4. Imaginons que vous ayiez un volume disque qui dépasse un seuil critique à 17:59: si vous utilisez des comptes nominatif pour gérer les notifications, il y a de grandes chances que la prochaine personne qui appelle le DBA/SA d'astreinte soit... un responsable projet ou un utilisateur.

Vous me direz, il ne faut être c... et c'est pour cela que les procédures de transition sont si importantes! Je répondrai que ca milite également en faveur de quelques minutes de screening et de l'utilisation d'un ou plusieurs comptes génériques pour les notifications. Le système d'astreinte ou de ticketing faisant quant à lui le dispatching et le lien avec la base de connaissance et des incidents.

Un autre élément en faveur de l'utilisation d'un ou plusieurs comptes génériques pour les notifications est la difficulté de s'assurer un paramètrage homogène entre les utilisateurs; le premier exemple qui vient à l'esprit est relatif au calendrier; le Grid Control n'offre pas de moyen simple pour valider que les calendriers de plusieurs utilisateurs sont paramétrés en fonction des astreintes. Biensur vous pouvez toujours développer un rapport mais idéalement il faudrait pouvoir déléguer les droits pour planifier les calendriers ce qui dans le contexte de la version 10.2.0.4 nécessite de faire une intégration.

Mais la vrai raison qui milite pour l'utilisation du compte générique pour les notifications est l'absence d'un niveau de regroupement des administrateurs et la complexité induite sur la gestion des comptes nominatifs. Illustration!

Dans la section précédente, vous voyez que pour être notifié d'un évènement sur un travail il faut avoir accès à ce travail. Or si un nouveau membre rejoint une équipe, le seul moyen réaliste(**) de lui donner cet accès consiste à modifier chacun des travaux planifiés et stockés dans la bibliothèque. S'il existait un niveau de regroupement, on pourrait simplement ajouter l'administrateur à la liste des administrateurs du domaine X mais ce n'est pas le cas Même si vous pouvez définir des travaux multi-cibles ou que emcli vous permet de modifier des configurations à la chaine, ajouter un utilisateur nomminatif n'est pas si simple, si vous voulez que celui-ci puisse accéder à la liste des travaux de son domaine.

Le problème est identique si un administrateur change de domaine d'intervention.

Conclusion

Lorsque vous ajoutez un utilisateur au GridControl, n'oubliez pas de lui donner les droits adéquats sur les travaux qui le concerne.


(*) C'est d'autant plus vrai que cette partie est sujette à plusieurs problèmes de fonctionnement jusqu'en 10.2.0.4.
(**) Un moyen irréaliste consisterait à mettre tout le monde Super Utilisateur

04 février 2009

rootconfig et localconfig

A peine 10 jours sans blogger et certains s'inquiètent déjà de ma santé. Oui, oui tout va bien! J'étais juste très occupé entre la publication d'un article sur mon blog anglais intitulé Setting Up a Downstream Real-Time Capture with RMAN 101, quelques configurations en production de Streams, RAC et Grid Control (Il faut bien vivre!) et les bêtises des uns et des autres avec des environments en production (tant qu'à faire!). A ce propos, je reste ébahi devant la créativité des gens pour me donner du travail, même en période de crise sévère...

Je ne dirai pas tout ce que j'ai vu ou ouïe-dire, certains pourraient se reconnaître! Enfin, sans entrer dans le détail de ma dernière aventure New-Yorkaise, je dirais ceci: "évitez d'exécuter $ORA_CRS_HOME/bin/localconfig reset sous root lorsque vous utilisez le clusterware et que celui-ci ne rédemarre pas".

Côté bonnes nouvelles, si vous êtes, malgré tout, tenté par les expériences masochistes:
  • Ca n'impacte aucun autre noeud du cluster même lorsque ceux-ci fonctionnent. Oracle aurait pu de manière perverse effacer le précédent OCR dans cette procédure; ils ne le font pas, au moins en 11.1.0.7. Merci!
  • Ca prend 15 minutes à réparer, même si j'ai eu un sérieux doute sur le coup et que je n'ai pas trouvé de notes sur Metalink à ce propos. En substance: (1) sauvegardez et supprimez les fichiers et répertoires de configuration que sont /etc/oracle, /var/tmp/.oracle et /var/tmp/ocr.loc sous Linux, (2) laissez les fichiers /etc/init.d ou inittab et (3) exécutez le script root.sh sur le noeud local.
  • Si vous voulez éviter que ASM ou les instances locales rédemarrent avec le clusterware, vous pouvez exécuter srvctl disable instance|asm préalablement sur les autre noeuds.
Et puisque "A toute chose malheur est bon", cette petite expérience m'a fait prendre conscience d'un changement important dans le script rootconfig; les variables utilisées pour reconfigurer le cluster ne sont plus celles au début du script mais celles du fichier paramfile.crs. Ce changement a eu lieu quelque part entre 10.2.0.3 (mon post sur comment recréer OCR et Voting sur un cluster pour lequel des noeuds ont été ajouté/supprimés) et 11.1.0.7 (mon incident de production). Ce changement n'a pas d'impact dans le présent cas.

Voilà, et tout ça de Paris! New-York n'était que la cible de ma session SSH.