2010-12-02 21 views
2

テーブルの特定のカラムが、テーブル内のすべてのローを値に設定する制約なしに更新されるレガシーPHPアプリケーションで、問題をデバッグしています。この動作は予期せぬものですので、エラーの原因を追跡するのにかなりの時間を費やしました。予期せぬmysqlクエリのトラブルシューティングのテクニック

背景:

  • それは断続的な問題です。

    • 見直し:
    • 我々は
    • アプリケーションはORM我々が試した何

    を使用している(本番環境と同一である)私たちの開発環境でそれを再現することはできませんソースコード

  • mysqlのbinログを確認する。これにより、誤ったデータが実際に表示されていた句のない単一のUPDATEクエリであることがわかりました。
  • 追加のアプリケーションレベルのログを追加します。これにより、アプリケーションの理解が深まりましたが、発生したエラーを特定することができませんでした。

私の質問:なじみのないアプリケーションでは、一見、不正なクエリに直面したとき

、どのような技術あなたがそのクエリのソースを見つけるために使うのですか?

+1

私はgrepを使用しています –

+0

ORMは偽です、アップデートクエリをmysqlに送信する前にいくつかのログを試してください – ajreal

答えて

2

断続的な問題では、非常に詳細なPHPコードのロギングをお勧めします。これにより、変更が発生したときに何が起こっているのか、実際にどのクエリが実行されているのかを確認することができます。手動で再現することができない場合は、何らかのデバッグ出力/ロギングなしでそれを追跡する実際の方法はありません。

追加ロギングを追加した後でも、問題が見つからない場合は、テスト環境を使用して問題のテーブルを含むクエリを使用せずにアプリケーションを操作します。

最後に、少なくとも、mySQLのトリガーを確認してください。私はmySQLがトリガーを記録するのかどうかはわかりませんが、ビンログで詳細を知らせることなく更新するだけです。

+0

これを行うクラスを作成してから '$ oLog-> add(" gotここでは ")'をPHP側のすべての重要なステップで実行します。 – zanlok

+0

私たちは最終的に、過剰な量のログを記録し、mysql binログを梳くことでこの問題を解決しました。 – GloryFish

1

ORMでは可能ですが、__FILE____LINE__の定数をsqlの一部としてコメントに含めます。そうすれば、mysqlログからコードとファイルの行を知ることができます。

+0

私はしばらくの間、PHPアプリケーションを開発してきたし、\ _ \ _ LINE \ _ \ _定数については知りませんでした。それは素晴らしいことです – GloryFish

関連する問題