簡體   English   中英

記錄每個用戶的所有MySQL事務

[英]Log all MySQL transactions on a per user basis

我有一個PHP應用程序,它為多個用戶使用一個數據庫。 用戶登錄后,其ID存儲在會話中,並且他們使用該應用程序檢索或更新數據庫中的數據。

出於安全性/歸檔目的,我想記錄每個用戶的每個SQL事務。 請注意,“用戶”不是MySQL用戶,因為他們僅使用一個用戶。 我該怎么做呢?

我目前正在使用Centos 5.8,PHP 5.3.18和MySQL 5.5。

謝謝

$sql = "UPDATE table SET col = ?"
$db->prepare($sql);
//some params etc... 
$filename = '/dir/logs/log-' . $_SESSION['username'] . '';
$handle = fopen($filename, "wr");
$db->execute();
fwrite($handle, $sql);

這是一個簡單的示例,說明如何使用查詢執行和寫入以用戶命名的文件。 好吧,使用這種方式,也許您會在執行之前獲得$ sql的內容,但是我想您已經明白了。

PS:Thx編輯:)

您可以配置MySQL以生成常規查詢日志 (GQL)。 此日志記錄已建立的客戶端連接和從所有客戶端收到的語句。 這是一個常規的文本日志文件,它按照接收到的命令記錄針對DBMS的每個命令。 它包含時間戳記,Id,命令和參數。

由於數據庫請求通過服務器在本地運行,因此不存在IP地址和會話。 時間戳允許與Web服務器中客戶端的IP條目(即Apache httpd或Tomcat Access日志文件 (ALF))進行相當精確的匹配。

我們使用GQL來增強GWT Web應用程序生成的稀疏ALF信息。

此示例常規查詢日志應為您提供以下思路:

110602 12:55:20     3 Connect   root@localhost on w2p
            3 Query /* mysql-connector-java-5.1.15 ( Revision: ${bzr.revision-id} ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect'
110602 12:55:21     3 Query /* mysql-connector-java-5.1.15 ( Revision: ${bzr.revision-id} ) */SELECT @@session.auto_increment_increment
            3 Query SHOW COLLATION
            3 Query SET NAMES utf8mb4
            3 Query SET character_set_results = NULL
            3 Query SET autocommit=1
            3 Query select * from user where username = 'asdasd' and password = 'aa'
            1 Query show global status
110602 12:55:25     1 Query show global status
110602 12:55:30 3 Query select * from user where username = 'costis' and password = 'snafu'

您可以打開並閱讀MySQL常規查詢日志 它包含所有這樣的查詢:

...
130404 19:02:50   476 Connect   test@localhost on test
          476 Query SET NAMES utf8
          476 Query SELECT * FROM `table1`
130404 19:02:52   476 Quit
130404 19:03:33   477 Connect   test@localhost on test
          477 Query SET NAMES utf8
...

476、477等是MySQL線程ID 每個新連接都擁有其ID。 您只需要知道用戶的線程ID即可 對於PHP mysqli擴展,可以使用mysqli_thread_id()

echo $_SESSION['username'].' '.
     date('Y-m-d H:i:s').' '.
     mysqli_thread_id($link);

將此值存儲到某個位置以匹配日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM