
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 mysql
chamarpurge.sql
mysql -uroot -p... < /usr/bin/purge.sql
PASSO 03) Tornar /usr/bin/purge.sh
executável
chmod +x /usr/bin/purge.sh
PASSO 04) Adicione usr/bin/purge.sh
ao 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