expire_logs_days pode ter menos de 1 dia no MySQL?

expire_logs_days pode ter menos de 1 dia no MySQL?

Então... ontem recebi um "e-mail pós-fato" sobre uma campanha que começou para um dos serviços que executo. Agora o servidor de banco de dados está sendo sobrecarregado, ao ritmo de cerca de 300 MB/min no log binário para a replicação. Como você pode imaginar, isso está consumindo espaço a uma velocidade tremenda.

Minha expiração normal de 7 dias de logs binários simplesmente não é suficiente. Recorri ao truncamento de logs apenas nas últimas 4 horas com (estou verificando se a replicação está atualizada com mk-heartbeat):

PURGE MASTER LOGS BEFORE DATE_SUB( NOW(), INTERVAL 4 HOUR);

Estou apenas executando isso do cron a cada poucas horas para enfrentar a tempestade, mas isso me fez questionar o valor mínimo para expire_logs_days. Não encontrei um valor menor que 1, mas isso não significa que não seja possível.http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_expire_logs_daysfornece o tipo como numérico, mas não indica se está esperando números inteiros.

Responder1

Na verdade, existe uma maneira de imitá-lo.

Aqui estão as etapas para limpar os logs binários para 1 hora.

PASSO 01) Crie um script SQL que excluirá todos os logs binários cujo carimbo de data/hora seja anterior a uma hora:

echo "FLUSH LOGS;" > /usr/bin/purge.sql
echo "PURGE BINARY LOGS BEFORE NOW() - INTERVAL 1 HOUR;" >> /usr/bin/purge.sql

PASSO 02) Crie um shell script ( /usr/bin/purge.sh) para mysqlchamarpurge.sql

mysql -uroot -p... < /usr/bin/purge.sql

PASSO 03) Tornar /usr/bin/purge.shexecutável

chmod +x /usr/bin/purge.sh

PASSO 04) Adicione usr/bin/purge.shao crontab para iniciar a cada hora

0 * * * * /usr/bin/purge.sh

De uma chance !!!

Responder2

Experimentar estava na ordem da noite...

mysql> set @@global.expire_logs_days=0,75;
ERRO 1232 (42000): Tipo de argumento incorreto para a variável 'expire_logs_days'
mysql> set @@global.expire_logs_days=.75;
ERRO 1232 (42000): Tipo de argumento incorreto para a variável 'expire_logs_days'
mysql> set @@global.expire_logs_days=3.4;
ERRO 1232 (42000): Tipo de argumento incorreto para a variável 'expire_logs_days'
mysql> set @@global.expire_logs_days=3/4;
ERRO 1232 (42000): Tipo de argumento incorreto para a variável 'expire_logs_days'
mysql> set @@global.expire_logs_days=F;
ERRO 1232 (42000): Tipo de argumento incorreto para a variável 'expire_logs_days'
mysql> set @@global.expire_logs_days=0xF;
ERRO 1232 (42000): Tipo de argumento incorreto para a variável 'expire_logs_days'
mysql> set @@global.expire_logs_days=1;
Consulta OK, 0 linhas afetadas (0,00 seg)

Responder3

Essa página diz que o intervalo é de 0 a 99. então sim, é um número inteiro.

0 = Não expira..

Você me fez pensar o que 0,5 faria. Estou pensando que ignoraria a parte 0,5 e simplesmente não a expiraria.

Responder4

Mysql (comunidade) Versão 8.0.17-1.sles12 - OpenSUSE tumbleweed 2019.10.02

mysql> SET GLOBAL expire_logs_days = 4;

ERROR 3683 (HY000): The option expire_logs_days and binlog_expire_logs_seconds
cannot be used together. Please use binlog_expire_logs_seconds to set the expire
time (expire_logs_days is deprecated)

..

SET PERSIST binlog_expire_logs_seconds = 86400;

Eu adicionei este arquivo my.cnf

[mysqld]
binlog_expire_logs_seconds = 86400
expire_logs_days = 1

informação relacionada