MySQL 常見錯誤代碼分類速查 (新手版)
遭遇錯誤代碼時,快速定位類別與常見原因是解決問題的第一步。本文將高頻錯誤碼分為六大類,提供一頁式對照表供開發與維運參考。
連線與權限錯誤 (最高頻)
| 代碼 | 簡述 | 典型場景 | 快速修正 |
| 1040 | Too many connections | 連線池洩漏、max_connections 過小 | 檢查應用關閉連線、調大參數 |
| 1042 | Bad host | DNS 解析失敗、skip-name-resolve | 用 IP 直連、修 /etc/hosts |
| 1043 | Invalid connection | 協定不符、SSL 驗證失敗 | 確認驅動版本、useSSL=false |
| 1044 | Access denied for user | 無庫/表權限 | GRANT SELECT ON db.* TO user@host |
| 1045 | Access denied (password) | 密碼錯誤、host 不匹配 | 重設密碼、檢查 user 表 host 欄 |
| 1130 | Host not allowed | IP 不在允許清單 | CREATE USER 'u'@'%' IDENTIFIED BY 'p' |
| 1133 | User doesn't exist | 用戶名拼錯、host 不對 | SELECT User, Host FROM mysql.user |
| 1227 | Need SUPER privilege | 執行管理指令缺權限 | DBA 執行或授予對應權限 |
資料完整性錯誤
| 代碼 | 簡述 | 典型場景 | 快速修正 |
| 1022 | Duplicate key | 主鍵/唯一索引衝突 | INSERT IGNORE、ON DUPLICATE KEY UPDATE |
| 1048 | Column cannot be null | NOT NULL 欄位未給值 | 補 DEFAULT、應用層驗證 |
| 1062 | Duplicate entry | 同 1022,含具體值 | 業務去重、唯一索引設計 |
| 1169 | Duplicate on update | UPDATE 導致唯一鍵衝突 | 檢查 WHERE 條件 |
| 1216 | FK check fail (child) | 子表插入父表不存在的值 | 先插父表、或暫停 FK 檢查 |
| 1217 | FK check fail (parent) | 刪除父表時子表仍有引用 | 先刪子表、或 CASCADE |
資源與儲存錯誤
| 代碼 | 簡述 | 典型場景 | 快速修正 |
| 1021 | Disk full | 磁碟空間耗盡 | 清理日誌、擴充磁碟、壓縮表 |
| 1037 | Out of memory | 記憶體不足 | 調整 buffer_pool、檢查記憶體洩漏 |
| 1038 | Sort buffer full | 大排序記憶體不足 | sort_buffer_size 調大 |
| 1114 | Table is full | MEMORY 表滿、磁碟滿 | max_heap_table_size 調大 |
| 1116 | Too many open tables | table_open_cache 過小 | 調大 table_open_cache |
| 1205 | Lock wait timeout | 交易鎖等待超過 50 秒 | 優化長交易、innodb_lock_wait_timeout |
| 1226 | User resource exceeded | 用戶連線/查詢/更新超限 | 調整 user 資源限制 |
結構與語法錯誤
| 代碼 | 簡述 | 典型場景 | 快速修正 |
| 1005 | Can't create table | 外鍵定義錯、引擎不支援 | 檢查 REFERENCES、引擎相容 |
| 1007 | Database exists | 重複建庫 | CREATE DATABASE IF NOT EXISTS |
| 1008 | Database not exists | 刪除/使用不存在的庫 | DROP DATABASE IF EXISTS |
| 1025 | Error on rename | RENAME 失敗 (FK、觸發器) | 先移除依賴物件 |
| 1050 | Table exists | 重複建表 | CREATE TABLE IF NOT EXISTS |
| 1051 | Table not exists | 查詢不存在的表 | 確認拼寫、大小寫敏感 |
| 1054 | Unknown column | 欄位名錯誤 | DESCRIBE table 核對 |
| 1065 | Empty query | SQL 字串為空 | 應用層驗證非空 |
| 1146 | Table doesn't exist | 同 1051 | 同上 |
| 1149 | Syntax error | SQL 語法錯誤 | 參考手冊、EXPLAIN 驗證 |
| 1235 | Version too old | 功能需新版本 (CTE、窗口函數等) | 升級 MySQL、改用相容寫法 |
網路與複寫錯誤
| 代碼 | 簡述 | 典型場景 | 快速修正 |
| 1081 | Can't create socket | 埠佔用、權限、SELinux | netstat -tlnp | grep 3306 |
| 1158-1161 | Network read/write error/timeout | 網路抖動、防火牆、MTU | 檢查網路、調大 timeout 參數 |
| 1180 | Commit failed | Binlog/Redo log 寫入失敗 | 檢查磁碟、錯誤日誌 |
| 1181 | Rollback failed | Undo log 損壞 | 重啟恢復、或從備份還原 |
新手排查三步驟
- 看代碼: 對照上表定位類別
- 看日誌:
tail -f /var/log/mysql/error.log
- 看狀態:
SHOW ENGINE INNODB STATUS、SHOW PROCESSLIST
錯誤代碼是資料庫的「體溫計」。熟悉高頻代碼含義,能將排查時間從小時縮減至分鐘。建議列印此表貼在工位旁。