Eliminar procesos MySQL que están en estado SLEEP por determinado tiempo

Con el presente script, monitoreamos los procesos MySQL que están en estado SLEEP por un tiempo mayor al configurado como aceptable.  Si encontramos un proceso que cumpla con esta regla lo eliminamos con la sentencia KILL ProcessID de MySql.

  1. Copiar el código en un archivo
  2. Darle permiso de ejecución
  3. Configurar datos de conexión MySql y notificación por e-mail.
  4. Crear un usuario que tenga permisos sobre las tablas que queremos trabajar
  5. Agendar la ejecución del script en el sistema.
$mysql_host = "127.0.0.1";
$mysql_user = "system";
$mysql_pass = "12345";

//Definimos el tiempo limite para una query en sleep in seconds
$mysql_query_sleep_limit = 250;

//Definimos contra que comando monitorearemos
$mysql_query_name = "Sleep";

//Definimos un array con el usuario/base a monitorear
$mysql_query_user_db_monitoring  = array(
					  array('myusuario','mydb')
					);

//Definimos las variables para el envio de e-mails
$NotifySystemFrom 	= "script-monitoring@mydominio.com";
$ArrNotifySystemTo 	= array("soporte@mydominio.com","otro@mydominio.com");
$NotifySystemSubject	= "Notificacion, Queryes in Sleep Killed!";

$SendNotification       = false;

$conn = mysql_connect($mysql_host,$mysql_user,$mysql_pass);

If($conn){
	$result = mysql_query("show full processlist",$conn);
	while( $Record = mysql_fetch_array($result) ){
 		$Ret[] = $Record;
	}
	if(count($Ret)>0){
		$HtmlToMail  = "<table  BGCOLOR='#FFE4B5'>";
		$HtmlToMail .= "<tr bgcolor='#FFD700'>";
		$HtmlToMail .= "<th align='left'>ID		</th>";
		$HtmlToMail .= "<th align='left'>User		</th>";
		$HtmlToMail .= "<th align='left'>Host		</th>";
		$HtmlToMail .= "<th align='left'>DB		</th>";
		$HtmlToMail .= "<th align='left'>Command	</th>";
		$HtmlToMail .= "<th align='left'>Time		</th>";
		$HtmlToMail .= "<th align='left'>State		</th>";
		$HtmlToMail .= "<th align='left'>Info		</th>";
		$HtmlToMail .= "<th align='left'>Action applied	</th>";
		$HtmlToMail .= "</tr>";
	
		while(list(,$val)=each($Ret)){
			if($val['Command'] == $mysql_query_name AND $val['Time']>=$mysql_query_limit AND in_array(array($val['User'],$val['db']),$mysql_query_user_db_monitoring)){
				//Eliminamos la query
				mysql_query("KILL $val[Id]",$conn);
				echo "Se elimina la consulta con ID:$val[Id]\n";
				$HtmlToMail .= "<tr>";
				$HtmlToMail .= "<td> $val[Id]			</td>";
				$HtmlToMail .= "<td> $val[User]			</td>";
				$HtmlToMail .= "<td> $val[Host]			</td>";
				$HtmlToMail .= "<td> $val[db]			</td>";
				$HtmlToMail .= "<td> $val[Command]	        </td>";
				$HtmlToMail .= "<td> $val[Time] 		</td>";
				$HtmlToMail .= "<td> $val[State]		</td>";
				$HtmlToMail .= "<td> $val[Info] 		</td>";
				$HtmlToMail .= "<td> PID Killed 		</td>";
				$HtmlToMail .= "</tr>";
				$SendNotification = true;
			}
		}
		
		$HtmlToMail .= "</table>";
		if($SendNotification){
		   SendMail($HtmlToMail);
		}
	}
}else{
	echo "Unable to connect - Mysql Error: ".mysql_error()."\n";
}

Function SendMail($Body){
    Global $NotifySystemFrom, $ArrNotifySystemTo, $NotifySystemSubject;
    //Definimos el header del mail de notificacion
    $Header = "From: $NotifySystemFrom \r\n";
    $Header .= "Mime-Version: 1.0 \r\n";
    $Header .= "Content-Type: text/html;charset=UTF-8";
    $NotyfyList = implode(",", $ArrNotifySystemTo);
    mail($NotyfyList,"$NotifySystemSubject [".date("d/M/Y H:i:s")."]",$Body, $Header);
}