web-dev-qa-db-ja.com

my.cnfではexpire_logs_daysは無視されます

マスタースレーブレプリケーション用にセットアップされたMySQLデータベースのペアがあります。奴隷はうまくやっています。

一方、マスターは、私の最善の(自動化された)努力にもかかわらず、バイナリログを蓄えてきました。

MySQLのmy.cnfファイルに「expire_logs_days」変数を設定しようとしていますが、何らかの理由で無視されているようです。 my.cnfファイルは次のようになります。

[mysqld]
...
log-bin=/var/log/mysql/mysql-bin.log
server-id=1
expire_logs_days=3
log_bin_trust_function_creators=TRUE
sync_binlog=1

[mysqld_safe]
...

しかし、MySQLでSHOW VARIABLES WHERE Variable_Name='expire_logs_days'を実行すると、0の値が返されます。

私はもう試した:

  • MySQLの再起動
  • この行の使用:expire_logs_days='3'
  • 他のmy.cnfファイルを確認しました:
    • mysqld --help --verbose | grep cnf
    • 次の行が見つかりました:/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf order of preference
    • 私のmy.cnfファイルは/etc/my.cnfにあります
    • 他の場所にmy.cnfというファイルはありません
  • SET GLOBAL expire_logs_days=3はMySQL内で機能しますが、私の問題自体は実際には解決しません

そして、それは私がすることができると思うことができるすべてについてです。手動のPURGEコマンドを実行しましたが、これは問題なく機能しますが、cronを使用してPURGEコマンドを実行しない方がよいでしょう(ただし、回避方法がない場合は、とにかく実行します)。

誰かアイデアはありますか?私はちょうどタップされています。

ありがとう。

12
Cody S

あなたの質問からの事実

  • バイナリログはローテーションできません
  • PURGE BINARYLOGSを実行できるとおっしゃいました

これが私の作業理論です

_PURGE BINARY LOGS;_を使用してバイナリログを消去できるので、あなたが言及していないことを確認するための2つの場所があります

場所#1:_mysql-bin.index_

このファイルには、すべてのバイナリログの場所が含まれています。 expire_logs_daysが設定されている場合、mysqldはこのテキストファイルを開き、タイムスタンプがNOW() - INTERVAL expire_logs_days DAY)未満のバイナリログに遭遇するまで、各ファイルの日時スタンプを確認します。

Mysql-bin.indexのバイナリログは、数値的に連続していると予想されます。バイナリログが数値的に連続していない場合、ログローテーションは無効になります。

場所#2:_/var/log/mysql_フォルダー

_my.cnf_によると、このフォルダーにはすべてのバイナリログが保持されます。

ここに2つの質問があります:

  1. _/var/log/mysql_に数値的に連続していないバイナリログはありますか?
  2. _/var/log/mysql_にNOT IN _mysql-bin.index_のバイナリログはありますか?

なぜこれらの状況が発生するのでしょうか?

時々、人々はOSのバイナリログを削除します。 mysqldは_mysql-bin.index_を使用してバイナリログの存在を内部的に追跡するため、これによりmysqldが破棄される可能性があります。 mysqldが認識しているように、_rm -f_を使用してバイナリログを削除するだけで、ログローテーションメカニズムが論理的に破壊されます。

勧告

どちらかまたは両方が当てはまる場合は、次のようにこれをクリーンアップできます。

_mysql -ANe"RESET MASTER"
service mysql stop
cd /var/log/mysql
rm -f mysql-bin.*
cd
service mysql start
_

この後、新しいバイナリログを設定するブランドが必要になります。

試してみる !!!

11
RolandoMySQLDBA

その構成ファイルのその他のオプションを変更しても効果はありますか?正しい設定ファイルをヒットしていることを確認する必要があります。 server-idの値を変更することはおそらく良い候補です。

効果がない場合は、次のコマンドを実行して適切なファイルを見つけましょう。

ps aux | grep mysqld

そして、-defaults-fileまたは--defaults-extra-fileの値を見てください。

それでも困っている場合は、値を0に設定している--init-fileがどこかに設定されていないことを確認してください。

0

Mysql(コミュニティ)バージョン8.0.17-1.sles12-OpenSUSEタンブルウィード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)

..

0
Dutch Glory

My.cnfで何が起こっているのかわかりませんが、より大きな問題については、いくつかの選択肢があるようです。

  1. mysqldumpを実行し、ファイルをフラッシュ/パージすることを指定します
  2. 'purge'を実行します(これまでどおり)
  3. max_binlog_sizeを設定します。ドキュメントによると:

削除の可能性は、起動時およびバイナリログがフラッシュされたときに発生します。

そして

さらに、バイナリログは、そのサイズがmax_binlog_sizeシステム変数の値に達するとフラッシュされます。

フラッシュ/パージを実行すると、#3がexpire_logs_daysを実行するようです。

0
ethrbunny