1. 程式人生 > 資料庫 >MySQL kill指令使用指南

MySQL kill指令使用指南

KILL [CONNECTION | QUERY] processlist_id

在Mysql中每個連線都是單獨執行緒執行,可以使用語句 KILL processlist_id statement.來終止語句執行。

KILL允許可選 CONNECTION或QUERY 修飾符:

  • KILL CONNECTION ,KILL與無修飾符相同 :終止與給定關聯的連線 processlist_id,在終止該連線正在執行的任何語句之後。
  • KILL QUERY終止連線當前正在執行的語句,但保持連線本身不變。

使用show processlist 檢視所有id

MySQL kill指令使用指南

Kill 指令使用

如果我們應用執行SQL後,由於鎖select for update或者數量太大,導致執行SQL卡在資料庫,此時想取消該SQL怎麼辦?可以通過kill命令停止mysql執行緒或者是取消該SQL執行,此處需要到底是執行 kill threadId指令還是 kill query theadId指令?

kill與kill query 最大區別是是否取消該連線上執行的所有sql,即是否關閉該執行緒,如果關閉該執行緒即對應JDBC中statement關閉

-- 資料庫鎖住acctno=13記錄 然後執行如下更新語句
update test set acctname ='12' where acctno=13

show processlist檢視正在執行sql的執行緒id

MySQL kill指令使用指南

如果想取消該SQL執行,可以使用命令 kill query 407 取消SQL執行,執行後407執行緒並不會消失,如果該連線上有SQL執行會繼續執行;但是如果使用kill 407 ,407執行緒會消失。使用時需要注意二者差異。

執行緒id除了通過show processlist檢視,也可以使用程式設計的方式獲取threadId

 Connection connection = getConnection();
 ((MysqlConnection)connection).getSession().getThreadId();

Statement cancel方法

我們使用JDBC程式設計方式對資料庫進行操作時,可以也可以使用Statement物件的cancel方法進行取消,Mysql驅動內部也是傳送Kill query threadId 指令,Mysql驅動cancel方法原始碼

 public void cancel() throws SQLException {
    try {
      if (this.query.getStatementExecuting().get()) {
        if (!this.isClosed && this.connection != null) {
          JdbcConnection cancelConn = null;
          Object cancelStmt = null;

          try {
            HostInfo hostInfo = this.session.getHostInfo();
            String database = hostInfo.getDatabase();
            String user = StringUtils.isNullOrEmpty(hostInfo.getUser()) ? "" : hostInfo.getUser();
            String password = StringUtils.isNullOrEmpty(hostInfo.getPassword()) ? "" : hostInfo.getPassword();
            NativeSession newSession = new NativeSession(this.session.getHostInfo(),this.session.getPropertySet());
            newSession.connect(hostInfo,user,password,database,30000,new TransactionEventHandler() {
              public void transactionCompleted() {
              }

              public void transactionBegun() {
              }
            });
            //驅動內部使用 KILL QUERY + threadId 指令取消
            newSession.sendCommand((new NativeMessageBuilder()).buildComQuery(newSession.getSharedSendPacket(),"KILL QUERY " + this.session.getThreadId()),false,0);
            this.setCancelStatus(CancelStatus.CANCELED_BY_USER);
          } catch (IOException var13) {
            throw SQLExceptionsMapping.translateException(var13,this.exceptionInterceptor);
          } finally {
            if (cancelStmt != null) {
              ((Statement)cancelStmt).close();
            }

            if (cancelConn != null) {
              ((JdbcConnection)cancelConn).close();
            }

          }
        }

      }
    } catch (CJException var15) {
      throw SQLExceptionsMapping.translateException(var15,this.getExceptionInterceptor());
    }
  }

客戶端工具執行

客戶端工具執行SQL後取消執行,有些工具發 kill 命令 有些發kill query 指令,可以通過抓包工具驗證下Navicat工具傳送什麼指令,抓包工具推薦Wireshark,很強大。

MySQL kill指令使用指南

是kill 指令,對應的執行緒ID為407,也有部分工具是傳送的kill query指令。

以上就是MySQL kill指令使用指南的詳細內容,更多關於MySQL kill指令的資料請關注我們其它相關文章!