MySQL:客戶端匯入資料Terminal close -- query aborted報錯
來源: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,可以看到輸出中都有如下,
連續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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 技術分享 | MySQL Binlog 通過 MySQL 客戶端匯入資料庫效率低的原因MySql客戶端資料庫
- Mysql資料庫使用Navicat Mysql匯入sql檔案報錯MySql資料庫
- rsync 客戶端同步的時候報錯客戶端
- DB2 匯入和匯出 命令列和客戶端匯出DB2命令列客戶端
- mac os下使用mysql2報錯: rake aborted!MacMySql
- RAC禁止某個客戶端登入資料庫客戶端資料庫
- mysql資料匯入匯出MySql
- mysql資料匯出匯入MySql
- 三、T-SQL增刪改、資料的匯入匯出、客戶端-伺服器的關係SQL客戶端伺服器
- 客戶端連不上資料庫,如何來排錯客戶端資料庫
- mysql匯入報錯怎麼解決?MySql
- MySQL 客戶端安裝MySql客戶端
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- mysql匯入資料亂碼錯誤一則MySql
- 客戶端資料儲存概述客戶端
- 客戶端使用sysdba許可權登入資料庫客戶端資料庫
- mysql 資料庫匯入匯出MySql資料庫
- MySQL資料庫匯入匯出MySql資料庫
- MySQL入門--匯出和匯入資料MySql
- MySQL資料的匯入MySql
- mysql客戶端連線的幾個常見錯誤MySql客戶端
- Swoole 協程 MySQL 客戶端與非同步回撥 MySQL 客戶端的對比MySql客戶端非同步
- 客戶端連不上資料庫客戶端資料庫
- 【mysql】資料庫匯出和匯入MySql資料庫
- mysql匯入匯出.csv格式資料MySql
- mysqldump匯入匯出mysql資料庫MySql資料庫
- MySQL表資料匯入與匯出MySql
- Mysql 資料庫匯入與匯出MySql資料庫
- MYSQL資料檔案匯入MySql
- ORACLE MYSQL互相匯入資料OracleMySql
- JAVA通訊(一)——輸入資料到客戶端Java客戶端
- 客戶營銷屬性匯入(未成)
- mysql、redis 客戶端連線池MySqlRedis客戶端
- 命令列客戶端MySQL如何使用命令列客戶端MySql
- linux安裝mysql客戶端LinuxMySql客戶端
- 【轉】Oracle 9i客戶端匯出10g資料庫時報ora-33262錯誤Oracle客戶端資料庫
- MySQL資料匯入匯出牛刀小試MySql
- 客戶端連線資料庫的方法客戶端資料庫