Können expire_logs_days in MySQL weniger als 1 Tag sein?

Können expire_logs_days in MySQL weniger als 1 Tag sein?

Also... gestern habe ich eine „nachträgliche E-Mail“ über eine Kampagne erhalten, die für einen der von mir betriebenen Dienste gestartet wurde. Jetzt wird der DB-Server mit etwa 300 MB/min bei der binären Protokollierung für die Replikation stark beansprucht. Wie Sie sich vorstellen können, frisst dies ziemlich viel Speicherplatz.

Mein normales 7-tägiges Ablaufdatum für Binärprotokolle reicht einfach nicht aus. Ich habe die Protokolle auf die letzten 4 Stunden gekürzt (ich überprüfe, ob die Replikation auf dem neuesten Stand ist mk-heartbeat):

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

Ich führe das einfach alle paar Stunden von Cron aus aus, um den Sturm zu überstehen, aber es hat mich den Mindestwert für in Frage stellen lassen expire_logs_days. Ich bin noch nie auf einen Wert gestoßen, der kleiner als 1 ist, aber das bedeutet nicht, dass es nicht möglich ist.http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_expire_logs_daysgibt den Typ als numerisch an, gibt aber nicht an, ob ganze Zahlen erwartet werden.

Antwort1

Tatsächlich gibt es eine Möglichkeit, es zu emulieren.

Hier sind die Schritte zum Löschen Binärprotokolle auf 1 Stunde.

SCHRITT 01) Erstellen Sie ein SQL-Skript, das alle Binärprotokolle löscht, deren Zeitstempel älter als eine Stunde ist:

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

SCHRITT 02) Erstellen Sie ein Shell-Skript ( /usr/bin/purge.sh) zum Aufruf mysqlmitpurge.sql

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

SCHRITT 03) /usr/bin/purge.shAusführbar machen

chmod +x /usr/bin/purge.sh

SCHRITT 04) usr/bin/purge.shZur Crontab hinzufügen, um jede Stunde zu starten

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

Versuche es !!!

Antwort2

An diesem Abend war Experimentieren angesagt...

mysql> setze @@global.expire_logs_days=0,75;
FEHLER 1232 (42000): Falscher Argumenttyp für die Variable „expire_logs_days“
mysql> setze @@global.expire_logs_days=.75;
FEHLER 1232 (42000): Falscher Argumenttyp für die Variable „expire_logs_days“
mysql> setze @@global.expire_logs_days=3.4;
FEHLER 1232 (42000): Falscher Argumenttyp für die Variable „expire_logs_days“
mysql> setze @@global.expire_logs_days=3/4;
FEHLER 1232 (42000): Falscher Argumenttyp für die Variable „expire_logs_days“
mysql> setze @@global.expire_logs_days=F;
FEHLER 1232 (42000): Falscher Argumenttyp für die Variable „expire_logs_days“
mysql> setze @@global.expire_logs_days=0xF;
FEHLER 1232 (42000): Falscher Argumenttyp für die Variable „expire_logs_days“
mysql> setze @@global.expire_logs_days=1;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Antwort3

Auf der Seite steht, dass der Bereich 0-99 ist. Es handelt sich also tatsächlich um eine Ganzzahl.

0 = Kein Ablaufdatum.

Ich frage mich, was 0,5 bewirken würde. Ich denke, es würde den 0,5-Teil ignorieren und sie einfach nicht ablaufen lassen.

Antwort4

Mysql (Community) Version 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;

Ich habe diese my.cnf-Datei hinzugefügt

[mysqld]
binlog_expire_logs_seconds = 86400
expire_logs_days = 1

verwandte Informationen