開發與維護 MySQL 系統時,錯誤代碼是診斷問題的第一線索。本文整理高頻錯誤代碼,按類別分組並附上成因與對策,方便快速定位並解決問題。
連線與權限類
| 代碼 | 訊息 | 常見成因 | 對策 |
| 1040 | Too many connections | 達到 max_connections 上限 | 調大 max_connections、檢查連線洩漏、啟用連線池 |
| 1042 | Bad host name | DNS 解析失敗、hosts 檔錯誤 | 檢查網路/DNS、使用 IP 直連 |
| 1044 | Access denied for user | 帳號缺乏資料庫權限 | GRANT 對應權限、刷新權限表 |
| 1045 | Access denied (user/password) | 帳號密碼錯誤、Plugin 不匹配 | 確認密碼、檢查 authentication_plugin |
| 1130 | Host not allowed to connect | 該 IP 未在允許清單 | 建立 '%' 或具體 IP 的用戶、flush privileges |
| 1226 | User has exceeded resources | 超過 MAX_QUERIES_PER_HOUR 等限制 | 調整用戶資源限制或優化查詢頻率 |
SQL 語法與語意類
| 代碼 | 訊息 | 常見成因 | 對策 |
| 1064 | Syntax error | SQL 拼寫錯誤、保留字未加反引號 | 檢查語法、用反引號包裹識別符 |
| 1065 | Empty query | 發送空查詢字串 | 檢查應用程式邏輯,避免空 SQL 執行 |
| 1149 | Syntax error (generic) | 同上 | 同上 |
資料完整性與約束類
| 代碼 | 訊息 | 常見成因 | 對策 |
| 1022 | Duplicate key | 唯一索引/主鍵衝突 | 檢查業務邏輯、使用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE |
| 1048 | Column cannot be null | NOT NULL 欄位未給值 | 補齊預設值或應用層驗證 |
| 1062 | Duplicate entry for key | 同 1022 | 同上 |
| 1169 | Duplicate value on update | UPDATE 導致唯一鍵衝突 | 同上 |
| 1216 | Foreign key constraint fails (child) | 子表插入父表不存在的值 | 先插入父表、檢查關聯欄位類型一致 |
| 1217 | Foreign key constraint fails (parent) | 刪除/更新父表時子表仍有引用 | 先處理子表記錄、或設定 ON DELETE CASCADE |
資源與儲存類
| 代碼 | 訊息 | 常見成因 | 對策 |
| 1021 | Disk full | 磁碟空間耗盡 | 清理日誌、擴充磁碟、啟用壓縮 |
| 1037 | Out of memory | 記憶體不足 | 優化查詢、調整 buffer 參數、增加記憶體 |
| 1038 | Sort buffer full | 排序緩衝區太小 | 增大 sort_buffer_size、避免大結果集排序 |
| 1114 | Table is full | MyISAM 達 4GB/2TB 限制、InnoDB 表空間滿 | 轉 InnoDB、擴充表空間、分區表 |
| 1116 | Too many open tables | table_open_cache 太小 | 調大 table_open_cache |
| 1205 | Lock wait timeout | 行鎖等待超過 innodb_lock_wait_timeout | 優化事務長度、索引覆蓋、調大超時值 |
網路與通訊類
| 代碼 | 訊息 | 常見成因 | 對策 |
| 1081 | Can't create socket | 檔案描述符耗盡、權限問題 | 調大 ulimit -n、檢查 socket 檔案權限 |
| 1158-1161 | Network read/write error/timeout | 網路不穩、防火牆、MTU、大封包 | 檢查網路、調整 net_read/write_timeout、啟用壓縮 |
其他高頻代碼
- 1005/1006/1007/1008/1009/1010/1011:建表/庫失敗、檔案操作錯誤 → 檢查權限、磁碟、路徑、外鍵定義。
- 1032:Record not found → 更新/刪除不存在的記錄。
- 1036:Table is read only → 檢查檔案系統唯讀、FLUSH TABLES WITH READ LOCK。
- 1050/1051/1054/1146:表/欄位存在性問題 → 檢查拼寫、大小寫敏感度(lower_case_table_names)。
- 1203:User connection limit reached → 調整 MAX_USER_CONNECTIONS。
- 1227:Access denied (SUPER privilege) → 需 SUPER 權限操作(如 SET GLOBAL、KILL 等)。
- 1235:Version too old for feature → 升級 MySQL 版本。
排查三步曲
- 看代碼:對照上表快速定位類別。
- 查日誌:
error.log、slow.log、應用層異常堆疊。
- 驗環境:`SHOW VARIABLES`、`SHOW ENGINE INNODB STATUS`、`ulimit -a`、磁碟/記憶體/網路狀態。
將此速查表加入書籤,下次遇到報錯即可秒級定位方向,事半功倍。