質問
毎日新しいログファイルを起動するためにMySQLの遅いログを作成する方法はありますか?現時点では、それはたった1つの大きなファイルであり、毎日ラインをグレップする必要があります。ログが遅い日ごとに個別のファイルを持つ方がはるかに便利です。
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)ログ形式をアクティブにしてテーブルにします
[mysqld]
log-output=TABLE
ステップ04) service mysql restart
MySQLDを起動すると、遅いログエントリがmyisamテーブルmysql.slow_logに記録されます。
真夜中までにエントリを回転させるには、次のようなものができます。
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';
そして、それはすべてのログのためにすべてです...
他のヒント
アップデートアーロンが指摘しているように、コピーアンドトゥランケートがいくつかのエントリを見逃す可能性があります。したがって、より安全な方法は、移動することです FLUSH
.
オリジナル
この記事 使用しているスロークエリログを回転させるための基本原則があります。基本的に、スローログを新しいファイルにコピーしてから、slow.logの内容を切り捨てる必要があります。
cp log/slow.log log/slow.log.`date +%M`; > log/slow.log
スローログを新しいファイルに移動して新しい「lelog.log」を作成するだけで、移動したファイルにはまだ同じイノードがあり、mysqlがまだ開いているため、機能しません。ファイルを移動してから発行すると思います FLUSH SLOW LOGS
コマンドは機能し、ファイルを閉じて再び開くと機能しますが、コピーアンドトランチは同じように効果的であり、MySQLへのログを必要としないことがわかります。
彼の記事はLinuxでLogrotateを使用しているが、私はちょうど真夜中に1日1回実行するためにCronjobを作りました。
また、複製の問題に対処するため FLUSH LOGS
:
フラッシュログ、フラッシュマスター、フラッシュスレーブ、および読み取りロック付きのフラッシュテーブル(テーブルリストの有無にかかわらず)は、スレーブに複製された場合に問題を引き起こすため、いかなる場合でもバイナリログに書き込まれません。 SRC
したがって、これらのステートメントはバイナリログに書き込まれていないため、複製に干渉しません。あなたの目的のために、私は指定します FLUSH SLOW LOGS
スロークエリログのみを閉じる/開くには。
logrotate.dを使用して毎日ファイルを回転させ、必要な数日間保持するか、オフに移動します...その後、同じスクリプトからフラッシュログを発行してmysqlを取得して新しいファイルを起動します。回転して、毎日に設定すると、あなたが望むものを手に入れる必要があります。
いつか彼らがGenlogやSlow Logなどのログをデバッグするために「Expire_log_days」に似たものを実装することを望んでいます