O MySQL é um poderoso sistema de gerenciamento de banco de dados relacional de código aberto, e InnoDB é um dos mecanismos de armazenamento mais populares para MySQL. O InnoDB fornece um recurso exclusivo chamado InnoDB Monitor, que gera relatórios que fornecem informações valiosas sobre o desempenho e o funcionamento interno do mecanismo de armazenamento InnoDB. Um desses relatórios é o SHOW ENGINE que pode ser usado para gerar o InnoDB Status Report.

Neste post, vamos nos aprofundar nas várias seções do Relatório de Status do InnoDB e explicar sua importância. Também usaremos um relatório específico como exemplo para ilustrar as informações contidas em cada seção.

O objetivo do relatório de status do InnoDB

O Relatório de Status do InnoDB é uma ferramenta para administradores de banco de dados monitorarem o desempenho e a integridade do mecanismo de armazenamento do InnoDB. Ele fornece informações detalhadas sobre vários aspectos do InnoDB, como transações, semáforos, operações de E/S de arquivo, estatísticas do pool de buffers e muito mais. Essas informações podem ser usadas para identificar possíveis problemas, otimizar o desempenho do banco de dados, e garantir o bom funcionamento do banco de dados.

As seções do relatório de status do InnoDB do SHOW ENGINE STATUS

O Relatório de Status do InnoDB é dividido em várias seções, cada uma fornecendo informações específicas sobre um aspecto específico do mecanismo de armazenamento do InnoDB. Vamos dar uma olhada em cada uma dessas seções usando o seguinte relatório como exemplo:

[Report]
=====================================
2023-05-23 13:03:50 0x7fd470e8e700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 30 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 22157 srv_active, 0 srv_shutdown, 109450 srv_idle
srv_master_thread log flush and writes: 131591
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 54425
OS WAIT ARRAY INFO: signal count 48612
RW-shared spins 42242, rounds 1161128, OS waits 38491
RW-excl spins 26544, rounds 142268, OS waits 300
RW-sx spins 7, rounds 210, OS waits 7
Spin rounds per wait: 27.49 RW-shared, 5.36 RW-excl, 30.00 RW-sx
------------
TRANSACTIONS
------------
Trx id counter 4161696
Purge done for trx's n:o < 4161696 undo n:o < 0 state: running but idle
History list length 21
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 422025418118264, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418114088, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418109912, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418080680, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418105736, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418101560, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418097384, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418093208, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418089032, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418084856, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418076504, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418072328, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418068152, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422025418063976, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
73893 OS file reads, 296298 OS file writes, 192935 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 1.33 writes/s, 1.20 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 45 merges
merged operations:
 insert 56, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
Hash table size 34679, node heap has 4 buffer(s)
Hash table size 34679, node heap has 3 buffer(s)
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
0.03 hash searches/s, 3.87 non-hash searches/s
---
LOG
---
Log sequence number 3909935287
Log flushed up to   3909935287
Pages flushed up to 3909935287
Last checkpoint at  3909935278
0 pending log flushes, 0 pending chkp writes
123352 log i/o's done, 0.80 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 170590208
Dictionary memory allocated 613536
Buffer pool size   8192
Free buffers       1024
Database pages     7151
Old database pages 2619
Modified db pages  0
Percent of dirty pages(LRU & free pages): 0.000
Max dirty pages percent: 75.000
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 2988, not young 501751
0.00 youngs/s, 0.00 non-youngs/s
Pages read 73641, created 771, written 149793
0.00 reads/s, 0.00 creates/s, 0.40 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 7151, unzip_LRU len: 0
I/O sum[21]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=834, Main thread ID=140549977794304, state: sleeping
Number of rows inserted 6761, updated 29723, deleted 212, read 10292734
0.00 inserts/s, 0.13 updates/s, 0.00 deletes/s, 0.27 reads/s
Number of system rows inserted 0, updated 0, deleted 0, read 0
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

MOSTRAR STATUS DO INNODB ENGINE

Obter o Relatório de Status do InnoDB Monitor é um processo simples. Você pode gerar esse relatório executando um comando SQL específico no cliente MySQL. Aqui estão os passos:

  1. Acesse o Cliente MySQL: Primeiro, você precisa acessar o cliente MySQL. Você pode fazer isso abrindo seu terminal ou prompt de comando e digitando o seguinte comando:
