Oracle Grid Infrastructure inclut le Cluster Health Monitor (CHM) qui capture régulièrement des informations sur les performances liées au système d'exploitation. Dans les premières versions, CHM utilise une base de données Berkeley pour son magasin de données. Dans Grid Infrastructure 12.1.0.2, il est désormais nécessaire d'utiliser une base de données Oracle pour le magasin de données. Cette base de données Oracle est appelée Grid Infrastructure Management Repository (GIMR). De nombreuses personnes savent déjà que le GIMR s'exécute avec le nom de base de données "-MGMTDB" et s'exécute sur un seul nœud du cluster GI. Si ce nœud devient disponible, GI démarrera automatiquement le GIMR sur un nœud restant.
Le paragraphe ci-dessus concerne toutes les informations de base que je vais fournir sur le GIMR. Si le lecteur veut en savoir plus, il peut certainement faire une recherche sur le Web pour savoir comment gérer (le peu de gestion nécessaire de cette base de données), et comment démarrer et arrêter la base de données et son écouteur dédié.
Ce billet de blog a pour but d'éduquer le lecteur sur la façon d'accéder à la base de données GIMR et d'en extraire des informations significatives. Une recherche plus approfondie sur le Web peut montrer comment utiliser les utilitaires de ligne de commande pour exporter des données à partir du GIMR. Et il existe un utilitaire graphique, CHMOSG, qui peut être utilisé pour afficher les données CHM dans le référentiel. Mais juste pour le plaisir, j'ai pensé montrer comment accéder directement aux données.
Tout d'abord, vous devez savoir sur quel nœud la base de données s'exécute. Sur n'importe quel nœud, je peux émettre ce qui suit :
[oracle@host01 bin]$ cd /u01/app/crs12.1.0.2 [oracle@host01 bin]$ ./crs_stat -t | grep -i mgmt ora.MGMTLSNR ora....nr.type ONLINE ONLINE host01 ora.mgmtdb ora....db.type ONLINE ONLINE host01
Ce qui précède montre que la base de données et l'écouteur s'exécutent sur host01. Maintenant que je connais le nœud de l'instance, je peux me connecter à ce nœud et définir mes variables d'environnement pour me connecter à l'instance. Cette base de données s'exécute à partir de la maison Grid Infrastructure, et non de la maison RDBMS. Je dois donc définir correctement mon ORACLE_HOME. De plus, le nom de l'instance commence par un tiret, je dois donc entourer le SID de guillemets doubles.
[oracle@host01 ~]$ export ORACLE_HOME=/u01/app/crs12.1.0.2 [oracle@host01 ~]$ export PATH=$ORACLE_HOME/bin:$PATH [oracle@host01 ~]$ export ORACLE_SID="-MGMTDB"
Je peux maintenant me connecter à l'instance et vérifier que je suis connecté à la bonne.
[oracle@host01 ~]$ sqlplus /nolog
SQL*Plus: Release 12.1.0.2.0 Production on Mon Dec 21 15:17:21 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
SQL> connect / as sysdba Connected. SQL> select instance_name from v$instance;
INSTANCE_NAME ---------------- -MGMTDB
Cette base de données est une base de données multitenant Oracle, dont une PDB. J'ai besoin de déterminer le nom de l'APB. Le nom de la PDB sera le même que le nom du cluster. Je peux me souvenir du nom du cluster en interrogeant V$ACTIVE_SERVICES.
SQL> select name,con_id 2 from v$active_services;
NAME CON_ID ----------------------------------------------------- ---------- my_cluster 3 -MGMTDBXDB 1 _mgmtdb 1 SYS$BACKGROUND 1 SYS$USERS 1
SQL> alter session set container=my_cluster;
Session altered.
Un seul service a un identifiant de conteneur différent de 1 (1 est le CDB), il doit donc s'agir du PDB que je recherche. Je modifie ma session pour utiliser la PDB comme conteneur.
Ma prochaine tâche consiste à obtenir une liste des tables appartenant à CHM.
SQL> select table_name from dba_tables where owner='CHM' 2 order by table_name;
TABLE_NAME -------------------------------------------------------------------------------- CHMOS_ACTIVE_CONFIG_INT_TBL CHMOS_ASM_CONFIG_INT_TBL CHMOS_CPU_INT_TBL CHMOS_DEVICE_INT_TBL CHMOS_FILESYSTEM_INT_TBL CHMOS_NIC_INT_TBL CHMOS_PROCESS_INT_TBL CHMOS_STATIC_CONFIG_INT_TBL CHMOS_SYSTEM_PERIODIC_INT_TBL CHMOS_SYSTEM_SAMPLE_INT_TBL
Seulement 10 tables dans le schéma. Le premier tableau de la liste affiche des informations de configuration sur les hôtes surveillés CHM.
SQL> select hostname,NUMPHYCPUS,NUMCPUS,NUMDISKS 2 from CHM.CHMOS_ACTIVE_CONFIG_INT_TBL;
HOSTNAME NUMPHYCPUS NUMCPUS NUMDISKS ---------- ---------- ---------- ---------- host01 1 2 3 host02 1 2 3
Je peux voir que CHM collecte des informations sur deux nœuds du cluster. Je peux voir le nombre de processeurs physiques pour chaque nœud et le nombre total de cœurs (2). Ces nœuds ont également 3 disques.
Nous pouvons également obtenir des informations sur le système d'exploitation.
SQL> select hostname,osname,chiptype 2 from CHM.CHMOS_STATIC_CONFIG_INT_TBL;
HOSTNAME OSNAME CHIPTYPE ---------- ---------- -------------------- host01 Linux Intel(R) host02 Linux Intel(R)
Il y a une bonne quantité d'informations dans ces tableaux et il suffit d'essais et d'erreurs pour comprendre ce qu'il y a dedans. Par exemple, je peux utiliser cette requête pour obtenir le nombre de processus exécutés sur host01 classés dans le temps.
select begintime,count(*) from CHM.CHMOS_PROCESS_INT_TBL where hostname='host01' group by begintime order by begintime;
Je n'ai intentionnellement pas inclus la sortie car elle serait trop longue pour un article de blog. Voici quelques exemples de requêtes supplémentaires que vous pouvez essayer sur votre base de données GIMR.
Activité d'E/S de disque pour un hôte spécifique au fil du temps.
select begintime, DISK_BYTESREADPERSEC/1024/1024 as MB_READ_SEC, DISK_BYTESWRITTENPERSEC/1024/1024 as MB_WRITE_SEC, DISK_NUMIOSPERSEC as IO_PER_SEC from CHM.CHMOS_SYSTEM_SAMPLE_INT_TBL where hostname='host01' order by begintime;
Échange sur un hôte spécifique au fil du temps.
select begintime,swpin,swpout from CHM.CHMOS_SYSTEM_SAMPLE_INT_TBL where hostname='host01' order by begintime;
La prochaine instruction SQL calculera un histogramme de l'activité d'E/S du disque. Je suis sûr que quelqu'un d'autre peut proposer une version plus élégante car mes instructions SQL ont tendance à être plus brutales.
select first.num_count as "<=10ms", second.num_count as "<=20ms", third.num_count as "<=50ms", fourth.num_count as "<=100ms", fifth.num_count as "<=500ms", final.num_count as ">500ms" from (select count(*) as num_count from CHM.CHMOS_DEVICE_INT_TBL where devid='sda1' and latency between 0 and 10) first, (select count(*) as num_count from CHM.CHMOS_DEVICE_INT_TBL where devid='sda1' and latency between 11 and 20) second, (select count(*) as num_count from CHM.CHMOS_DEVICE_INT_TBL where devid='sda1' and latency between 21 and 50) third, (select count(*) as num_count from CHM.CHMOS_DEVICE_INT_TBL where devid='sda1' and latency between 51 and 100) fourth, (select count(*) as num_count from CHM.CHMOS_DEVICE_INT_TBL where devid='sda1' and latency between 101 and 500) fifth, (select count(*) as num_count from CHM.CHMOS_DEVICE_INT_TBL where devid='sda1' and latency > 500) final;
<=10ms <=20ms <=50ms <=100ms <=500ms >500ms ---------- ---------- ---------- ---------- ---------- ---------- 150693 10 1 0 0 0
Il y a une bonne quantité d'informations dans le schéma CHM. Je m'attends surtout à ce que ces informations soient simplement éducatives et que la plupart des gens n'interrogeront pas directement les tables CHM. Mais c'est une bonne information à connaître et peut aider les autres.