2009-07-03 3 views
3

私のログファイルは動作していますが、 "29 Query"のような各行に無関係な情報がありますが、わかりませんが、ログに記録されたクエリはMySQLが内部的にどのように処理するかの解釈です。 MySQLによってログに追加された追加情報なしで、アプリケーションによって実行されたときに各クエリを自動的にログに記録する方法はありますか?ありがとう!MySQLで生のクエリだけを記録するにはどうすればよいですか?

EDIT:

報奨金を提供するの一環として、私は私の状況を説明しましょう。 Magento CommerceはEAVデータベースアーキテクチャを採用しています。何かを追跡し、それがどこに保存されているかは絶対的な悪夢です。私の考えは、アプリケーション内のデータベースに製品を挿入し、そのプロセス中に実行されたすべてのクエリを記録することでした。これはうまくいきましたが、ログにはクエリの周りに1トンもの厄介者があります。私が試してみて、このすべてを取得するには、コントローラとモデルをふるい行く必要はありませんように実行されたものを私に伝えるシンプルな

1.) SELECT * FROM <TABLE>; 
2.) UPDATE <TABLE> SET <VALUE> = <VALUE>; 
3.) ... 
4.) ... 

何か:私は本当にちょうどこのような何かをしたいです。私は、日付、時間、行番号または何か余分なものは必要ありません。

+0

私はマジェントでかなり仕事をしました。より具体的な質問がある場合は、データがどこにあるのかを指摘できます。 – benlumley

+1

あなたはどのMySQLのリリースを使用していますか? 5.1以降のバージョンでのみ動作するきちんとしたアプローチがあります.5.0以前のバージョンで動かなくても、それを書き留める時間をむしろ避けることができます。 –

+0

http:// stackoverflow。com/questions/513452/mysql-set-names-slow-query-logの最上部にある – joe

答えて

9

をフルログの照会があなたのmy.cnfに以下を追加します有効にするには:

log=/var/log/mysqldquery.log 

上記のログファイルにすべてのクエリをログに記録します。

my.cnfファイルを変更した後にmysqlサービスを再起動するのを忘れてはいけません。 SequelPro(MACクライアント)を経由しての行動から

出力例:* NIXベースのシステムでは

090721 11:06:45  51 Query  ALTER TABLE `test` ADD `name` varchar(10) DEFAULT NULL 
        51 Query  SHOW COLUMNS FROM `test` 
        51 Query  SHOW INDEX FROM `test` 
090721 11:06:57  51 Query  SHOW COLUMNS FROM `test` 
        51 Query  UPDATE `test` SET `id`='1', `name`='test' WHERE `id` = '1' AND `name` IS NULL LIMIT 1 
        51 Query  SELECT * FROM `test` LIMIT 0,100 
        51 Query  SELECT COUNT(1) FROM `test` 
090721 11:07:00  51 Query  UPDATE `test` SET `id`='2', `name`='test' WHERE `id` = '2' AND `name` IS NULL LIMIT 1 
        51 Query  SELECT * FROM `test` LIMIT 0,100 
        51 Query  SELECT COUNT(1) FROM `test` 

あなたは

grep 'SELECT\|INSERT\|UPDATE' querylog.log 

以上のトリッキー取得し、のようなものをやって起動を開始するためにはgrepを使用することができます。

grep 'SELECT\|INSERT\|UPDATE' querylog.log | awk '{$1="";$2="";print}' 

これは、完璧ではないが近い:

51 Query UPDATE `test` SET `id`='2', `name`='test' WHERE `id` = '2' AND `name` IS NULL LIMIT 1 
    SELECT * FROM `test` LIMIT 0,100 
    SELECT COUNT(1) FROM `test` 
    51 Query INSERT INTO `test` (`id`,`name`) VALUES ('3','testing') 
    SELECT * FROM `test` LIMIT 0,100 
    SELECT COUNT(1) FROM `test` 
+0

grep:sedの/ xの後に最初のx文字を置き換えます。{x} // ' – soulmerge

1

バイナリログを参照する場合は、意味のある出力を得るためにmysqlbinlogを使用する必要があります。

cat log100.log | mysqlbinlog 
+0

mysqlbinlogと--short-formオプションを使用しても、まだゴミがたくさんあります。 –

+0

binのログに選択されている項目がありません(挿入されていない限り... select) –

4

mysqlクエリログファイルを使用できます。 MySQLを起動するときに、このパラメータを追加します。

--log=/var/log/mysqld.log 
関連する問題