mysql -u yourusername -p

Substitua yourusername pelo seu nome de usuário do MySQL. Depois de pressionar enter, será solicitada sua senha. Depois de fazer isso, você estará logado no cliente MySQL.

  1. Defina o banco de dados: Se você deseja gerar o relatório de status do InnoDB para um banco de dados específico, você precisa definir o uso deste database. Você pode fazer isso digitando o seguinte comando:
USE yourdatabase;

Substitua `yourdatabase`` pelo nome do banco de dados. Se você quiser gerar o relatório para toda a instância do MySQL, você pode ignorar esta etapa.

  1. Gerar o Relatório de Status do InnoDB: Agora, você pode gerar o Relatório de Status do InnoDB executando o comando ‘SHOW ENGINE INNODB STATUS`:
SHOW ENGINE INNODB STATUS\G

O \G no final do comando é usado para formatar a saída de uma forma mais legível. Depois de executar esse comando, o Relatório de Status do InnoDB será exibido em seu terminal ou prompt de comando.

Lembre-se de que você precisa ter os privilégios necessários para executar o comando SHOW ENGINE INNODB STATUS. Se você estiver recebendo um erro de permissão, certifique-se de que seu usuário do MySQL tenha o privilégio PROCESS ou SUPER.

Seções do Relatório de Engine Innodb Status do Monitor

BACKGROUND THREAD

A seção Thread em segundo plano fornece informações sobre a atividade do thread mestre. O thread mestre é responsável por várias tarefas em segundo plano, como liberar dados para o disco e mesclar buffers de inserção.

Em nosso relatório de exemplo, vemos o seguinte:

srv_master_thread loops: 22157 srv_active, 0 srv_shutdown, 109450 srv_idle
srv_master_thread log flush and writes: 131591

Isso nos informa que o thread mestre esteve ativo 22157 vezes, ocioso 109450 vezes e não esteve no modo de desligamento. Ele também executou 131591 liberações e gravações de log.

Semáforos

Semáforos são primitivas de sincronização usadas para controlar o acesso a recursos compartilhados. A seção Semáforos fornece informações sobre o uso de semáforos no InnoDB.

Em nosso relatório de exemplo, vemos o seguinte:

OS WAIT ARRAY INFO: reservation count 54425
OS WAIT ARRAY INFO: signal count 48612
RW-shared spins 42242, rounds 1161128, OS waits 38491
RW-excl spins 26544, rounds 142268, OS waits 300
RW-sx spins 7, rounds 210, OS waits 7
Spin rounds per wait: 27.49 RW-shared, 5.36 RW-excl, 30.00 RW-sx

Isto diz-nos que houve 54425 reservas de semáforos e 48612 sinais de semáforos. Os valores RW-shared, RW-excl e RW-sx fornecem informações sobre o uso de bloqueios compartilhados, exclusivos e compartilhados, respectivamente.

Transações

A seção Transações fornece informações sobre as transações atuais no InnoDB.

Em nosso relatório de exemplo, vemos o seguinte:

Trx id counter 4161696
Purge done for trx's n:o < 4161696 undo n:o < 0 state: running but idle
History list length 21
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 422025418118264, not started
0 lock struct(s), heap size 1128, 0 row lock(s)

Isso nos informa que o contador de ID de transação atual está 4161696 e a operação de limpeza foi concluída para transações com IDs menores que 4161696. O comprimento da lista de histórico é 21, o que indica o número de logs de desfazer que ainda não foram limpos. A lista de transações para cada sessão

fornece informações detalhadas sobre cada transação, incluindo sua ID, status e o número de bloqueios que ela mantém.

Arquivo I/O

A seção E/S de arquivo fornece informações sobre as operações de entrada/saída de arquivo executadas pelo InnoDB. Isso inclui o estado dos threads de E/S, o número de leituras e gravações pendentes e o número de leituras, gravações e fsyncs de arquivos.

Em nosso relatório de exemplo, vemos o seguinte:

I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
...
73893 OS file reads, 296298 OS file writes, 192935 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 1.33 writes/s, 1.20 fsyncs/s

