首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 常見錯誤與效能優化:DNS 反解、線程耗盡、DROP 失敗、匯入緩慢完整解決方案

     編輯:MySQL 資料庫相關知識

錯誤一:DNS 反解導致連線緩慢

現象

[Warning] IP address '192.168.1.10' could not be resolved: Name or service not known
SHOW PROCESSLIST 大量顯示:
| 592 | unauthenticated user | 192.168.1.10:35320 | NULL | Connect |   | login | NULL |

原因

MySQL 預設嘗試將客戶端 IP 反解析為主機名(雙向驗證),無 DNS/hosts 時阻塞等待逾時。

解決

[mysqld]
skip-name-resolve

重啟生效。副作用: 權限表 Host 欄只能用 IP 或 %,不可用主機名。


錯誤二:Can't create a new thread (errno 12)

三大常見原因

  1. MySQL 線程過多: max_connections 設過大或連線洩漏。
  2. 系統記憶體耗盡: 由 OOM Killer 或 swap 滿導致無法分配線程堆疊。
  3. OS 限制: ulimit -u(max user processes)過小,參見 ERROR 1135 排查。

解決策略

  • 調降 max_connections、啟用連線池、修復應用洩漏。
  • 排查記憶體佔用大戶,必要時擴容實體記憶體。
  • 調整 OS 線程限制(/etc/security/limits.d/)。

錯誤三:ERROR 1010 (HY000) Error dropping database

現象

DROP DATABASE xjtrace;
ERROR 1010 (HY000): Error dropping database (can't rmdir './xjtrace/

原因

資料庫目錄下存在非 MySQL 管理的檔案(如手動放入的 .txt、.sql、備份檔等),MySQL 拒絕刪除非空目錄。

解決

# 進入資料目錄清理
rm -f /var/lib/mysql/xjtrace/*.txt /var/lib/mysql/xjtrace/*.sql
# 再次執行 DROP DATABASE 即可成功

優化四:mysqldump 匯出快、匯入極慢

現象

400 萬筆資料匯出秒級,匯入卻耗時 2 小時。

關鍵參數加速匯入

# 1. 先確認目標庫參數
mysql> SHOW VARIABLES LIKE 'max_allowed_packet';   -- 1048576 (1MB)
mysql> SHOW VARIABLES LIKE 'net_buffer_length';   -- 16384 (16KB)

# 2. 匯出時對齊參數,使用多行 INSERT
mysqldump -uroot -p dbname \
  -e \
  --max_allowed_packet=1048576 \
  --net_buffer_length=16384 \
  > dump.sql
  • -e:啟用多行 INSERT(Extended INSERT),大幅減少 SQL 敘述數量。
  • max_allowed_packet / net_buffer_length:與目標庫一致,避免封包分片重組開銷。

實測效果

同樣 400 萬筆資料,匯入時間從 2 小時縮減至幾十秒。


綜合建議

問題類別核心對策預防機制
網路/DNSskip-name-resolve / 完善 /etc/hosts部署清單檢查項
資源耗盡監控連線數/記憶體/OS 限制告警閾值 + 自動擴容
操作失誤資料目錄純淨化、權限最小化自動化部署禁止手動放檔
效能調校mysqldump 參數對齊、延遲索引建立標準化匯出/匯入 SOP
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved