Gerenciamento de registro de banco de dados MySQL
Prefácio
O serviço MySQL também tem muitos tipos de logs. Os logs estão envolvidos no backup de dados do banco de dados, recuperação de dados, solução de problemas e ajuste do servidor. A seguir, falaremos sobre o gerenciamento de log do MySQL em detalhes
Este ambiente é baseado no sistema Centos 7.8 para construir o MySQL-5.7.14 para
construção específica, consulte a construção do ambiente MySQL-5.7.14
Log do MySQL
Arquivo de log | Tipo de informação no arquivo de log |
---|---|
Log de erros | Registre os problemas que ocorrem ao iniciar, executar ou parar |
Log de consulta | Registre conexões de clientes estabelecidas e instruções executadas |
Log binário | Registre todas as declarações de dados de alteração. Usado principalmente para replicação e recuperação point-in-time |
Log lento | Registrar todas as consultas cujo tempo de execução exceda log_query_time segundos ou consultas que não devem usar índices |
Log de transações | Registre os registros gerados durante a execução de mecanismos de armazenamento compatíveis, como InnoDB |
1. Registro de erros
O log de erros registra principalmente os seguintes tipos de logs
- Informações durante a inicialização e desligamento do servidor
- Mensagem de erro durante a operação do servidor
- Informações geradas pelo programador de eventos por um tempo
- Informações geradas quando o processo do servidor escravo é iniciado no servidor escravo
Gerenciar registros de erros
O log de erros do MySQL é armazenado no diretório datadir (diretório de dados) por padrão,
mas também podemos definir manualmente o caminho de armazenamento do arquivo de log
1. Caminho do caminho de armazenamento padrão do log
[root@mysql-yum ~]# vim /etc/my.cnf
log-error=/var/log/mysqld.log
[root@mysql-yum ~]# systemctl restart mysqld
mysql> show global variables like '%log_error%';
+---------------------+---------------------+
| Variable_name | Value |
+---------------------+---------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | /var/log/mysqld.log |
| log_error_verbosity | 3 |
+---------------------+---------------------+
3 rows in set (0.00 sec)
2. O caminho de armazenamento do log não foi especificado
[root@mysql-yum ~]# vim /etc/my.cnf
log-error
[root@mysql-yum ~]# systemctl restart mysqld
mysql> show global variables like '%log_error%';
+---------------------+----------------------------+
| Variable_name | Value |
+---------------------+----------------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | /var/run/mysqld/mysqld.err |
| log_error_verbosity | 3 |
+---------------------+----------------------------+
3 rows in set (0.00 sec)
3. Defina o caminho de armazenamento
[root@mysql-yum ~]# vim /etc/my.cn
log-error=mysql-yum
[root@mysql-yum ~]# systemctl restart mysqld
mysql> show global variables like '%log_error%';
+---------------------+-----------------+
| Variable_name | Value |
+---------------------+-----------------+
| binlog_error_action | ABORT_SERVER |
| log_error | ./mysql-yum.err |
| log_error_verbosity | 3 |
+---------------------+-----------------+
3 rows in set (0.00 sec)
Nota: o log de erros do MySQL é armazenado no diretório de dados
2. Log de consulta
Log de consulta: registra conexões de clientes estabelecidas e instruções executadas
Abrir log de consulta
[root@mysql-yum ~]# vim /etc/my.cnf
general_log=on
[root@mysql-yum ~]# systemctl restart mysqld
Ver o status do registro
mysql> show global variables like '%general_log%';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log | ON |
| general_log_file | /var/lib/mysql/mysql-yum.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
mysql> show global variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
# 执行查询语句
mysql> show databases;
mysql> select database();
Ver registros de log
Três, log de consulta lenta
Registro lento: registra todas as consultas cujo tempo de execução excede log_query_time segundos ou consultas que não devem usar o índice
Função: usado principalmente para ajuste do servidor
Definir início lento do registro e tempo de consulta
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.22 sec)
mysql> set global long_query_time=3;
Query OK, 0 rows affected (0.00 sec)
# 查看日志设定
mysql> show global variables like '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/mysql-yum-slow.log |
+---------------------+-----------------------------------+
2 rows in set (0.00 sec)
mysql> show global variables like '%long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 3.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
Quarto, o log binário
Qual é o log binário?
- O log binário contém todas as instruções que têm dados atualizados ou têm dados potencialmente atualizados (por exemplo, um DELETE que não corresponde a nenhuma linha)
- As declarações são armazenadas na forma de "eventos", que descrevem as alterações de dados. O log binário também contém informações sobre o tempo de execução de cada instrução que atualiza o banco de dados. Não contém instruções que não modificam nenhum dado.
O papel do log binário?
- O objetivo principal do log binário é atualizar o banco de dados o máximo possível durante a recuperação (recuperação pontual) quando o banco de dados está com defeito, porque o log binário contém todas as atualizações realizadas após o backup
- O log binário também é usado para registrar todas as instruções que serão enviadas para o servidor escravo no servidor de replicação mestre
No ambiente de produção, geralmente adotamos: executar instruções e registrar os resultados da execução, registrar os logs binários
Abra log_bin
[root@mysql-yum ~]# systemctl restart mysqld
log_bin=mysql-bin
server_id=10
[root@mysql-yum ~]# systemctl restart mysqld
Ver log_bin status de abertura
mysql> show global variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
5 rows in set (0.00 sec)
# 查看二进制日志文件
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
+------------------+-----------+
1 row in set (0.00 sec)
# 查看二进制日志文件内容
mysql> mysql> show binlog events in 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 10 | 123 | Server ver: 5.7.14-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 10 | 154 | |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
2 rows in set (0.00 sec)
Exibir conteúdo log_bin
[root@mysql-yum ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#210129 11:06:37 server id 10 end_log_pos 123 CRC32 0x323c980c Start: binlog v 4, server v 5.7.14-log created 210129 11:06:37 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
vXsTYA8KAAAAdwAAAHsAAAABAAQANS43LjE0LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC9exNgEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AQyYPDI=
'/*!*/;
# at 123
#210129 11:06:37 server id 10 end_log_pos 154 CRC32 0xb271a2b4 Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
Principal: a versão superior do MySQL, a instrução em log_bin foi criptografada e precisa ser decodificada para visualizar
Quando log_bin está habilitado, o número do server_id precisa ser especificado, e este valor é único no cluster de servidor MySQL
Excluir log_bin
# 多西刷新log_bin
mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
# 查看所有的log_bin
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 201 |
| mysql-bin.000002 | 201 |
| mysql-bin.000003 | 201 |
| mysql-bin.000004 | 201 |
| mysql-bin.000005 | 154 |
+------------------+-----------+
5 rows in set (0.00 sec)
# 删除日志
---方法一:按照日志名字删除
mysql> purge binary logs to 'mysql-bin.000003';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000003 | 201 |
| mysql-bin.000004 | 201 |
| mysql-bin.000005 | 154 |
+------------------+-----------+
3 rows in set (0.00 sec)
---方法二:按照日志删除
mysql> purge binary logs before '2021-01-29 11:24:37';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000004 | 201 |
| mysql-bin.000005 | 154 |
+------------------+-----------+
2 rows in set (0.00 sec)
---方法三:删除所有日志,重新从第一编号开始,重新记录日志
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
+------------------+-----------+
1 row in set (0.01 sec)
Observação: os arquivos de log binários não podem ser excluídos diretamente. Se você usar comandos como rm para excluir os arquivos de log diretamente, o banco de dados pode falhar.
1. Excluir com comando de purga 2. Excluir
com comando de redefinição