2010-02-08 34 views
4

我試圖找出一個特定的MySQL用戶是否仍然在我們的系統中使用(以及它正在執行什麼查詢)。MySQL只觸發某個mysql用戶

所以我想寫一個觸發器,在用戶X執行查詢的任何時候都會觸發,並且它會將查詢記錄在日誌表中。

我該怎麼做? 我知道如何爲特定的表編寫查詢,但不知道特定的用戶(任何表)。

感謝

+0

有沒有那麼一種方法,使MySQL的日誌,但只是針對一個用戶? – 2010-02-08 19:22:19

+0

我已經添加了一個基於代理的解決方案,可能可以做你需要的東西(還有很多,更多) – Unreason 2010-04-15 16:05:57

+0

請看我的帖子從2012年1月25日,因爲我認爲它提供了一個更完整的答案,新的解決方案問題。 – 2012-01-26 17:58:43

回答

3

記錄你可以在分支的USER()觸發功能。

+0

這是最有意義的。現在唯一的問題是我需要觸發ALL表的所有操作。對於整個數據庫... – 2010-03-05 03:05:04

2

最簡單的辦法是有觸發總是火,但前提是用戶X.

+0

如何觸發任何表任何操作? – 2010-02-08 18:44:17

+1

@nute:你不用 - 對於MySQL,你必須分別觸發每個表和事件;此外,您只能在INSERT,UPDATE或DELETE上觸發。 (REPLACE = DELETE + INSERT) – Piskvor 2010-02-08 18:58:56

+0

哦,那不行,那麼太多的表 – 2010-02-08 19:17:48

-1

是的,消失了,但只要特定用戶(userID,class)與您的憑證相匹配,就可以使用任何系統來查看用戶是什麼(cookies,session)。

+0

我們正在討論核心MySQL用戶,而不是應用程序用戶。 – 2010-02-08 18:45:04

0

也有其他的方法,你可以解決這個問題,例如使用MySQL proxy

在代理,你可以做有趣的事情 - 從記錄到轉化的查詢,pattern matching(檢查此鏈接也爲如何測試細節/開發腳本)

-- set the username 
local log_user = 'username' 

function read_query(packet) 
    if proxy.connection.client.username == log_user and string.byte(packet) == proxy.COM_QUERY then 
     local log_file = '/var/log/mysql-proxy/mysql-' .. log_user .. '.log' 
     local fh = io.open(log_file, "a+") 
     local query = string.sub(packet, 2) 
     fh:write(string.format("%s %6d -- %s \n", 
      os.date('%Y-%m-%d %H:%M:%S'), 
      proxy.connection.server["thread_id"], 
      query)) 
     fh:flush() 
    end 
end 

上述內容已經過測試,它做什麼,它應該是(雖然這是一個簡單的變型,不記錄成功或失敗,只記錄proxy.COM_QUERY,見名單全部constants查看什麼被跳過並根據您的需要進行調整)

0

我想看看這些選項:

A)寫入審計插件,過濾基於用戶名的事件。

爲簡單起見,用戶名可以在插件本身中硬編碼,或者爲了優雅,可以通過插件變量配置,以防再次出現此問題。

http://dev.mysql.com/doc/refman/5.5/en/writing-audit-plugins.html

B)調查--init-Connect服務器選項。

例如,調用存儲過程,檢查user()/ current_user()的值, ,如果看到用戶的連接,則將跟蹤寫入日誌(插入到表中)。

見 ​​

這可能是最接近的一個連接觸發。

C)使用性能架構工具。

這假設爲5.6。

使用表performance_schema.setup_instrument僅啓用語句檢測。 使用表performance_schema.setup_actors僅爲此用戶的會話進行測試。

然後,系統已經運行了一段時間後,看看活動該用戶下表:

  • 表performance_schema.users將告訴我們,如果有在所有
  • 表中的某些活動performance_schema.events_statements_history_long將顯示最後執行的查詢
  • 表performance_schema.events_statements_summary_by_user將顯示有關此用戶執行的每個語句類型(SELECT,INSERT,...)的聚合統計信息。

假設你有一個用戶定義爲'old_app'@'%',一個可能的後續問題將是找出這個舊應用程序仍然連接的位置(哪個主機)。

performance_schema.accounts會顯示:如果看到該用戶的流量,它將顯示每個用戶名@主機名流量來源。 也有統計由帳戶彙總,查找'%_by_account%'表。

http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html