4

Web ホスティングプロバイダーmysqld-slow-queries.logから呼び出されたファイルを受け取りました。このファイルを分析する必要があります。おそらく、サーバーに大きな負荷をかける機能がいくつかあるからです。

Notepad++ただし、または同様のファイルを開くと、14000行の情報が表示されますが、構造はありません。

.logファイルをインポートしてレポートを視覚化できるプログラムはありますか? 基本的に、値でソートできるようにしたいと考えていQuery_timeます。

4

4 に答える 4

1

これは、それらを整理するために私が使用するノディスクリプトです。先頭のファイル名を変更して実行します。詳細をCSV形式で出力するので、簡単に操作できます(注意、CSVファイルの2行目はゴミなので削除してください)。あなたが持っているファイルがまったく同じ形式であるかどうかは確認できませんが、うまくいけば、これで遊んで必要なものを整理できます.

<?php
$handle = fopen('C:\\somelocation\\mysql-slow.log', "rb");
$fp = fopen('someoutputfile.csv', 'w');
$inline = '';
$inline = fgets($handle, 8192);
$OutLine = array();
$OutLine['Time'] = 'Time';
$OutLine['Timestamp'] = 'Timestamp';
$OutLine['User'] = 'User';
$OutLine['Query_time'] = 'Query_time';
$OutLine['Lock_time'] = 'Lock_time';
$OutLine['Rows_sent'] = 'Rows_sent';
$OutLine['Rows_examined'] = 'Rows_examined';
$OutLine['Database'] = 'Database';
$OutLine['SqlOut'] = 'SqlOut';
WriteOut($fp, $OutLine);
$OutLine = array();
$OutLine['Time'] = '';
$OutLine['Timestamp'] = '';
$OutLine['User'] = '';
$OutLine['Query_time'] = '';
$OutLine['Lock_time'] = '';
$OutLine['Rows_sent'] = '';
$OutLine['Rows_examined'] = '';
$OutLine['Database'] = '';
$OutLine['SqlOut'] = '';
$PossibleUse = true;
$TimeTriggeredOut = true;
$CurrentTime = '';
$CurrentDatabase = '';

while (!feof($handle)) 
{
    switch (true)
    {
        case substr($inline, 0, 8) == '# Time: ' :
            WriteOut($fp, $OutLine);
            $PossibleUse = true;
            $Timings = explode(': ', $inline);
            $CurrentTime = $Timings[1];
            $OutLine = array();
            $OutLine['Time'] = $CurrentTime;
            $OutLine['Timestamp'] = '';
            $OutLine['User'] = '';
            $OutLine['Query_time'] = '';
            $OutLine['Lock_time'] = '';
            $OutLine['Rows_sent'] = '';
            $OutLine['Rows_examined'] = '';
            $OutLine['Database'] = $CurrentDatabase;
            $OutLine['SqlOut'] = '';
            $TimeTriggeredOut = true;
            break;
        case substr($inline, 0, 6) == '# User' :
            if (!$TimeTriggeredOut)
            {
                WriteOut($fp, $OutLine);
                $PossibleUse = true;
                $OutLine = array();
                $OutLine['Time'] = $CurrentTime;
                $OutLine['Timestamp'] = '';
                $OutLine['User'] = '';
                $OutLine['Query_time'] = '';
                $OutLine['Lock_time'] = '';
                $OutLine['Rows_sent'] = '';
                $OutLine['Rows_examined'] = '';
                $OutLine['Database'] = $CurrentDatabase;
                $OutLine['SqlOut'] = '';
            }
            $OutLine['User'] = $inline;
            $TimeTriggeredOut = false;
            break;
        case substr($inline, 0, 12) == '# Query_time' :
            $Timings = explode(' ', $inline);
            //print_r($Timings);
            $OutLine['Query_time'] = $Timings[2];
            $OutLine['Lock_time'] = $Timings[5];
            $OutLine['Rows_sent'] = $Timings[7];
            $OutLine['Rows_examined'] = $Timings[10];
            $PossibleUse = true;
            break;
        case substr($inline, 0, 14) == 'SET timestamp=' :
            $Timings = explode('=', $inline);
            $OutLine['Timestamp'] = $Timings[1];
            $PossibleUse = true;
            break;
        case $PossibleUse AND substr($inline, 0, 4) == 'use ' :
            $Timings = explode(' ', $inline);
            $CurrentDatabase = $Timings[1];
            $OutLine['Database'] = $CurrentDatabase;
            $PossibleUse = false;
            break;
        default;
            $OutLine['SqlOut'] .= $inline;
    }
    $inline = fgets($handle, 8192);
}
fclose($fp);
fclose($handle);

function WriteOut($fp, $OutLine)
{
    foreach($OutLine as &$aOutLine)
    {
        $aOutLine = str_replace("\n", " ", $aOutLine);
        $aOutLine = str_replace("\r", " ", $aOutLine);
        $aOutLine = str_replace("\t", " ", $aOutLine);
    }
    fputcsv($fp, $OutLine);
}
?>
于 2013-01-23T12:18:05.500 に答える
0

https://github.com/LeeKemp/mysql-slow-query-log-parser/

次のような形式で明確な出力を提供する ruby​​ スクリプト:

################################################################################
1973 Queries
user: XXX[XXX]
url: localhost
ip: []
Taking 2 to 19354 seconds to complete
Locking for 0 to 210 seconds
Average time: 120, Median time 4
Average lock: 0, Median lock 0

SET timestamp=XXX;
SELECT tXXX.id AS idXXX...

################################################################################
2233 Queries
user: ...
于 2014-09-19T09:11:50.300 に答える
0

クエリ分析ツールが対処しなければならない問題が 2 つあります。1 つ目 (Kickstart のソリューションでは実行されていないようです) は、クエリからパラメーターを削除することです。同じクエリが何度も実行されますが、パラメーターは異なります。2 つ目は、データを集計してレポートすることです。

MySQL には、これらの両方を行うツールmysqldumpslowが付属しています。または、このスタンドアロンスクリプトを使用することもできます。

優先順位を付ける必要があるクエリは、頻度と期間の積が最も高いクエリです。期間が実行時間かロック時間か、または両方の組み合わせであるかは、データベースが現在どのように動作しているかによって異なります。(ただし、大まかな経験則として、ISAM テーブルの場合は (frequency^1.5) * ((lock time ^ 1.5)+query time) を使用し、Innodb の場合は単純な製品を使用します)。

実行に最も時間がかかった特定のクエリに執着すると、これらがまれな場合に非常に誤解を招く可能性があります (ただし、同時実行をサポートしないエンジンでは特に問題になる可能性があります)。

于 2013-01-23T12:47:57.553 に答える
0

mysqlsla (mysql スロー クエリ ログ アナライザー)もあります。

mysqlsla は、クエリとそのメタプロパティ値のカスタマイズ可能なレポートを作成するために、MySQL のスロー、一般、バイナリ、およびマイクロスローのパッチが適用されたログを解析、フィルター処理、分析、および並べ替えします。

于 2013-01-23T12:55:13.933 に答える