web-dev-qa-db-ja.com

MySQLスローログ構成

MySQLのログを遅くして毎日新しいログファイルを開始する方法はありますか?現時点では、単一の大きなファイルであり、毎日grep行を作成する必要があります。毎日のログが遅い場合に個別のファイルを用意すると、はるかに便利です。

My.cnfまたは一部のLinux機能を構成する必要がありますか?

4
Katafalkas

これは古き良きテキストファイルです。

次のコマンドを実行して、遅いログを毎日フラッシュします

ステップ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';

遅いログの場合はこれですべてです...

2
RolandoMySQLDBA

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を指定します。

5
Derek Downey

logrotate.dを使用して毎日ファイルをローテーションし、好きなだけ日数を保つか、ファイルを移動します。次に、同じスクリプトからフラッシュログを発行して、MySQLに新しいファイルを開始させます。回転、毎日に設定すると、必要なものが得られます。

Genlogやslow logのようなログをデバッグするために、いつか「expire_log_days」に似たものが実装されることを望んでいます

4
TechieGurl