web-dev-qa-db-ja.com

MySQL binlog保持を時間単位で設定するにはどうすればよいですか?

MySQLのログパーティションが1日未満でいっぱいになる状況にあります。 binlogはレプリケーションに必要なので、無効にすることはできません。

私はログ保持を設定できることを知っていますが、それは日を受け入れます、そして検索はこれだけを示しました https://serverfault.com/questions/179165/can-expire-logs-days-be-less-than-1 -day-in-mysql 質問。スクリプトを使用して自分で行うことを提案します。

その質問はほぼ8年前のものなので、今は可能かどうか疑問に思っていました。

問題がある場合は、Percona MySQL 5.7を使用しています

2
hoodakaushal

実は今できます。 MySQL 8.0.1以降、_expire_log_days_は引き続き機能しますが、有効期限を設定する標準的な方法は _binlog_expire_logs_seconds_ を変更することです。これは、ご想像のとおり、2番目の解決策です。 8.0.11以降のデフォルト値は2592000(= 30日)ですが、設定ファイルで他の期間に通常どおり秒単位で設定できます。

MySQL 8.0をまだ使用できない場合、これを修正する方法は _PURGE BINARY LOGS_構文BEFOREPURGE BINARY LOGS BEFORE now() - INTERVAL 1 HOUR; 'とともに使用し、 _max-binlog_size_ を適切な値に変更します(現在書き込まれているbinlogは削除できませんが、 _FLUSH BINARY LOGS_ を使用してローテーションを強制することができます)。 cron /プログラムされたタスクで定期的または外部的にそれを行うイベントを設定できます。

または、PerconaのようなMySQLのフォークを使用して、最大のbinlogサイズをバイト単位で設定できます(さらに、_max_binlog_size_と _max_binlog_files_ -を組み合わせて)日制限に。

6
jynus

Perconaサーバーは max_binlog_files をサポートします。これは max_binlog_size と組み合わせて使用​​することで、ファイルの数(およびそれらの合計サイズ)をターゲット範囲内に保つことができます。

max_binlog_sizeはハードリミットではないことに注意してください。トランザクションは異なるバイナリログに分割されないため、トランザクションが非常に大きい場合を除き、ほとんどのファイルはそれをわずかにオーバーシュートします。各ログは、サイズのしきい値を超えた後にローテーションされます。

3