質問

毎日新しいログファイルを起動するために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」に似たものを実装することを望んでいます

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top