【问题标题】:Printing all the queries that mySql generates打印 mySql 生成的所有查询
【发布时间】:2011-04-19 18:21:15
【问题描述】:

我使用 Workbench 和 phpMyAdmin 使用 mySql,我使用过程和函数等... 有时一个过程会触发另一个函数,依此类推……最终某处出现问题。

是否有任何已知的工具可以显示 mySql 运行的所有查询? 就像显示 MySql 运行的每个命令的命令提示符一样

这将是一个非常有用的调试工具

【问题讨论】:

    标签: php debugging logging mysql


    【解决方案1】:

    在您的数据库抽象类中,最好的方法是添加一个调试选项,将查询和调试信息记录到文件中,或者如果您的应用程序中有足够的开销,请将其全部保存在一个变量中,您可以在运行时检查。一旦你在那里获得了所有这些信息,你可以将它输出到一个带有控件的隐藏 div,或者直接使用 xdebug 和 netbeans 之类的东西来检查它。

    一般来说 - 如果您有一个大型应用程序要调试,那么花一点时间研究断点和交互式调试是非常值得的 - 它的设置并不复杂,而且非常有用。我asked about this recently,它真的对我有帮助!

    如果您的数据库调用不是抽象的(耻辱!),那么您可以使用 APD 扩展覆盖核心 PHP 函数以包含调试调用,如 PHP 站点上的this useful example 中所示。很有用!例如,您可以使用自己的代码覆盖 mysql_query() 以记录查询。

    【讨论】:

      【解决方案2】:

      编辑您的 MySQL 配置文件(my.cnf 或 my.ini)并在 [mysqld] 部分添加 log="/path/to/yourlog.log" 行。确保重新启动 MySQL 以使其获取配置文件中的更改。

      这应该记录所有执行的查询(虽然我不确定它是否会记录在存储过程中执行的查询)。

      【讨论】:

        【解决方案3】:

        我在一个非常大的网站上使用了我制作的这个功能:

        
        
        
        define(test, 3);
        
        function my_query($SQL){//this is a layer over mysql_query to get interesting data while debugging
        
             if(test == 3){ // paranoia
        
                     $query_start = get_microtime_ms();
                     $exp = mysql_query("EXPLAIN ".$SQL);
                     $query_end =   get_microtime_ms();
                     $query_time = $query_end - $query_start;
                     $explain .="\n<table border=\"1\">";
                     $explain .="<tr><td>id</td><td>select_type</td><td>table</td><td>type</td><td>possible_keys</td><td>key</td><td>key_len</td><td>ref</td><td>rows</td><td>Extra</td></tr>";
        
                     while( $explain_r = mysql_fetch_array($exp)){
                         $explain .="\n\t<tr>";
                             for($i=0;$i<10;$i++){
                                 $explain .= "\n\t\t<td>".$explain_r[$i]." </td>";
                             }
                         $explain .="\n\t</tr>";
                     }
                     $explain .="\n</table>";
                     $r = mysql_query($SQL)or die(mysql_error(),$SQL);
                     $returned = mysql_num_rows($r);
                     print("<pre>".trim($SQL)."\n".$explain."Time spent: ".$query_time."\nReturned rows: ".$returned."\n--------------\n</pre>");
                     return $r;
        
             }
        
             if(test == 2){ // hard debugging
                 print("<pre>\n\n".trim($SQL)."\n--------------\n</pre>");
                 $r = mysql_query($SQL)or die((mysql_error(),$SQL));
                 return $r;
             }
             elseif(test == 1){ // testing
                 $r = mysql_query($SQL)or die((mysql_error(),$SQL));
                 return $r;
             }
             elseif(test == 0){ //production
        
                if($_SESSION['uid'] == 59){
                    $only_me = $SQL;
                }
        
        
        
             $r = mysql_query($SQL)or die(
                 mail("me@example.com",
                      "[Error http://".$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI']."] Error on ".$_SERVER['SCRIPT_NAME'],
                      "From: ".$_SERVER['REMOTE_ADDR'].
                      "\nReferer: ".$_SERVER['HTTP_REFERER']."\nDate: ".date()."\nError:\n".mysql_error()."\n".$SQL.
                      "\nUsername: ".$_SESSION['username']."\nhttp://".$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI'].
                      "\nRef: ".$_SERVER['HTTP_REFERER']).
                      " a query went wrong <a href=\"http://example.com\">Please click here to go back to home page</a><br><br><pre>$only_me".mysql_error()."</pre>");
                 return $r;
             }
        
         }
        
        
        

        【讨论】:

          【解决方案4】:

          运行 SET GLOBAL general_log = 'ON'; ,所有查询都将记录到日志文件中。见here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-17
            • 1970-01-01
            • 1970-01-01
            • 2017-02-02
            • 1970-01-01
            • 2016-05-01
            相关资源
            最近更新 更多