高頻錯誤代碼分類速查
數據庫/表操作類
| 代碼 | 含義 | 常見原因 |
| 1005 | 創建表失敗 | 外鍵定義錯誤、磁碟滿、權限 |
| 1006 | 創建數據庫失敗 | 權限、磁碟、目錄殘留 |
| 1007 | 數據庫已存在 | 重複 CREATE DATABASE |
| 1008 | 數據庫不存在 | DROP/USE 不存在的庫 |
| 1012 | 讀取系統表失敗 | 權限、表損壞 |
| 1050 | 表已存在 | 重複 CREATE TABLE |
| 1051 | 表不存在 | DROP/SELECT 不存在的表 |
| 1146 | 表不存在 | 同 1051,不同錯誤碼來源 |
數據完整性類
| 代碼 | 含義 | 處理建議 |
| 1022 | 鍵值重複 | 檢查唯一索引/主鍵衝突 |
| 1048 | 字段不能為空 | NOT NULL 列未賦值 |
| 1062 | 字段值重複 (Duplicate entry) | 主鍵/唯一索引衝突,最常見 |
| 1169 | 唯一鍵值重複 | UPDATE 導致唯一索引衝突 |
| 1216 | 外鍵約束失敗 (子表) | 引用的父表記錄不存在 |
| 1217 | 外鍵約束失敗 (父表) | 刪除/修改被引用的父表記錄 |
連接/權限類
| 代碼 | 含義 | 排查方向 |
| 1040 | 最大連接數達到 | 增大 max_connections、檢查連接洩漏 |
| 1042 | 無效主機名 | DNS 解析、skip-name-resolve |
| 1043 | 握手錯誤 | 協議不匹配、SSL 問題 |
| 1044 | 無庫訪問權限 | GRANT 權限檢查 |
| 1045 | 用戶名/密碼錯誤 | 認證信息、caching_sha2_password 插件 |
| 1130 | 主機無連接權限 | Host 列不匹配、防火牆 |
| 1226 | 用戶資源超限 | MAX_QUERIES_PER_HOUR 等限制 |
資源/臨時表類
| 代碼 | 含義 | 解決方向 |
| 1021 | 磁碟空間不足 | 清理/擴容、tmpdir 指向大分區 |
| 1037 | 內存不足 | 重啟/調整緩衝區、檢查內存洩漏 |
| 1038 | 排序內存不足 | 增大 sort_buffer_size |
| 1114 | 表已滿 | MyISAM 達到 4GB/2GB 限制、磁碟滿 |
| 1116 | 打開表太多 | 增大 table_open_cache |
網絡/事務類
| 代碼 | 含義 |
| 1158/1159 | 網絡讀錯誤/讀超時 |
| 1160/1161 | 網絡寫錯誤/寫超時 |
| 1180 | 提交事務失敗 |
| 1181 | 回滾事務失敗 |
| 1205 | 鎖等待超時 |
| 1203 | 用戶連接數達上限 |
錯誤碼查詢三大方法
- 官方文檔附錄:Error Codes and Messages
- 在線查詢:
https://dev.mysql.com/doc/refman/5.7/en/error-handling.html
- 命令行工具:
perror 1062 → Duplicate entry
Java 錯誤碼映射工具類
public class MySQLErrorCodes {
// 常用錯誤碼常量
public static final int ER_DUP_ENTRY = 1062;
public static final int ER_NO_REFERENCED_ROW = 1216;
public static final int ER_ROW_IS_REFERENCED = 1217;
public static final int ER_LOCK_WAIT_TIMEOUT = 1205;
public static final int ER_CON_COUNT_ERROR = 1040;
public static final int ER_ACCESS_DENIED = 1045;
// ... 其他常量
private static final Map<Integer, String> ERROR_MAP = new HashMap<>();
static {
ERROR_MAP.put(1005, "創建表失敗");
ERROR_MAP.put(1006, "創建數據庫失敗");
ERROR_MAP.put(1022, "鍵值重複");
ERROR_MAP.put(1045, "用戶名或密碼錯誤");
ERROR_MAP.put(1062, "字段值重複,入庫失敗");
ERROR_MAP.put(1114, "表已滿");
ERROR_MAP.put(1146, "表不存在");
ERROR_MAP.put(1158, "網絡讀錯誤");
ERROR_MAP.put(1205, "鎖等待超時");
ERROR_MAP.put(1216, "外鍵約束失敗,更新子表失敗");
ERROR_MAP.put(1217, "外鍵約束失敗,刪除父表失敗");
// 完整映射建議從官方 errmsg.txt 自動生成
}
public static String getMessage(int errorCode) {
return ERROR_MAP.getOrDefault(errorCode, "未知錯誤碼: " + errorCode);
}
public static boolean isDuplicateKey(int errorCode) {
return errorCode == 1022 || errorCode == 1062 || errorCode == 1169;
}
public static boolean isConnectionError(int errorCode) {
return errorCode >= 1040 && errorCode <= 1043 || errorCode == 1130 || errorCode == 1203;
}
public static boolean isForeignKeyError(int errorCode) {
return errorCode == 1216 || errorCode == 1217;
}
}
生產環境建議
- 異常捕獲時記錄完整錯誤碼、SQLSTATE、SQL 片段、堆棧。
根據錯誤分類實施差異化重試/告警策略(如主鍵衝突不重試、鎖超時指數退避重試、網絡錯誤熔斷)。
- 定期同步官方錯誤碼列表更新映射表。