Anemometer已经不更新了,pt-query-digest 3.0.11后续版本生成的checksum包含英文字母,点击SQL的checksum进详情页提示:“Unknown checksum: ……”
说明:
老版本pt-query-digest生成的checksum是纯数字,anemometer为了展示美观(固定长度)等原因,将checksum转成16进制列表展示,进详情页后,再讲16进制转换成10进制查找具体SQL详情。这两次转换无法将有因为字母的checksum正确转换,因此详情页无法找到chencsum。
方案:
去掉checksum的两次转换,列表直接显示原checksum。
修改内容,去除转换
# vi conf/config.inc.php
$conf['reports']['slow_query_log'] = array(
'callbacks' => array(
'table' => array(
//注释此行
//'checksum' => function ($x) { return array(dec2hex($x), ''); }
)
)
# vi lib/Anemometer.php
private function translate_checksum($checksum)
{
else if (preg_match('/^[0-9A-Fa-f]+$/', $checksum))
{
//改为直接return $checnsum
//return $this->bchexdec($checksum);
return $checksum;
}
anemometer根据checksum查询时,默认该值为数字,因此where条件后面的变量$checksum未使用单引号,导致报错:Unknown column ……
修改以下文件,$checksum要加单引号:
# vi lib/AnemometerModel.php
$query = "SELECT `{$checksum_field_name}` FROM `{$this->fact_table}` WHERE `{$checksum_field_name}`='" . $this->mysqli->real_escape_string($checksum) . "'";
$sql .= " WHERE `{$checksum_field_name}`='" . $this->mysqli->real_escape_string($checksum) . "'";
$result = $this->mysqli->query("SELECT * FROM `{$this->fact_table}` WHERE `{$checksum_field_name}`='{$checksum}'");
$sql = "SELECT * FROM `{$table}` WHERE `{$checksum_field_name}`='{$checksum}' ORDER BY `{$time_field_name}` DESC LIMIT {$limit} OFFSET {$offset}";
完。。。