Operação e manutenção do MySQL Monitoramento básico do banco de dados 25-MySQL

1. Monitore se o status do encadeamento é anormal com base em SHOW PROCESSLIST

  1. As operações correspondentes à maioria dos estados em um thread são muito rápidas.Se um thread permanecer em um determinado estado por vários segundos, pode haver um problema .
  2. Estados comuns de threads são os seguintes:
    • Suspensão: a thread está aguardando uma nova consulta do cliente.
    • Consulta: a thread está executando uma consulta ou enviando resultados para o cliente.
    • Bloqueado: A thread está aguardando um bloqueio de tabela.
    • Analisando e estatísticas: O encadeamento está obtendo estatísticas do mecanismo de armazenamento e otimizando as consultas.
    • Copiando para a tabela tmp [no disco]: O encadeamento está processando a consulta e copiando os dados para a tabela temporária. Se for seguido pelas palavras "no disco", significa que o MySQL está convertendo a tabela temporária de memória em uma tabela temporária de disco.
    • Classificando o resultado: o thread está classificando o conjunto de resultados.
    • Enviando dados: Existem muitas possibilidades para este estado, pode ser para transferir dados internamente ou para retornar o conjunto de resultados para o cliente.
  3. A proporção de threads em diferentes estados pode ser obtida analisando os resultados de SHOW PROCESSLIST. A seguir, exemplos de declarações específicas:
# mysql --login-path=fastlogin  -e 'SHOW PROCESSLIST\G' | grep Command: | sort | uniq -c | sort -rn
      6 Command: Sleep
      1 Command: Query
      1 Command: Binlog Dump

2. Monitore os custos de execução do SQL com base nas variáveis ​​de status SELECT

2.1. Uso básico

  1. Execute o seguinte comando para visualizar a variável de status Select:
mysql> SHOW STATUS LIKE 'Select%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Select_full_join       | 0     |
| Select_full_range_join | 0     |
| Select_range           | 0     |
| Select_range_check     | 0     |
| Select_scan            | 0     |
+------------------------+-------+
5 rows in set (0.01 sec)
  1. As três variáveis ​​a seguir precisam de atenção, especialmente as relativamente altas Select_scan e Select_full_join significa que há um problema com a instrução de consulta ou o índice não está sendo usado corretamente .
    1. Select_full_join: registra o número de operações FULL JOIN e verificações completas de tabelas realizadas durante consultas SELECT. Verificação completa da tabela refere-se à situação em que o MySQL precisa verificar a tabela inteira quando nenhum índice é usado ou o índice não pode ser usado. FULL JOIN corresponde a todos os registros nas duas tabelas, incluindo aqueles não correspondentes em uma das tabelas.
    2. Select_scan: registra o número de varreduras de tabela completa usadas em consultas SELECT. Ao contrário da variável Select_full_join, Select_scan registra o número de consultas SELECT que executam verificações completas de tabela, não apenas consultas que usam operações FULL JOIN. Portanto, o valor da variável Select_scan pode ser maior que o valor da variável Select_full_join.
    3. Select_full_range_join: registra o número de vezes que o algoritmo Range Search é usado para verificações de tabela completa durante a consulta SELECT.

2.2. Monitorar custos de execução SQL específicos com base em SHOW SESSION STATUS

  1. Execute SHOW SESSION STATUS para visualizar as variáveis ​​de status da sessão atual. Às vezes, precisamos analisar o custo de algumas consultas específicas separadamente, podemos analisá-lo observando as variáveis ​​de estado na sessão
  2. No entanto, antes do monitoramento e da análise, você precisa limpar manualmente a variável de status para zero (FLUSH STATUS), executar a consulta e, finalmente, executar novamente SHOW SESSION STATUS para monitorar o custo de uma consulta específica.
  3. O exemplo a seguir mostra como analisar o custo de uma consulta específica.
mysql> FLUSH STATUS;			# 清除状态变量
mysql> SELECT SQL_NO_CACHE ... from ...    	# 运行查询语句
mysql> SHOW SESSION STATUS LIKE‘Select%’;	# 重新查询状态变量
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Select_full_join       | 0     |
| Select_full_range_join | 0     |
| Select_range           | 0     |
| Select_range_check     | 0     |
| Select_scan            | 2     |
+------------------------+-------+

3. Monitore as variáveis ​​de estado relacionadas à operação do mecanismo de armazenamento (Handler%)

  1. O seguinte comando examinará as variáveis ​​de status relacionadas à operação do mecanismo de armazenamento:
mysql> SHOW SESSION STATUS LIKE 'Handler%';
+------------------------+---------+
| Variable_name     | Value |
+------------------------+---------+
| Handler_commit |     0     |
| Handler_delete    |     0     |
| Handler_discover |     0     |
| Handler_prepare |     0     |
| Handler_read_first |   1    |
| Handler_read_key | 5665 |
| Handler_read_next | 5662 
| Handler_read_prev | 0 | DESC。
| Handler_read_rnd | 200 |
| Handler_read_rnd_next | 207 |
| Handler_rollback | 0 |
| Handler_savepoint | 0 |
| Handler_savepoint_rollback | 0 |
| Handler_update | 5262 |
| Handler_write | 219 |
  1. Interpretação das principais variáveis ​​nas variáveis ​​de estado acima:
    • Handler_read_first: O número de vezes que o primeiro registro no índice foi lido. Se o valor desta variável for grande, significa que há um grande número de varreduras de índice completo, que precisam ser otimizadas
    • Handler_read_key: O número de vezes que os registros são lidos da tabela por meio do índice ao registrar a consulta. Se o valor for alto, a consulta e os índices da tabela estão corretos.
    • Handler_read_rnd_next: Ao registrar uma consulta, o número de vezes que o próximo registro é lido depois que o registro é lido da tabela por meio de um índice aleatório. Normalmente, um valor alto indica que suas tabelas estão indexadas incorretamente ou que as consultas que estão sendo gravadas não aproveitam os índices.
    • Sort_merge_passes: Registre o número de classificações externas (External Sort) que precisam ser executadas ao executar uma operação de classificação. Algoritmos externos de classificação podem ser usados ​​quando o MySQL precisa classificar grandes quantidades de dados. Um algoritmo de classificação externo divide os dados em blocos, classifica cada bloco e, em seguida, mescla os blocos classificados em um conjunto de dados ordenado. Se o conjunto de dados mesclado precisar ser classificado novamente, pode ser necessário realizar várias classificações externas, e cada classificação é chamada de operação "Mesclar" de uma classificação externa. Se o valor dessa variável for grande, considere aumentar o valor da variável de sistema sort_buffer_size.

4. Monitorar e classificar variáveis ​​de estado relacionadas

  1. Quando há mais verificações completas de tabelas ou classificações externas na classificação, isso geralmente indica que há um problema com o SQL .
  2. O comando a seguir monitorará as estatísticas e variáveis ​​de status relacionadas à classificação:
mysql> SHOW SESSION STATUS LIKE 'Sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 200     |
| Sort_scan         | 1     |
+-------------------+-------+
  1. Interpretação das principais variáveis ​​nas variáveis ​​de estado acima:
    • Sort_rows: O número de linhas que foram classificadas. Se você precisar classificar uma grande quantidade de dados, isso poderá fazer com que o valor de Sort_rows seja relativamente alto. Nesse caso, pode ser necessário otimizar a instrução de consulta, como otimizar o campo de classificação, limitar o número de linhas retornadas e assim por diante.
    • Sort_scan: O número de classificações feitas pela varredura da tabela.

5. Monitore as variáveis ​​de status relacionadas à tabela temporária

  1. Quando há muitas operações de tabela temporária, geralmente indica que há um problema com o SQL .
  2. O seguinte comando irá monitorar as variáveis ​​de status e estatísticas relacionadas à tabela temporária:
mysql> SHOW STATUS LIKE 'Created_tmp%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
| Created_tmp_files       | 0     |
| Created_tmp_tables      | 5     |
+-------------------------+-------+
  1. Interpretação das principais variáveis ​​nas variáveis ​​de estado acima:
    • Created_tmp_disk_tables: registra o número de vezes que as tabelas temporárias precisam ser criadas no disco durante as operações de consulta. Se continuar a aumentar, pode haver um problema de desempenho.

