O Oracle Grid Infrastructure inclui o Cluster Health Monitor (CHM) que captura regularmente informações de desempenho relacionadas ao sistema operacional. Nas primeiras versões, o CHM usa um Berkeley DB para seu armazenamento de dados. No Grid Infrastructure 12.1.0.2, agora é necessário usar um banco de dados Oracle para o armazenamento de dados. Esse banco de dados Oracle é chamado de Grid Infrastructure Management Repository (GIMR). Muitas pessoas já sabem que o GIMR é executado com o nome de banco de dados “-MGMTDB” e é executado em apenas um nó do cluster GI. Caso esse nó fique disponível, o GI iniciará automaticamente o GIMR em um nó restante.
O parágrafo acima é sobre todas as informações básicas que vou fornecer sobre o GIMR. Se o leitor quiser saber mais, certamente pode fazer uma pesquisa na web para obter informações sobre como gerenciar (o pouco gerenciamento necessário desse banco de dados) e como iniciar e parar o banco de dados e seu ouvinte dedicado.
Esta postagem de blog pretende educar o leitor sobre como acessar o banco de dados GIMR e extrair informações significativas dele. Mais pesquisas na web podem mostrar como usar utilitários de linha de comando para exportar dados do GIMR. E há um utilitário gráfico, CHMOSG, que pode ser usado para visualizar os dados CHM no repositório. Mas apenas por diversão, pensei em mostrar como obter os dados diretamente.
Primeiro, você precisa saber em qual nó o banco de dados está sendo executado. Em qualquer nó, posso emitir o seguinte:
[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
O acima mostra que o banco de dados e o ouvinte estão sendo executados no host01. Agora que conheço o nó da instância, posso entrar nesse nó e definir minhas variáveis de ambiente para se conectar à instância. Esse banco de dados é executado fora do Grid Infrastructure home, não do RDBMS home. Então eu preciso configurar meu ORACLE_HOME corretamente. Além disso, o nome da instância começa com um traço, então preciso colocar o SID entre aspas duplas.
[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"
Agora posso me conectar à instância e verificar se estou conectado à instância adequada.
[oracle@host01 ~]$ sqlplus /nolog
SQL*Plus:Produção da versão 12.1.0.2.0 em segunda-feira, 21 de dezembro 15:17:21 2015
Direitos autorais (c) 1982, 2014, Oracle. Todos os direitos reservados.
SQL> connect / as sysdbaConnected.SQL> selecione instance_name de v$instance;
INSTANCE_NAME-----------------MGMTDB
Esse banco de dados é um banco de dados multilocatário Oracle, que é um PDB. Eu preciso determinar o nome do PDB. O nome do PDB será igual ao nome do cluster. Posso me lembrar do nome do cluster consultando V$ACTIVE_SERVICES.
SQL> selecione o nome,con_id 2 de v$active_services;
NOME CON_ID-------------------------------------------------------- -------- ----------meu_cluster 3-MGMTDBXDB 1_mgmtdb 1SYS$BACKGROUND 1SYS$USERS 1
SQL> alterar o conjunto de sessões container=my_cluster;
Sessão alterada.
Apenas um serviço tem o ID do container diferente de 1 (1 é o CDB) então deve ser o PDB que estou procurando. Modifico minha sessão para usar o PDB como seu contêiner.
Minha próxima tarefa é obter uma lista de tabelas pertencentes ao CHM.
SQL> selecione table_name de dba_tables onde owner='CHM' 2 ordene por table_name;
TABLE_NAME---------------------------------------------- ----------------------------------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_SAMPLE_INT_TBL
Apenas 10 tabelas no esquema. A primeira tabela da lista mostra algumas informações de configuração sobre os hosts monitorados pelo CHM.
SQL> selecione o nome do host,NUMPHYCPUS,NUMCPUS,NUMDISKS 2 de CHM.CHMOS_ACTIVE_CONFIG_INT_TBL;HOSTNAME NUMPHYCPUS NUMCPUS NUMDISKS---------- ---------- ---------- ----------host01 1 2 3host02 1 2 3
Posso ver que o CHM está coletando informações sobre dois nós no cluster. Posso ver o número de CPUs físicas para cada nó e o número total de núcleos (2). Esses nós também possuem 3 discos.
Também podemos aprender informações sobre o sistema operacional.
SQL> selecione hostname,osname,chiptype 2 de CHM.CHMOS_STATIC_CONFIG_INT_TBL;HOSTNAME OSNAME CHIPTYPE---------- ---------- --------------------host01 Linux Intel( R)host02 Linux Intel(R)
Há uma boa quantidade de informações nessas tabelas e é preciso apenas algumas tentativas e erros para descobrir o que está lá. Por exemplo, posso usar essa consulta para obter uma contagem de processos em execução no host01 ordenados ao longo do tempo.
selecione a hora de início, contagem(*) de CHM.CHMOS_PROCESS_INT_TBL onde hostname='host01'agrupe por hora de inícioordem por hora de início;
Eu intencionalmente não incluí a saída, pois seria muito longa para uma postagem no blog. Aqui estão mais algumas consultas de amostra que você pode experimentar em seu banco de dados GIMR.
Atividade de E/S de disco para um host específico ao longo do tempo.
selecione a hora de início,DISK_BYTESREADPERSEC/1024/1024 como MB_READ_SEC,DISK_BYTESWRITTENPERSEC/1024/1024 como MB_WRITE_SEC,DISK_NUMIOSPERSEC como IO_PER_SEC de CHM.CHMOS_SYSTEM_SAMPLE_INT_TBLonde hostname='host01'ordem por hora de início;
Trocando em um host específico ao longo do tempo.
selecione hora de início,swpin,swpoutde CHM.CHMOS_SYSTEM_SAMPLE_INT_TBLonde hostname='host01'ordenar por hora de início;
A próxima instrução SQL calculará um histograma da atividade de E/S do disco. Tenho certeza de que outra pessoa pode criar uma versão mais elegante, pois minhas instruções SQL tendem a ser mais força bruta.
selecione first.num_count como "<=10ms", second.num_count como "<=20ms", third.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 onde devid='sda1' e latência entre 0 e 10) primeiro,(select count(*) as num_count from CHM .CHMOS_DEVICE_INT_TBL onde devid='sda1' e latência entre 11 e 20) segundo,(selecione contagem(*) como num_count de CHM.CHMOS_DEVICE_INT_TBL onde devid='sda1' e latência entre 21 e 50) terceiro,(selecione contagem(*) como num_count de CHM.CHMOS_DEVICE_INT_TBL onde devid='sda1' e latência entre 51 e 100) quarto,(selecione count(*) como num_count de CHM.CHMOS_DEVICE_INT_TBL onde devid='sda1' e latência entre 101 e 500) quinto,(selecione count(*) como num_count de CHM.CHMOS_DEVICE_INT_TBL onde devid='sda1' e latência> 500) final;<=10ms <=20ms <=50ms <=100ms <=500ms>500ms---------- ---------- ---------- ---------- ---------- ---------- 150693 10 1 0 0 0
Há uma boa quantidade de informações no esquema CHM. Espero principalmente que esta informação seja apenas educacional e que a maioria das pessoas não esteja consultando as tabelas CHM diretamente. Mas esta é uma boa informação para saber e pode ajudar outras pessoas.