Uma das minhas instâncias escravas do mysql contém vários arquivos de log binários incomuns
- mysql-bin.023896 250,01 MB 2023-10-11 08:30:06.478997000 (última modificação)
- mysql-bin.023897 2,27 GB 2023-10-11 11:27:23.128550000
- mysql-bin.023898 15,67 MB 11/10/2023 11:27:23.261558000
- mysql-bin.023899 281Bytes 11/10/2023 11:27:24.967536000
- mysql-bin.023900 250,01 MB 2023-10-11 12:26:16.466269000
Por normal, quero dizer que o tamanho deve ser 250 MB (max_binlog_size é 250 MB), mas mysql-bin.023897
contém 2,27 GB, e o subsequente é 15,67 MB, então o próximo é mysql-bin.023899
ridiculamente pequeno, seu tamanho é de apenas centenas de bytes...
O conteúdo de mysql-bin.023899
não diz nada além de que o mysql gravará logs binários emmysql-bin.023900
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#231011 3:25:16 server id 1630115779 end_log_pos 123 CRC32 0x29f40f84 Start: binlog v 4, server v 5.7.26-log created 231011 3:25:16
BINLOG '
HKUlZQ/DlylhdwAAAHsAAAAAAAQANS43LjI2LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AYQP9Ck=
'/*!*/;
# at 123
#231011 3:25:16 server id 1630115779 end_log_pos 234 CRC32 0x0acbf66f Previous-GTIDs
# ac711cc5-2cff-11ed-82c4-5c6f69e9b080:1-7268,
# ef8421a8-2cf4-11ed-9afa-5c6f69e75ed0:117-1391824263
# at 234
#231011 3:25:16 server id 1630115779 end_log_pos 281 CRC32 0x23f57343 Rotate to mysql-bin.023900 pos: 4
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*/;
Questões
Por que o tamanho do binlog aumenta para 2,27 GB de repente e diminui para 15,67 MB, 281 Bytes posteriormente? O conteúdo de mysql-bin.023897 mostra que ele contém uma grande transação. Essa poderia ser a causa raiz?
Não seria bobagem o MySQL registrar apenas um evento de rotação em mysql-bin.023899 e pular para o próximo arquivo binlog? Por que o MySQL está fazendo isso?
O MySQL fecha o arquivo de log binário atual e abre o próximo arquivo de log binário quando qualquer uma das seguintes situações acontecer:
O servidor MySQL é reiniciado.
Alguém corre
FLUSH LOGS;
ouFLUSH BINARY LOGS;
. É possível que alguém tenha feito isso duas vezes em rápida sucessão, então um arquivo binlog foi aberto, mas não obteve nenhum evento antes de ser fechado e o próximo arquivo binlog foi aberto. Consulte https://dev.mysql.com/doc/refman/8.0/en/log-file-maintenance.htmlO arquivo binlog atual excede
max_binlog_size
. Mas o arquivo pode ultrapassar isso, porque o MySQL não dividirá as alterações associadas a uma transação, e as transações praticamente não têm limite de tamanho.Referência: https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_max_binlog_size diz:
Com isso em mente, faz sentido que alguns arquivos de log binários possam ser muito pequenos e outros possam ser inesperadamente grandes?