6、MOSTRAR PERFIL

  1. SHOW PROFILE permite que o MySQL colete os recursos e o tempo consumido ao executar a instrução. Deve-se observar que ativar a análise de desempenho SHOW PROFILE aumentará a carga no servidor, porque o MySQL deve registrar todas as operações durante a execução da consulta. Portanto, você deve ativar a criação de perfil somente quando necessário e desativá-la quando terminar para evitar impactos desnecessários no desempenho do servidor.
  2. A função MOSTRAR PERFIL está desabilitada por padrão, mas pode ser habilitada no nível da sessão.
  3. O exemplo a seguir usará SET profiling=1 para habilitar esse recurso e coletar dados:
mysql> SHOW VARIABLES LIKE 'profiling';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling     | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET profiling = 1;               # 开启SHOW PROFILE功能
mysql> <输入查询语句>;
mysql> SHOW PROFILES;
+----------+------------+--------------------------------+
| Query_ID | Duration   | Query                          |
+----------+------------+--------------------------------+
|        1 | 0.00165600 | SHOW VARIABLES LIKE '%profil%' |
|        2 | 0.00013175 | SELECT DATABASE()              |
|        3 | 0.00319400 | show databases                 |
|        4 | 0.00017325 | show tables                    |
|        5 | 0.13584825 | select count(*) from t1        |
+----------+------------+--------------------------------+
mysql> SET profiling = 0;               # 关闭SHOW PROFILE功能

7, information_schema.tables表

  1. A biblioteca information_schema do MySQL registra o tamanho dos dados de cada biblioteca e tabela e pode contar o crescimento de dados da instância, bem como o crescimento de dados de cada biblioteca e até mesmo de cada tabela. O pessoal de P&D avalia a tendência de crescimento de dados da tabela e a frequência de operação do banco de dados, julgue aproximadamente as características do tráfego do banco de dados do aplicativo, de modo a otimizar o aplicativo do banco de dados de maneira mais direcionada. No ambiente de produção real, podemos consultar regularmente o banco de dados de informações INFORMATION_SCHEMA, inserir o tamanho do banco de dados coletado no banco de dados de monitoramento e realizar análises de tendências espaciais com base nas informações coletadas.
  2. O seguinte classifica as tabelas da biblioteca mytest de grande para pequeno de acordo com a quantidade de dados e índice:
SELECT table_schema,table_name, data_length, index_length FROM information_schema.tables WHERE table_schema='mytest' ORDER BY data_length DESC, index_length DESC;
  1. A consulta a seguir verificará as informações de todas as tabelas subjacentes no banco de dados mytest.
SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE,TABLE_ROWS ,DATA_LENGTH,INDEX_LENGTH,DATA_FREE FROM information_schema.tables WHERE TABLE_SCHEMA=‘mytest' AND TABLE_TYPE='BASE TABLE';
  1. A consulta a seguir contará o tamanho do banco de dados mytest.
SELECT SUM(DATA_LENGTH),SUM(INDEX_LENGTH),SUM(DATA_FREE) FROM information_schema.tables WHERE TABLE_SCHEMA='mytest' AND TABLE_TYPE='BASE TABLE';

8. Resumo

  1. Este artigo resume o monitoramento básico do MySQL. A ideia geral é baseada no monitoramento de variáveis ​​como Select%, Handler%, Sort% e Created_tmp%, e analisa se há um grande número de operações de alto custo, como full varredura de tabela, tabelas temporárias de disco e classificação externa, de modo que analise se a qualidade SQL atual está se deteriorando.
  2. Através da análise estatística da saída de SHOW PROCESSLIST, você pode monitorar se existem threads em um estado anormal.Geralmente, os threads não permanecerão em um determinado estado por mais de 1 segundo (exceto para o estado SLEEP).
  3. Você pode usar a tabela information_schema.tables para contar a tendência de crescimento do volume de dados e a frequência de operação das tabelas do banco de dados, para fazer a otimização direcionada.
  4. Você pode monitorar temporariamente o desempenho do SQL por meio de SHOW PROFILE, mas como essa operação tem impacto no desempenho do banco de dados, ela só pode ser ativada temporariamente e deve ser desativada a tempo.

Acho que você gosta

Origin blog.csdn.net/oddrock/article/details/130215571
Recomendado
Clasificación