萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

解決 Warning: mysql_connect() 連接被拒絕:MySQL 服務自動停止排查

錯誤現象

Warning: mysql_connect() [function.mysql-connect]: [2002] 
由於目標機器積極拒絕,無法連接。 (trying to connect via tcp://localhost:3306)

後續 mysql_select_db()、mysql_query()、mysql_num_rows() 連鎖報錯。

根因分析

錯誤代碼 2002 (CR_CONN_HOST_ERROR) 表示**無法連接到 MySQL 服務器**,常見原因:

  1. MySQL 服務未運行(最常見)
  2. 端口 3306 被佔用/防火牆阻擋
  3. 配置錯誤(bind-address、skip-networking)
  4. 服務因資源耗盡(OOM、磁碟滿)自動停止

排查步驟

1. 檢查服務狀態

# Windows
net start mysql
sc query mysql

# Linux
systemctl status mysqld
service mysql status

2. 查看錯誤日誌(關鍵)

# Linux
tail -f /var/log/mysqld.log
# Windows
type "C:\ProgramData\MySQL\MySQL Server 5.7\Data\主機名.err"

尋找:Out of memory、No space left on device、InnoDB: Fatal error 等。

3. 本文案例:資料處理導致服務崩潰

原文作者發現:執行大量資料處理腳本後 MySQL 自動停止,重啟服務即恢復。

可能原因:

  • 無限循環/大事務導致記憶體耗盡 (OOM Killer 殺掉進程)
  • 磁碟寫入過大觸發磁碟滿
  • 鎖等待超時導致服務假死被監控重啟

解決方案

原因解決
服務未啟動net start mysql / systemctl start mysqld
配置錯誤檢查 bind-address=0.0.0.0、註解 skip-networking
端口衝突netstat -ano | findstr 3306 找佔用進程殺掉或改埠
資源耗盡優化 SQL、分批處理、增加 swap、擴容記憶體/磁碟
權限問題確認用戶主機匹配、FLUSH PRIVILEGES

代碼層面防禦

# PHP 連接檢查
$link = @mysql_connect('localhost', 'user', 'pass');
if (!$link) {
    die('連接失敗: ' . mysql_error());
}
# 建議改用 mysqli/PDO 並啟用異常模式

總結

「目標機器積極拒絕」絕大多數情況下**不是網絡/防火牆問題,而是 MySQL 服務沒跑起來**。優先檢查服務狀態與錯誤日誌,針對根因(資源、配置、代碼邏輯)解決,而非單純重啟掩蓋問題。

copyright © 萬盛學電腦網 all rights reserved