Mysql

客戶端超時,而 MySQL 查詢仍在執行?

  • February 11, 2021

我們遇到了一個問題,其中一個只讀查詢通過 MySQL 工作台執行,從使用者的 UI 角度來看超時,並在伺服器上繼續執行(並且顯然消耗越來越多的資源),直到我們發生中斷。

問題

  • 在 MySQL 中是否有處理此類問題的標準方法?
  • 是否有我們需要避免的根本原因?

您需要查看超時的預設值:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

通常,我會注意幾個超時變數。如果您從 MySQL Workbench、mysql 客戶端或應用程序伺服器上的 PHP 應用程序遠端使用 MySQL,並聯繫數據庫伺服器上的 MySQL,則這是非常必要的。

這是 MySQL 文件中所說的這些設置之一:

  • wait_timeout(預設 28800$$ 8 hours $$) :伺服器在關閉非互動式連接之前等待其活動的秒數。此超時僅適用於 TCP/IP 和 Unix 套接字文件連接,不適用於使用命名管道或共享記憶體建立的連接。線上程啟動時,會話 wait_timeout 值從全域 wait_timeout 值或從全域 interactive_timeout 值初始化,具體取決於客戶端的類型(由 mysql_real_connect() 的 CLIENT_INTERACTIVE 連接選項定義)。另請參見 interactive_timeout。
  • 互動超時(預設 28800$$ 8 hours $$) :伺服器在關閉互動式連接之前等待其活動的秒數。互動式客戶端被定義為使用 mysql_real_connect() 的 CLIENT_INTERACTIVE 選項的客戶端。另請參見 wait_timeout。
  • net_read_timeout(預設 30):在中止讀取之前等待來自連接的更多數據的秒數。當伺服器從客戶端讀取時,net_read_timeout 是控制何時中止的超時值。當伺服器寫入客戶端時,net_write_timeout 是控制何時中止的超時值。另請參見 slave_net_timeout。
  • net_write_timeout(預設 60):在中止寫入之前等待將塊寫入連接的秒數。另請參見 net_read_timeout。

請確保將這些超時設置得足夠高,以適應可能執行很長時間的查詢,其中可能包括:

  • 大量的UPDATEs
  • 大量的DELETEs
  • ENABLE KEYS在大型 MyISAM 上

要處理在您失去聯繫後繼續執行的查詢,您必須針對長時間執行的查詢的程序 ID執行KILL 。即使使用 KILL 命令,您也必須等待任何處於磁碟密集型步驟中間或正在進行內部互斥鎖的查詢。

引用自:https://dba.stackexchange.com/questions/10578