Oracle Grid Infrastructure incluye Cluster Health Monitor (CHM), que captura regularmente información de rendimiento relacionada con el sistema operativo. En versiones anteriores, CHM usaba Berkeley DB para su almacén de datos. En Grid Infrastructure 12.1.0.2, ahora se requiere usar una base de datos Oracle para el almacén de datos. Esta base de datos de Oracle se denomina Repositorio de gestión de infraestructura de cuadrícula (GIMR). Mucha gente ya sabe que GIMR se ejecuta con el nombre de base de datos "-MGMTDB" y se ejecuta en un solo nodo del clúster GI. En caso de que ese nodo esté disponible, GI iniciará automáticamente el GIMR en un nodo restante.
El párrafo anterior trata sobre toda la información de fondo que voy a proporcionar sobre el GIMR. Si el lector quiere saber más, ciertamente puede hacer una búsqueda en la web para obtener información sobre cómo administrar (qué poca administración se necesita de esta base de datos) y cómo iniciar y detener la base de datos y su oyente dedicado.
Esta publicación de blog tiene la intención de educar al lector sobre cómo acceder a la base de datos GIMR y extraer información significativa de ella. Más búsquedas en la web pueden mostrar cómo usar las utilidades de la línea de comandos para exportar datos desde el GIMR. Y hay una utilidad gráfica, CHMOSG, que se puede usar para ver los datos CHM en el repositorio. Pero solo por diversión, pensé en mostrar cómo llegar a los datos directamente.
Primero, necesita saber en qué nodo se está ejecutando la base de datos. En cualquier nodo, puedo emitir lo siguiente:
[oracle@host01 bin]$ cd /u01/app/crs12.1.0.2[oracle@host01 bin]$ ./crs_stat -t | grep -i mgmtora.MGMTLSNR ora....nr.type ONLINE ONLINE host01 ora.mgmtdb ora....db.type ONLINE ONLINE host01
Lo anterior muestra que la base de datos y el oyente se ejecutan en host01. Ahora que conozco el nodo de la instancia, puedo iniciar sesión en ese nodo y configurar mis variables de entorno para conectarme a la instancia. Esta base de datos se ejecuta en el hogar de Grid Infrastructure, no en el hogar de RDBMS. Entonces necesito configurar mi ORACLE_HOME correctamente. Además, el nombre de la instancia comienza con un guión, por lo que debo envolver el SID entre comillas dobles.
[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"
Ahora puedo conectarme a la instancia y verificar que estoy conectado a la correcta.
[oracle@host01 ~]$ sqlplus /nolog
SQL*Plus:versión 12.1.0.2.0 Producción el lunes 21 de diciembre a las 15:17:21 de 2015
Copyright (c) 1982, 2014, Oracle. Todos los derechos reservados.
SQL> conectar / como sysdbaConnected.SQL> seleccionar nombre_instancia de v$instancia;
NOMBRE_INSTANCIA-----------------MGMTDB
Esta base de datos es una base de datos multiinquilino de Oracle, que es un PDB. Necesito determinar el nombre de PDB. El nombre de PDB será el mismo que el nombre del clúster. Puedo recordar el nombre del clúster consultando V$ACTIVE_SERVICES.
SQL> seleccione nombre, con_id 2 de v$active_services;
NOMBRE CON_ID--------------------------------------------- -------- ----------mi_clúster 3-MGMTDBXDB 1_mgmtdb 1SYS$ANTECEDENTES 1SYS$USUARIOS 1
SQL> alter session set container=my_cluster;
Sesión alterada.
Solo un servicio tiene la identificación del contenedor que no es igual a 1 (1 es el CDB), por lo que debe ser el PDB que estoy buscando. Modifico mi sesión para usar el PDB como su contenedor.
Mi próxima tarea es obtener una lista de tablas propiedad de CHM.
SQL> seleccione table_name de dba_tables donde propietario='CHM' 2 ordene por table_name;
NOMBRE_TABLA---------------------------------------------- ----------------------------------CHMOS_ACTIVE_CONFIG_INT_TBLCHMOS_ASM_CONFIG_INT_TBLCHMOS_CPU_INT_TBLCHMOS_DEVICE_INT_TBLCHMOS_FILESYSTEM_INT_TBLCHMOS_NIC_INT_TBLCHMOS_PROCESS_INT_TBLCHMOS_STATIC_CONFIG_INT_TBLCHMOS_SYSTEM_PERIODIC_INT_TBLCHMOS_SYSTEM_SINT_TBLAMPLEINT_TBLAMPLESolo 10 tablas en el esquema. La primera tabla de la lista muestra información de configuración sobre los hosts supervisados por CHM.
SQL> seleccione el nombre de host, NUMPHYCPUS, NUMCPUS, NUMDISKS 2 de CHM.CHMOS_ACTIVE_CONFIG_INT_TBL;NOMBRE DE HOST NUMPHYCPUS NUMCPUS NUMDISKS---------- ---------- ---------- ----------host01 1 2 3host02 1 2 3Puedo ver que CHM está recopilando información sobre dos nodos en el clúster. Puedo ver la cantidad de CPU físicas para cada nodo y la cantidad de núcleos totales (2). Estos nodos también tienen 3 discos.
También podemos obtener información sobre el sistema operativo.
SQL> seleccione nombre de host, osname, tipo de chip 2 de CHM.CHMOS_STATIC_CONFIG_INT_TBL;NOMBRE DE HOST NOMBRE DEL SO TIPO DE CHIP---------- ---------- --------------------host01 Linux Intel( R)host02 Linux Intel(R)Hay una buena cantidad de información en estas tablas y solo se necesita un poco de prueba y error para descubrir qué hay allí. Por ejemplo, puedo usar esta consulta para obtener un recuento de los procesos que se ejecutan en host01 ordenados a lo largo del tiempo.
seleccionar hora de inicio, contar (*) de CHM.CHMOS_PROCESS_INT_TBLdonde hostname='host01'agrupar por hora de inicioordenar por hora de inicio;Intencionalmente no incluí el resultado ya que sería demasiado largo para una publicación de blog. Aquí hay algunas consultas de muestra más que puede probar en su base de datos GIMR.
Actividad de E/S de disco para un host específico a lo largo del tiempo.
seleccione la hora de inicio,DISK_BYTESREADPERSEC/1024/1024 como MB_READ_SEC,DISK_BYTESWRITTENPERSEC/1024/1024 como MB_WRITE_SEC,DISK_NUMIOSPERSEC como IO_PER_SECde CHM.CHMOS_SYSTEM_SAMPLE_INT_TBLdonde hostname='host01'ordene por hora de inicio;Intercambio en un host específico con el tiempo.
seleccione la hora de inicio,swpin,swpout de CHM.CHMOS_SYSTEM_SAMPLE_INT_TBLwhere hostname='host01'order by begintime;La siguiente instrucción SQL calculará un histograma de la actividad de E/S del disco. Estoy seguro de que a alguien más se le ocurrirá una versión más elegante, ya que mis sentencias SQL tienden a ser más de fuerza bruta.
seleccione primero.num_count como "<=10ms", segundo.num_count como "<=20ms", tercero.num_count como "<=50ms", four.num_count como "<=100ms", quinto.num_count como "<=500ms", final.num_count como ">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 donde devid='sda1' y latencia entre 11 y 20) segundo,(seleccione count(*) como num_count from CHM.CHMOS_DEVICE_INT_TBL donde devid='sda1' y latencia entre 21 y 50) tercero,(seleccione count(*) como num_count de CHM.CHMOS_DEVICE_INT_TBL donde devid='sda1' y latencia entre 51 y 100) cuarto,(seleccione count(*) como num_count de CHM.CHMOS_DEVICE_INT_TBL donde devid='sda1' y latencia entre 101 y 500) quinto,(seleccione count(*) como num_count de CHM.CHMOS_DEVICE_INT_TBL donde devid='sda1' y latencia> 500) final;<=10ms <=20ms <=50ms <=100ms <=500ms>500ms---------- ---------- ---------- ---------- ---------- ---------- 150693 10 1 0 0 0
Hay una buena cantidad de información en el esquema CHM. Espero principalmente que esta información sea solo educativa y que la mayoría de las personas no consulten las tablas CHM directamente. Pero esta es una buena información para saber y puede ayudar a otros.