【发布时间】:2011-04-19 18:21:15
【问题描述】:
我使用 Workbench 和 phpMyAdmin 使用 mySql,我使用过程和函数等... 有时一个过程会触发另一个函数,依此类推……最终某处出现问题。
是否有任何已知的工具可以显示 mySql 运行的所有查询? 就像显示 MySql 运行的每个命令的命令提示符一样
这将是一个非常有用的调试工具
【问题讨论】:
标签: php debugging logging mysql
我使用 Workbench 和 phpMyAdmin 使用 mySql,我使用过程和函数等... 有时一个过程会触发另一个函数,依此类推……最终某处出现问题。
是否有任何已知的工具可以显示 mySql 运行的所有查询? 就像显示 MySql 运行的每个命令的命令提示符一样
这将是一个非常有用的调试工具
【问题讨论】:
标签: php debugging logging mysql
在您的数据库抽象类中,最好的方法是添加一个调试选项,将查询和调试信息记录到文件中,或者如果您的应用程序中有足够的开销,请将其全部保存在一个变量中,您可以在运行时检查。一旦你在那里获得了所有这些信息,你可以将它输出到一个带有控件的隐藏 div,或者直接使用 xdebug 和 netbeans 之类的东西来检查它。
一般来说 - 如果您有一个大型应用程序要调试,那么花一点时间研究断点和交互式调试是非常值得的 - 它的设置并不复杂,而且非常有用。我asked about this recently,它真的对我有帮助!
如果您的数据库调用不是抽象的(耻辱!),那么您可以使用 APD 扩展覆盖核心 PHP 函数以包含调试调用,如 PHP 站点上的this useful example 中所示。很有用!例如,您可以使用自己的代码覆盖 mysql_query() 以记录查询。
【讨论】:
编辑您的 MySQL 配置文件(my.cnf 或 my.ini)并在 [mysqld] 部分添加 log="/path/to/yourlog.log" 行。确保重新启动 MySQL 以使其获取配置文件中的更改。
这应该记录所有执行的查询(虽然我不确定它是否会记录在存储过程中执行的查询)。
【讨论】:
我在一个非常大的网站上使用了我制作的这个功能:
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;
}
}
【讨论】:
运行 SET GLOBAL general_log = 'ON'; ,所有查询都将记录到日志文件中。见here
【讨论】: