
それで...昨日、私が運営しているサービスの 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.sh
crontabに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