用于排除意外mysql查询的技术

时间:2010-12-02 16:12:08

标签: php mysql

我正在调试遗留PHP应用程序中的问题,其中表中的某个列更新时没有约束将表中的所有行设置为值。这种行为是出乎意料的,所以我花了相当多的时间来追查错误的原因。

背景:

  • 这是一个间歇性的问题。
  • 我们无法在我们的开发环境(与生产环境相同)中重现它
  • 该应用程序正在使用ORM

我们尝试了什么:

  • 查看源代码
  • 查看mysql bin日志。这使我们看到它是一个单独的UPDATE查询,没有实际导致不正确数据出现的子句。
  • 添加其他应用程序级日志记录。这使我们更好地理解了应用程序,但是我们无法发现错误。

我的问题:

在不熟悉的应用程序中遇到看似流氓的查询时,您使用哪些技术来查找该查询的来源?

2 个答案:

答案 0 :(得分:2)

对于间歇性问题,我建议在PHP代码中进行非常详细的日志记录。这将允许您查看更改发生时发生的情况以及实际运行的查询。如果无法手动重现,没有实际的方法可以在没有某种调试输出/日志记录的情况下对其进行跟踪。

如果,即使在添加额外的日志记录之后,您也无法发现问题,使用测试环境并使用应用程序而不涉及涉及该表的查询。

最后但并非最不重要的是,检查mySQL中的触发器。我不确定mySQL记录了触发器的内容,但是它只是在没有在bin日志中给出详细信息的情况下进行更新是有道理的。

答案 1 :(得分:1)

如果可以使用ORM,我不会这样做,但在注释中包含__FILE____LINE__常量作为sql的一部分。这样,您就可以从mysql日志中了解代码的文件和行。