MySQL では、expire_logs_days を 1 日未満にできますか?

MySQL では、expire_logs_days を 1 日未満にできますか?

それで...昨日、私が運営しているサービスの 1 つで開始されたキャンペーンに関する「事後メール」を受け取りました。現在、DB サーバーは、レプリケーションのバイナリ ログで約 300 MB/分という猛烈な負荷を受けています。ご想像のとおり、これはかなり速いペースでスペースを消費しています。

通常のバイナリ ログの有効期限は 7 日間ですが、これでは不十分です。次の方法で、ログを最後の 4 時間だけに切り捨てることにしました (レプリケーションが最新であることを確認していますmk-heartbeat)。

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

嵐を乗り切るために、数時間ごとに cron からこれを実行していますが、 の最小値に疑問を感じましたexpire_logs_days。 1 未満の値に遭遇したことはありませんが、それが不可能であることを意味するわけではありません。http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_expire_logs_days型は数値であると指定しますが、整数を期待しているかどうかは示されません。

答え1

実は、それをエミュレートする方法があります。

バイナリ ログを 1 時間消去する手順は次のとおりです。

ステップ 01) タイムスタンプが 1 時間以上古いすべてのバイナリ ログを削除する SQL スクリプトを作成します。

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

/usr/bin/purge.shステップ02)呼び出すシェルスクリプト( )を作成mysqlするpurge.sql

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

ステップ03)/usr/bin/purge.sh実行可能にする

chmod +x /usr/bin/purge.sh

ステップ04) usr/bin/purge.shcrontabに1時間ごとに開始するように追加する

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

試してみる !!!

答え2

その夜の課題は実験でした...

mysql> @@global.expire_logs_days=0.75 を設定します。
エラー 1232 (42000): 変数 'expire_logs_days' の引数タイプが正しくありません
mysql> @@global.expire_logs_days=.75 を設定します。
エラー 1232 (42000): 変数 'expire_logs_days' の引数タイプが正しくありません
mysql> @@global.expire_logs_days=3.4 を設定します。
エラー 1232 (42000): 変数 'expire_logs_days' の引数タイプが正しくありません
mysql> @@global.expire_logs_days=3/4 を設定します。
エラー 1232 (42000): 変数 'expire_logs_days' の引数タイプが正しくありません
mysql> @@global.expire_logs_days=F を設定します。
エラー 1232 (42000): 変数 'expire_logs_days' の引数タイプが正しくありません
mysql> @@global.expire_logs_days=0xF を設定します。
エラー 1232 (42000): 変数 'expire_logs_days' の引数タイプが正しくありません
mysql> @@global.expire_logs_days=1 を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

答え3

そのページには範囲が 0 ~ 99 であると記載されています。つまり、整数です。

0 = 有効期限なし。

0.5 の場合はどうなるのか気になります。.5 の部分は無視され、期限切れにならないのではないかと思います。

答え4

Mysql (コミュニティ) バージョン 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;

このmy.cnfファイルを追加しました

[mysqld]
binlog_expire_logs_seconds = 86400
expire_logs_days = 1

関連情報