MySQL:客戶端匯入資料Terminal close -- query aborted報錯

資料庫工作筆記發表於2024-02-07

來源:MySQL學習

這裡簡單記錄下問題的原因,供參考實際上這個問題是在nohup mysql < sql.sql &命令在nohup檔案中記錄了Terminal close -- query aborted。

重現

這個問題很容易重現如下,


 nohup /newdata/mysql/mysql8023/install/bin/mysql -S'/newdata/mysql/mysql8023/tmp/mysql3329.sock' -e 'select sleep(10000) from dual' &
ps -ef|grep mysql 找到程式id
kill -1 25026(程式ID)

為什麼報錯

實際上這是mysql客戶端收到了訊號SIGHUP訊號,然後mysql客戶端程式捕獲了這種訊號做出的行為重定義。如下,

#ifndef _WIN32
  signal(SIGINT, handle_ctrlc_signal);  // Catch SIGINT to clean up
  signal(SIGQUIT, mysql_end);           // Catch SIGQUIT to clean up
  signal(SIGHUP, handle_quit_signal);   // Catch SIGHUP to clean up
#else
Terminal close的報錯來自handle_quit_signal
void handle_quit_signal(int sig) {
  const char *reason = "Terminal close";

而在測試的時候我們是kill 直接發的SIGHUP訊號,用於模擬。

nohup失效?誰發出的SIGHUP?

這裡不是用nohup遮蔽了SIGHUP訊號嗎,為什麼在響應訊號SIGHUP呢?實際上這訊號和程式組有關,而mysql程式自己捕獲了SIGHUP訊號進行了重新處理,因此nohup遮蔽的目的失效了。而SIGHUP訊號本生是比較複雜的,涉及到程式組很多概念,有興趣的可以看看。那麼這裡誰發起了SIGHUP訊號呢?查詢資料後,一般有如下,

  • 使用nohup啟動,然後直接點選x號關閉SecureCRT
  • 使用nohup啟動,然後等SecureCRT終端超時
  • 使用kill -1 傳送了sighub訊號

接下寫一段簡單的訊號處理程式,只捕獲SIGHUP,並且簡單輸出一下(叫GPT寫就好了),

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle_sighup(int signum) {
    fprintf(stderr, "Received SIGHUP signal. Continuing execution...\n");
}
int main() {
    // 註冊自定義訊號處理程式
    signal(SIGHUP, handle_sighup);
    // 無限迴圈,保持程式執行
    while (1) {
        fprintf(stderr, "Program is running...\n");
        sleep(1);
    }
    return 0;
}

接下用用nohup ./a.out & 執行,我們分別測試kill -1 和 直接x號關閉SecureCRT,可以看到輸出中都有如下,MySQL:客戶端匯入資料Terminal close -- query aborted報錯

連續2次收到了SIGHUP訊號,一次是kill -1一次是x號關閉SecureCRT,說明nohup 失效了,如果我將程式改為收到訊號exit退出則會終止程式。因此我們的mysql程式也是一樣如果收到了SIGHUP訊號,mysql程式是報Terminal close後退出。

如何觀測

這個可以直接如下檢視

/proc/25109/status 

SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000                                          

SigIgn這一個點陣圖,到底哪些訊號唄忽略了。這裡明顯SIGHUP沒有忽略,下面是忽略的,

SigIgn: 0000000000000001

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027826/viewspace-3006580/,如需轉載,請註明出處,否則將追究法律責任。

相關文章