【问题标题】:MySQL "wait_timeout" not being honored for long query?MySQL“wait_timeout”不会因长查询而受到尊重?
【发布时间】:2012-04-19 03:00:18
【问题描述】:

我正在尝试测试似乎被忽略的wait_timeout MySQL 设置。

PHP 脚本:

<?php
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

$sql = mysqli_connect('localhost','root','root','mysql');
$query = "SHOW VARIABLES WHERE Variable_name='wait_timeout';";
$result = $sql->query($query) or die($query.'<br />'.$sql->error);
$row = $result->fetch_object();
echo "wait_timeout = " . $row->Value . "<br/>\n";

$time_start = microtime_float();
$query = "SELECT SLEEP(2) FROM mysql.user;";
$sql->query($query) or die($query.'<br />'.$sql->error);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "Query completed in $time seconds<br/>\n";
echo "You got the page";

脚本输出:

wait_timeout = 2
Query completed in 8.0005459785461 seconds
You got the page

我的配置

mariadb-server-5.3.5
php5.3.6

我需要做什么才能强制 MySQL 在一定时间后超时查询?

【问题讨论】:

  • wait_timeoutinteractive_timeout 都是断开连接之前的不活动时间。因此,连接必须处于空闲状态(不运行查询)才能被丢弃。 MySQL SLEEP() 不计算在内,因为您正在运行查询。您必须手动终止长时间运行的查询。您可以编写此脚本。
  • 我认为您正在尝试错误地使用 wait_timeout。如果我没记错的话,wait_timeout 和 interactive_timeout 不是查询持续时间。它们用于非活动连接而不是慢速查询或包含 SLEEP 的查询,连接仍然正常且处于活动状态...

标签: php mysql timeout mariadb


【解决方案1】:

wait_timeoutinteractive_timeout 都是断开连接之前的不活动时间。因此,连接必须处于空闲状态(不运行查询)才能被丢弃。 MySQL SLEEP() 不计算在内,因为您正在运行查询。

您必须手动终止长时间运行的查询(没有设置让 MySQL 为您执行此操作)。您可以编写此脚本。使用SHOW PROCESSLIST(或Innotop等外部工具)和KILL

【讨论】:

  • 是否有任何设置可以使 MySQL 在给定的预定义时间后停止执行查询?
  • 不,没有提供该功能的设置。正如我在回答中所描述的,您可以使用SHOW PROCESSLISTKILL 编写脚本。可能有一些第三方脚本或程序可以做到这一点。
  • @user359650, mk-kill 是一个命令行工具,您可以指定要杀死哪个进程的标准(例如忙碌时间)。如需包含 mk-kill 的完整工具包,请参阅Percona Toolkit
  • 我很惊讶MySQL 不处理基于预定义超时的查询终止。 mk-kill 似乎确实是我需要的。它现在是percona toolkit (percona.com/software/percona-toolkit) 的一部分
  • 是的,wait_timeout 是客户端不活动超时。据我所知,只有 .NET 和 Java 客户端有客户端超时,这会在语句耗时过长时终止长时间运行的查询。正如这里提到的,脚本“SHOW PROCESSLIST”+“KILL”会起作用。如果你有兴趣使用不是来自官方 MySQL 或 fork 的东西,Twitter 在其 GIT 分支 github.com/twitter/mysql/wiki/Statement-Timeout 中实现了服务器端超时
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 2020-02-21
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多