MySQLのログを遅くして毎日新しいログファイルを開始する方法はありますか?現時点では、単一の大きなファイルであり、毎日grep行を作成する必要があります。毎日のログが遅い場合に個別のファイルを用意すると、はるかに便利です。
My.cnfまたは一部のLinux機能を構成する必要がありますか?
これは古き良きテキストファイルです。
次のコマンドを実行して、遅いログを毎日フラッシュします
ステップ01)スロークエリログをオフにする
SET GLOBAL slow_query_log = 'OFF';
ステップ02)テキストファイルをコピーする
cat slow-query.log | gzip > /logs/slow-query-`date +"%Y%m%d-%H%M"`.log.gz
ステップ03)ファイルをゼロバイトに切り詰めます
echo -n > slow-query.log
ステップ04)スロークエリログをオンにする
SET GLOBAL slow_query_log = 'ON';
log-output=TABLE
に切り替えて、クエリするテーブルとして扱うことができます。
ステップ01)mysql.slow_logをCSVからMyISAMに変換します
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
ステップ02)テーブルにインデックスを付ける
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
ステップ03)ログ形式をアクティブにしてTABLE
[mysqld]
log-output=TABLE
ステップ04)service mysql restart
Mysqldを起動すると、遅いログエントリがMyISAMテーブルmysql.slow_logに記録されます。
エントリを午前0時より前にローテーションするには、次のようにします。
SET GLOBAL slow_query_log = 'OFF';
SET @dt = NOW();
SET @dtstamp = DATE_FORMAT(@dt,'%Y%m%d_%H%i%S');
SET @midnight = DATE(@dt) + INTERVAL 0 SECOND;
ALTER TABLE mysql.slow_log RENAME mysql.slow_log_old;
CREATE TABLE mysql.slow_log LIKE mysql.slow_log_old;
INSERT INTO mysql.slow_log SELECT * FROM mysql.slow_log_old WHERE start_time >= @midnight;
DELETE FROM mysql.slow_log_old WHERE start_time >= @midnight;
SET @sql = CONCAT('ALTER TABLE mysql.slow_log_old RENAME mysql.slow_log_',@dtstamp);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET GLOBAL slow_query_log = 'ON';
遅いログの場合はこれですべてです...
UpdateAaronが指摘するように、copy-and-truncateが一部のエントリを見逃す可能性があります。したがって、より安全な方法はFLUSH
を移動することです。
オリジナル
この記事 は、私が使用するスロークエリログをローテーションするための基本原則を備えています。基本的に、slowログを新しいファイルにコピーしてから、slow.logの内容を切り捨てる必要があります。
cp log/slow.log log/slow.log.`date +%M`; > log/slow.log
遅いログを新しいファイルに移動して新しい「slow.log」を作成するだけでは、移動したファイルには同じiノードがあり、mysqlにはまだ開いているため、機能しません。ファイルを移動してからFLUSH SLOW LOGS
コマンドを発行すると、ファイルが閉じて再度開くので機能すると思いますが、コピーと切り捨ても同じように効果的であり、mysqlにログインする必要はありません。
彼の記事ではLinuxでのlogrotateの使用について言及していますが、私はこれを行うために、1日に1回真夜中に実行するcronjobを作成しました。
また、FLUSH LOGS
でのレプリケーションの問題に対処するには:
FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、およびFLUSH TABLES WITH READ LOCK(テーブルリストの有無にかかわらず)は、スレーブに複製すると問題が発生するため、いかなる場合でもバイナリログには書き込まれません。 [src]
そのため、これらのステートメントはバイナリログに書き込まれないため、レプリケーションを妨げることはありません。あなたの目的のために、遅いクエリログのみを閉じる/開くようにFLUSH SLOW LOGS
を指定します。
logrotate.dを使用して毎日ファイルをローテーションし、好きなだけ日数を保つか、ファイルを移動します。次に、同じスクリプトからフラッシュログを発行して、MySQLに新しいファイルを開始させます。回転、毎日に設定すると、必要なものが得られます。
Genlogやslow logのようなログをデバッグするために、いつか「expire_log_days」に似たものが実装されることを望んでいます