Oracle Grid Infrastructure include Cluster Health Monitor (CHM) che acquisisce regolarmente informazioni sulle prestazioni relative al sistema operativo. Nelle prime versioni, CHM utilizzava un database Berkeley per il suo archivio dati. In Grid Infrastructure 12.1.0.2, ora è necessario utilizzare un database Oracle per l'archivio dati. Questo database Oracle è chiamato Grid Infrastructure Management Repository (GIMR). Molte persone sono già consapevoli del fatto che GIMR viene eseguito con il nome del database "-MGMTDB" e viene eseguito su un solo nodo del cluster GI. Se quel nodo diventa disponibile, GI avvierà automaticamente GIMR su un nodo rimanente.
Il paragrafo precedente riguarda tutte le informazioni di base che fornirò sul GIMR. Se il lettore vuole saperne di più, può certamente fare una ricerca sul web per informazioni su come gestire (quella piccola gestione necessaria di questo database) e come avviare e arrestare il database e il suo listener dedicato.
Questo post del blog intende educare il lettore su come accedere al database GIMR ed estrarne informazioni significative. Ulteriori ricerche sul Web possono mostrare come utilizzare le utilità della riga di comando per esportare i dati dal GIMR. E c'è un'utilità grafica, CHMOSG, che può essere utilizzata per visualizzare i dati CHM nel repository. Ma solo per divertimento, ho pensato di mostrare come arrivare direttamente ai dati.
Innanzitutto, è necessario sapere su quale nodo è in esecuzione il database. Su qualsiasi nodo, posso emettere quanto segue:
[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
Quanto sopra mostra che il database e il listener sono in esecuzione su host01. Ora che conosco il nodo dell'istanza, posso accedere a quel nodo e impostare le mie variabili di ambiente per la connessione all'istanza. Questo database esce dalla home dell'infrastruttura Grid, non dalla home RDBMS. Quindi ho bisogno di impostare correttamente il mio ORACLE_HOME. Inoltre, il nome dell'istanza inizia con un trattino, quindi è necessario racchiudere il SID tra virgolette.
[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"
Ora posso connettermi all'istanza e verificare di essere connesso a quella corretta.
[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
Questo database è un database multi-tenant Oracle, di cui un PDB. Devo determinare il nome PDB. Il nome PDB sarà lo stesso del nome del cluster. Posso ricordare a me stesso il nome del cluster eseguendo una query su 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.
Solo un servizio ha l'ID contenitore non uguale a 1 (1 è il CDB), quindi deve essere il PDB che sto cercando. Modifico la mia sessione per utilizzare il PDB come suo contenitore.
Il mio prossimo compito è ottenere un elenco di tabelle di proprietà di 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
Solo 10 tabelle nello schema. La prima tabella nell'elenco mostra alcune informazioni di configurazione sugli host monitorati da 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
Vedo che CHM sta raccogliendo informazioni su due nodi nel cluster. Posso vedere il numero di CPU fisiche per ogni nodo e il numero di core totali (2). Questi nodi hanno anche 3 dischi.
Possiamo anche ottenere informazioni sul sistema operativo.
SQL> select hostname,osname,chiptype 2 from CHM.CHMOS_STATIC_CONFIG_INT_TBL;
HOSTNAME OSNAME CHIPTYPE ---------- ---------- -------------------- host01 Linux Intel(R) host02 Linux Intel(R)
C'è una buona quantità di informazioni in queste tabelle e ci vogliono solo alcuni tentativi ed errori per capire cosa c'è dentro. Ad esempio, posso utilizzare questa query per ottenere un conteggio dei processi in esecuzione su host01 ordinati nel tempo.
select begintime,count(*) from CHM.CHMOS_PROCESS_INT_TBL where hostname='host01' group by begintime order by begintime;
Non ho intenzionalmente incluso l'output in quanto sarebbe troppo lungo per un post sul blog. Ecco alcune altre query di esempio che puoi provare sul tuo database GIMR.
Attività di I/O del disco per un host specifico nel tempo.
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;
Scambio su un host specifico nel tempo.
select begintime,swpin,swpout from CHM.CHMOS_SYSTEM_SAMPLE_INT_TBL where hostname='host01' order by begintime;
L'istruzione SQL successiva calcolerà un istogramma dell'attività di I/O del disco. Sono sicuro che qualcun altro può inventare una versione più elegante poiché le mie istruzioni SQL tendono a essere più brutali.
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
C'è una buona quantità di informazioni nello schema CHM. Mi aspetto principalmente che queste informazioni siano solo educative e la maggior parte delle persone non interrogherà direttamente le tabelle CHM. Ma questa è una buona informazione da conoscere e può aiutare gli altri.