Isso nos informa que todos os threads de E/S estão aguardando solicitações aio concluídas. Ele também fornece o número total de leituras, gravações e fsyncs de arquivos, bem como o número médio dessas operações por segundo.

Inserção de buffer e índice de hash adaptável

A seção de Inserção de buffer e índice de hash adaptável fornece informações sobre o buffer de inserção e o índice de hash adaptável, que são dois recursos importantes do InnoDB que ajudam a melhorar o desempenho.

Em nosso relatório de exemplo, vemos o seguinte:

Ibuf: size 1, free list len 0, seg size 2, 45 merges
merged operations:
 insert 56, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 34679, node heap has 2 buffer(s)
...
0.03 hash searches/s, 3.87 non-hash searches/s

Isso nos diz que o tamanho do buffer de inserção é 1, não há blocos livres no buffer de inserção e o tamanho do segmento é 2. Ele também fornece informações sobre o número de operações mescladas e descartadas, o tamanho da tabela de hash e o número de pesquisas de hash e não-hash por segundo.

Log

A seção Log fornece informações sobre o log do InnoDB, que é usado para garantir a consistência dos dados e para se recuperar de falhas.

Em nosso relatório de exemplo, vemos o seguinte:

Log sequence number 3909935287
Log flushed up to   3909935287
Pages flushed up to 3909935287
Last checkpoint at  3909935278
0 pending log flushes, 0 pending chkp writes
123352 log i/o's done, 0.80 log i/o's/second

Isso nos informa o número de sequência de log atual, o ponto até o qual o log foi liberado, o número de páginas liberadas e o ponto do último ponto de verificação. Ele também fornece o número de liberações de log pendentes e gravações de ponto de verificação e o número de operações de E/S de log por segundo.

Pool de buffer e memória

A seção Pool de buffers e memória fornece informações sobre o pool de buffers do InnoDB, que é um cache para dados e índices na memória.

Em nosso relatório de exemplo, vemos o seguinte:

Total large memory allocated 170590208
Dictionary memory allocated 613536
Buffer pool size   8192
Free buffers       1024
Database pages     7151
Old database pages 2619
Modified db pages  0
Percent of dirty pages(LRU & free pages): 0.000
Max dirty pages percent: 75.000
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 2988, not young 501751
0.00 youngs/s, 0.00 non-young

s/s
Pages read 73641, created 771, written 149793
0.00 reads/s, 0.00 creates/s, 0.40 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 7151, unzip_LRU len: 0
I/O sum[21]:cur[0], unzip sum[0]:cur[0]

Esta seção fornece uma riqueza de informações sobre o pool de buffers, incluindo a memória total alocada, o tamanho do pool de buffers, o número de buffers livres, o número de páginas de banco de dados, o número de páginas de banco de dados antigas, o número de páginas de banco de dados modificadas, a porcentagem de páginas sujas, a porcentagem máxima de páginas sujas, o número de leituras e gravações pendentes, o número de páginas feitas jovens e não jovens, a taxa de acerto do buffer pool e muito mais.

Operações linha de registro

A seção Operações de Linha de Registro fornece informações sobre as operações de linha executadas pelo InnoDB.

Em nosso relatório de exemplo, vemos o seguinte:

0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=834, Main thread ID=140549977794304, state: sleeping
Number of rows inserted 6761, updated 29723, deleted 212, read 10292734
0.00 inserts/s, 0.13 updates/s, 0.00 deletes/s, 0.27 reads/s
Number of system rows inserted 0, updated 0, deleted 0, read 0
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s

Isso nos informa o número de consultas dentro do InnoDB e na fila, o número de exibições de leitura abertas, a ID do processo e a ID do thread principal, o estado do thread principal e o número de linhas inseridas, atualizadas, excluídas e lidas. Ele também fornece o número dessas operações por segundo.

Conclusão

O SHOW ENGINE INNODB STATUS é um Monintor InnoDB para Status Report sendo uma ferramenta poderosa para monitorar o desempenho e a integridade do mecanismo de armazenamento InnoDB.

Ao compreender as informações fornecidas em cada seção do relatório, os administradores de banco de dados podem identificar possíveis problemas, otimizar o desempenho do banco de dados e garantir o bom funcionamento do banco de dados.