2010-07-02 68 views
3

我有一個mysql數據庫。我想要做的是對其執行任意操作,然後找出更改的內容。事情是這樣的:獲取MySQL數據庫差異

//assume connection to db already established 

before();//saves db state 
perform_action();//does stuff to db 
diff();//prints what happened 

我希望它的輸出是這樣的:

Row added in table_0 ]details] 
Row added in table_1 [details] 
Row modified in table_5 [details] 
Row deleted in table_2 [details] 

任何想法?


爲了進一步澄清:你怎麼知道的計算器,如果檢查後的編輯,你可以看到紅線/綠色亮點表明什麼改變?我想要類似的東西,但對於MySQL數據庫。

+0

您是否在查看數據庫執行更改的過程?然後使用explain命令可能是您的最佳選擇。 這裏是它的文檔鏈接。 http://dev.mysql.com/doc/refman/5.0/en/explain.html – 2010-07-02 15:05:40

+0

@Mike:不,我只是想看看數據庫之間和之後的直線差異。不過謝謝。 – Cam 2010-07-02 15:08:25

+0

據我所知,EXPLAIN不會實際執行語句,但會提供有關SELECT在執行時會執行哪些操作並顯示索引和其他有用信息的信息。 – Zepplock 2010-07-02 15:08:59

回答

1

我想通常你的應用程序會記錄任何有趣的變化,因爲它使他們。或者你可以用日期時間設置歷史記錄表。

要按照您描述的方式執行此操作,可以在操作前後將數據庫內容轉儲到文件中,然後對兩個文件執行差異操作。在php中,你可以看看xdiff:http://us.php.net/manual/en/book.xdiff.php

如果這只是偶爾在受控環境下測試一些你不確定的查詢,你可以在命令行中轉儲和比較。

+0

這就是我最終做的。在修改之前和之後,我使用phpmyadmin將整個數據庫作爲sql語句導出。差異立即顯露差異。謝謝! – Cam 2010-07-15 20:25:37

0

一種方法是解析日誌文件,它將爲您提供在數據庫中執行的確切SQL語句。我不確定如何將應用程序與其他應用程序所做的SQL語句分開(如果是這種情況)

+1

當然,你可以找到SQL語句。但是這並沒有提供足夠的信息:例如,考慮一個DELETE語句。你將無法找到關於刪除行的任何信息。你甚至無法判斷語句是否刪除了一行或42行或零行。 – titanoboa 2010-07-02 15:32:28

4

而不是複製整個數據庫以便爲以後的diff保存狀態,最好關閉使用觸發器:

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

當您設置適當的觸發器,您可以登錄修改的表 - 例如,你可以設置一個觸發自動記錄的舊值和新值,每次更新。要查看更改,請查詢由觸發器填充的表格。

當然,觸發器不限於您的應用程序所做的更改,它還會記錄其他應用程序完成的更新。但是,如果您將數據庫的舊版本與數據庫的新版本區分開來,情況也是如此。

0

我能想到的唯一的事情是做的少一些hackey一些事情的組合:

  1. 保存[臨時?]行標識的表,檢查新行。如果您需要知道以前刪除或修改過的行中的內容,則需要複製整個數據庫,這樣會比較麻煩。

  2. 每行都有一個datestamp,它在更新時被修改;抓取更新的日期戳比分析開始時更新的行。

  3. 在你的應用程序和數據庫之間有一層(如果你有像經典的$db->query()這樣的東西,這會讓事情變得簡單)發送日誌查詢,然後可以查看。

我想真正的問題是,如果你想知道正在對數據庫執行查詢,或者如果你想知道他們詢問你正在運行實際上是做。

+0

我想知道我正在運行的查詢實際上在做什麼。 – Cam 2010-07-02 15:44:40