2010-12-02 62 views
2

我正在調試舊版PHP應用程序中的一個問題,其中表中的某個列沒有約束將表中的所有行設置爲值。這種行爲是意想不到的,所以我花了相當長的時間來追查錯誤的原因。用於排除意外的mysql查詢故障的技巧

背景:

  • 這是一個間歇性問題。
  • 在我們的開發環境,我們不能複製(這等同於生產環境)
  • 該應用程序是使用ORM

我們已經試過:

  • 審閱源代碼
  • 查看mysql bin日誌。這使我們能夠看到它是一個沒有子句的單個UPDATE查詢,實際上是導致不正確的數據出現。
  • 添加其他應用程序級別的日誌記錄。這讓我們對應用程序有了更好的理解,但是我們一直無法發現錯誤。

我的問題:

當在一個陌生的應用面臨着一個看似無賴查詢,你用什麼技術來查找查詢的來源是什麼?

+1

我正在使用grep – 2010-12-02 16:21:24

+0

ORM是虛假的,在將更新查詢發送到mysql之前嘗試進行一些日誌記錄 – ajreal 2010-12-02 16:25:53

回答

2

由於間歇性問題,我建議在PHP代碼中進行非常詳細的日誌記錄。這將允許您查看發生更改時發生的情況以及實際正在運行的查詢。如果無法手動複製,則沒有真正的方法可以在沒有某種調試輸出/日誌記錄的情況下對其進行跟蹤。

如果即使在添加了額外的日誌記錄之後,仍然無法發現問題,請使用測試環境並在沒有涉及相關表的查詢的情況下處理應用程序。

最後但並非最不重要的是,檢查mySQL中的觸發器。我不確定mySQL是如何記錄觸發器的,但有意義的是,它只是在沒有給出bin日誌中的具體信息的情況下進行更新。

+0

一旦您創建了一個爲您執行此操作的類,然後只是`$ oLog-> add(「got這裏「)`在PHP端的每個關鍵步驟。 – zanlok 2010-12-03 00:40:32

1

我不這樣做,如果ORM可能,但在註釋中包含__FILE____LINE__常量作爲sql的一部分。這樣,你可以從mysql日誌中知道文件和代碼行。