如何回溯一个mysql查询?

时间:2014-05-06 05:40:21

标签: php mysql

我有一个庞大而复杂的系统,包含phpjavascript代码,可以进行多次mysql次查询。有没有办法回溯'每个mysql查询到确切的代码行,这会产生查询?

mysql中,可以跟踪所有查询(向log配置添加mysql语句),但不会显示php或{{1代码/模块/行执行了查询。是否可以找到每个javascript查询的违规行?

1 个答案:

答案 0 :(得分:1)

不,MySQL无法知道您正在拨打什么代码,类,函数或文件。它只是从运行代码的应用程序接收套接字连接,并接受输入,处理它并返回结果。

所有它知道的是它收到的数据,以及谁发送它。

您可以使用

查看有效连接和他们正在做的事情的简要说明
SHOW PROCESSLIST;

您将获得类似于此的输出:

Id  User    Host        db  Command Time    State   Info
48  test    10.0.2.2:65109  test    Sleep   4621        
51  test    10.0.2.2:49717  test    Sleep   5       
52  test    10.0.2.2:49718  test    Query   0       SHOW PROCESSLIST

通常,当人们想要记录查询时,它有点类似于

  1. 在运行查询之前,记录查询和任何参数
  2. 运行查询
  3. 记录查询的成功/失败以及任何错误
  4. 要为具有数百或数千个查询的系统执行此过程,您通常会发现创建了一个包装函数/类,它接受相应的参数,处理上面列出的查询,并返回结果。您可以在调用时将PHP Constants __FILE____LINE__传递给您的包装器方法,然后记录启动数据库调用的位置。

    仅限伪代码

    // Wrapper method
    function query_wrapper($stm, $file, $line)
    {
      log_prequery($stm, $file, $line); // Log the query, file and line
      $result = $stm->execute(); // Execute the query
      log_postquery($result); // Log the result (and any errors)
      return $result; // Return the result
    }
    
    // In your code where you're making a database query
    $db = new Database();
    $stm = $db->prepare("SELECT foo FROM bar");
    query_wrapper($stm, __FILE__, __LINE__);