如何在Windows中每隔60秒杀死MySQL查询或休眠连接?
我想每分钟检查一次MySQL服务器,并终止运行时间超过150秒的查询。我想这样做的主要原因是因为我不希望某些人的查询锁定其他人的数据库。我知道这不是问题的最终解决方案,但至少在查询出错时,这是一种退路。我没有从数据库(这只是一个在家里的项目) 我想安排一个脚本来运行,为我做到这一点。我不熟悉Perl或Ruby,我需要在Windows 2008服务器盒上完成它。我已经考虑过创建一个简单的cmd行脚本,但这似乎是不可能的。我知道目前我可以这样做,但我必须手动执行:如何在Windows中每隔60秒杀死MySQL查询或休眠连接?,mysql,sql,windows-server-2008,Mysql,Sql,Windows Server 2008,我想每分钟检查一次MySQL服务器,并终止运行时间超过150秒的查询。我想这样做的主要原因是因为我不希望某些人的查询锁定其他人的数据库。我知道这不是问题的最终解决方案,但至少在查询出错时,这是一种退路。我没有从数据库(这只是一个在家里的项目) 我想安排一个脚本来运行,为我做到这一点。我不熟悉Perl或Ruby,我需要在Windows 2008服务器盒上完成它。我已经考虑过创建一个简单的cmd行脚本,但这似乎是不可能的。我知道目前我可以这样做,但我必须手动执行: mysqladmin proces
mysqladmin processlist
mysqladmin kill
有人对我如何做到这一点有什么想法或例子吗?如果你安装了Wscript,我想应该是这样的,你可以试试这个。另存为“somethingorother.vbs”,并不时执行。也可以使用提供的循环。对实物期权的loop和kill都进行了注释;在生产服务器上取消注释之前测试脚本 我假设“mysqladmin processlist”输出如下内容(取自我的XP): 因此,我们必须消除包含“----”的行和包含“Id|User”的行,剩下的是
| 21 | root | localhost:1648 | | Query | 0 | | show processlist |
我们可以通过管道符号“|”将其拆分,得到从0到8的九个字段:
0 1 2 3 4 5 6 7 8
| 21 | root | localhost:1648 | | Query | 0 | | show processlist |
字段#1是Id,字段#6生成运行时
Option Explicit
Dim objShell, objWshScriptExec, objStdOut, strLine
Dim id, fields, rt, Killer, KillRun
' While True
' WScript.Sleep 150000
Set objShell = CreateObject("WScript.Shell")
Set objWshScriptExec = objShell.Exec("mysqladmin processlist")
Set objStdOut = objWshScriptExec.StdOut
While Not objStdOut.AtEndOfStream
strLine = objStdOut.ReadLine
If (InStr(strLine, "----") = 0 and InStr(strLine, "| Id | User |") = 0) Then
fields = Split(strLine, "|")
id = trim(fields(1))
rt = trim(fields(6))
If rt > 150 Then
' Set Killer = CreateObject("WScript.Shell")
' Set KillRun = objShell.Exec("mysqladmin kill " & id)
echo
End If
End If
Wend
' Wend
这是我最后使用的脚本。感谢伊瑟尼的最初回答,帮助我达到了这一点 我最终从调用cscript.exe的.bat文件启动了它,因为我可以将消息输出到命令行控制台(而不是消息框)。如果要输出到文本文件,也可以添加该文件,只需确保启动具有完全管理员UAC访问权限的.bat文件即可。下面是.bat文件包含的内容:
C:\Windows\System32\cscript.exe "C:\Program Files\MySQL\MySQL Server 5.6\bin\kill-slow-queries.vbs"
下面是.vbs文件中的内容:
Option Explicit
Dim objShell, objWshScriptExec, objStdOut, strLine, fields
Dim id, rt, Killer, KillRun
While True
WScript.Sleep 10000
Set objShell = CreateObject("WScript.Shell")
Set objWshScriptExec = objShell.Exec("C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqladmin processlist -u root -pMYPASSWORD")
Set objStdOut = objWshScriptExec.StdOut
On Error Resume Next
While Not objStdOut.AtEndOfStream
strLine = objStdOut.ReadLine
If InStr(strLine, "| 1") > 0 or InStr(strLine, "| 2") > 0 or InStr(strLine, "| 3") > 0 or InStr(strLine, "| 4") > 0 or InStr(strLine, "| 5") > 0 or InStr(strLine, "| 6") > 0 or InStr(strLine, "| 7") > 0 or InStr(strLine, "| 8") > 0 or InStr(strLine, "| 9") > 0 Then
fields = Split(strLine, "|")
id = trim(fields(1))
rt = trim(fields(6))
If rt = "" Then
rt = 0
End If
WScript.Echo "ID: " + id + " Time: " + rt
If rt > 80 Then
Set Killer = CreateObject("WScript.Shell")
Set KillRun = objShell.Exec("C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqladmin kill " + id + " -u root -pMYPASSWORD")
WScript.Echo "Killed ID: " + id
End If
End If
Wend
WScript.Echo ""
WScript.Echo ""
Wend
我之所以使用If语句来检查每个整数,是因为它保证与进程的ID号完全匹配。除了这九个选项之外的任何选项都将失败,您永远不知道进程列表可能包含什么,因此安全总比抱歉好。mysqladmin最有可能需要有效的mysql登录,否则任何具有CLI访问权限的tom/dick/harry都可能阻塞您的数据库。e、 g
mysqladmin--user=fred--password=123456 processlist
。是的,我知道。我只是把它放在那里简化了。服务器上有哪些脚本语言可用?您是否尝试过使用Windows任务计划程序调用您的脚本?我没有脚本。。。任务调度器易于设置。我的问题是,剧本应该是什么?有没有一个脚本可以在不使用Perl或Ruby的情况下实现这一点。。。。可能只是使用mysql和命令行?这是正确的。我得到一个“下标超出范围:”[编号:1]'第17行char 8.Hmmm.检查'mysqladmin processlist'的输出。编辑我的答案以指定。您可以提供mysqladmin processlist
的部分输出以允许检查。它在第+----------++------------------------------++------------------------------++----------------------------------------++------------------------------++行崩溃。出于某种原因,它正在通过您的If声明。现在应该更明确:-)有更多的问题,但我正在解决它们…我会在完成后发布脚本的完整代码。谢谢你的帮助,你救了我一天!
Option Explicit
Dim objShell, objWshScriptExec, objStdOut, strLine, fields
Dim id, rt, Killer, KillRun
While True
WScript.Sleep 10000
Set objShell = CreateObject("WScript.Shell")
Set objWshScriptExec = objShell.Exec("C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqladmin processlist -u root -pMYPASSWORD")
Set objStdOut = objWshScriptExec.StdOut
On Error Resume Next
While Not objStdOut.AtEndOfStream
strLine = objStdOut.ReadLine
If InStr(strLine, "| 1") > 0 or InStr(strLine, "| 2") > 0 or InStr(strLine, "| 3") > 0 or InStr(strLine, "| 4") > 0 or InStr(strLine, "| 5") > 0 or InStr(strLine, "| 6") > 0 or InStr(strLine, "| 7") > 0 or InStr(strLine, "| 8") > 0 or InStr(strLine, "| 9") > 0 Then
fields = Split(strLine, "|")
id = trim(fields(1))
rt = trim(fields(6))
If rt = "" Then
rt = 0
End If
WScript.Echo "ID: " + id + " Time: " + rt
If rt > 80 Then
Set Killer = CreateObject("WScript.Shell")
Set KillRun = objShell.Exec("C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqladmin kill " + id + " -u root -pMYPASSWORD")
WScript.Echo "Killed ID: " + id
End If
End If
Wend
WScript.Echo ""
WScript.Echo ""
Wend