簡體   English   中英

如何在Windows中每60秒殺死MySQL查詢或睡眠連接?

[英]How can I kill MySQL queries or sleeping connections every 60 seconds in Windows?

我想每分鍾檢查我的MySQL服務器並殺死運行時間超過150秒的查詢。 我想要這樣做的主要原因是,我不想讓某些人的查詢為其他所有人鎖定數據庫。 我知道這不是解決問題的最終方法,但至少是回退,以防查詢出現問題。 我沒有從屬DB(這只是一個在家項目)。

我想安排一個腳本來執行此操作。 我不熟悉Perl或Ruby,我需要在Windows 2008 Server機器上完成它。 我已經研究過創建一個簡單的cmd行腳本,但這似乎是不可能的。 我知道目前我可以做這樣的事情,但是我必須手動做:

mysqladmin processlist
mysqladmin kill

有人對我該如何做有任何想法或例子嗎?

如果您安裝了Wscript-我認為應該-您可以嘗試此操作。 另存為“ somethingorother.vbs”並不時執行。 或者,您可以使用提供的循環。 循環選項和“殺死真相”選項均已注釋; 在生產服務器上取消注釋之前測試腳本。

我假設“ mysqladmin processlist”輸出如下所示(取自我的XP):

+----+------+----------------+----+---------+------+-------+------------------+
| Id | User | Host           | db | Command | Time | State | Info             |
+----+------+----------------+----+---------+------+-------+------------------+
| 21 | root | localhost:1648 |    | Query   | 0    |       | show processlist |
+----+------+----------------+----+---------+------+-------+------------------+

因此,我們必須消除包含“ ----”的行和包含“ Id | User”的行,剩下的就是

| 21 | root | localhost:1648 |    | Query   | 0    |       | show processlist |

我們可以用管道符號'|'進行分割,從0到8獲得9個字段:

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

這是我最終使用的最終腳本。 感謝Iserni的最初回答,這幫助我達到了這一點!

我最終從調用csript.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語句檢查每個Integer的原因是因為它保證並與進程的ID號完全匹配。 除了這9個選項之外的任何其他選項都將失敗,並且您永遠都不知道進程列表中可能包含的內容,因此比后悔更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM