2011-04-07 66 views

回答

3

運行從一個MySQL工具下面查看所有正在運行的程序(包括睡眠連接):

SHOW PROCESSLIST 

或者,您可以查詢INFORMATION_SCHEMA表以獲得相同的:

select * from information_schema.processlist 

要查看所有人已登錄的歷史記錄,可以將常規查詢日誌配置爲轉到表中,方法是將以下啓動參數添加到您的mysqld啓動「--log-output = TABLE --general-log」,然後你可以從general_log ta中查詢這些信息在mysql模式中。以下是查詢,你可以使用:

select * from mysql.general_log where command_type = 'Connect'; 

提醒一句的是,這個表可以得到巨大。你會想定期清理它。

+1

這隻會顯示當前正在運行的查詢 - 而不是以前誰訪問過數據庫。 – 2011-04-07 02:44:17

+0

啊。我錯過了。沒有辦法看到真正註銷的用戶,只能看到當前登錄的用戶(即使他們沒有運行查詢,他們仍會打開連接)。如果您想跟蹤所有人已經登錄,您可能需要創建一個cron作業,將該信息定期捕獲到表中,然後您可以查詢該表。 – squawknull 2011-04-07 02:46:41

+0

您也可以使用常規查詢日誌 - http://dev.mysql.com/doc/refman/5.1/en/query-log.html。您可以將其配置爲登錄到可以直接查詢的表格。 – squawknull 2011-04-07 02:48:16

1

通過查看SHOW PROCESSLIST或INFORMATION_SCHEMA.PROCESSLIST,可以獲得當前與數據庫保持連接的用戶。

該數據的歷史記錄是不存在的。使用其他地方建議的通用查詢日誌不是一個好主意,因爲它根本沒有擴展:一般查詢日誌記錄了服務器看到的每一條語句,並且它的寫入大大增加了LOCK_log和磁盤I/O.如果您的通用查詢日誌是CSV表,則無法有效查詢它,如果它是MyISAM表,它將基本上序列化數據庫中的所有查詢(即使是查詢!)。

也就是說,因爲每個查詢都需要被記錄,甚至讀取查詢。爲此,需要寫入一般查詢日誌。爲此,請求MyISAM日誌表上的表鎖。這是非常緩慢的,即使在低負載的服務器上也不會提供任何建議。

不支持通用查詢日誌的其他格式。

有一組變量可以定義服務器啓動,從屬連接和用戶連接的動作。

[email protected] [kris]> show global variables like 'init%'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| init_connect |  | 
| init_file  |  | 
| init_slave |  | 
+---------------+-------+ 
3 rows in set (0.00 sec) 

通過init_connect設置到註銷當前用戶,當前時間,你可以生成你想要在日誌中更可擴展的方式連接ID的INSERT語句。使用帶有auto_increment id的InnoDB表格。

請注意,出於安全原因,init_connect未針對root用戶(SUPER_PRIV)的登錄進行處理。這些將會逃避你的記錄。

在MySQL 5.5中,Audit API已添加到服務器。我相信你真正想要的是一個審計插件。詳情請參閱http://dev.mysql.com/doc/refman/5.5/en/writing-audit-plugins.html

相關問題