前言
本文整理自 MySQL 原始碼 mysql/include/mysqld_error.h,涵蓋開發與運維中高頻出現的錯誤代碼,附帶中文說明與排查建議,方便快速定位問題。
核心錯誤代碼分類表
資料庫/資料表操作類
| 代碼 | 含義 | 常見原因與對策 |
| 1005 | 建立資料表失敗 | 外鍵定義錯誤、引用表不存在、字元集不一致 |
| 1006 | 建立資料庫失敗 | 權限不足、磁碟空間不足、目錄已存在 |
| 1007 | 資料庫已存在 | 重複 CREATE DATABASE,改用 CREATE DATABASE IF NOT EXISTS |
| 1008 | 資料庫不存在 | 拼寫錯誤、未建立、大小寫敏感(Linux) |
| 1009 | 無法刪除資料庫檔案 | 檔案被鎖定、權限問題、手動刪除殘留 |
| 1010 | 無法刪除資料目錄 | 目錄非空、權限不足 |
| 1011 | 刪除資料庫檔案失敗 | 同上,檢查 datadir 權限 |
| 1012 | 無法讀取系統表記錄 | 權限表損壞,執行 mysql_upgrade |
| 1050 | 資料表已存在 | 重複建表,使用 IF NOT EXISTS 或先 DROP |
| 1051 | 資料表不存在 | 拼寫錯誤、大小寫、表已被刪除 |
| 1146 | 資料表不存在 | 同 1051,常見於應用程式 SQL 拼寫 |
記錄/索引/鍵值衝突類
| 代碼 | 含義 | 常見原因與對策 |
| 1022 | 關鍵字重複,修改記錄失敗 | 主鍵/唯一索引衝突,檢查業務邏輯去重 |
| 1032 | 記錄不存在 | UPDATE/DELETE 影響 0 行,確認 WHERE 條件 |
| 1048 | 欄位不能為空 | NOT NULL 欄位未賦值,調整預設值或應用層驗證 |
| 1054 | 欄位不存在 | 拼寫錯誤、Schema 變更未同步、大小寫敏感 |
| 1062 | 欄位值重複,入庫失敗 | 唯一鍵衝突(如手機號、身分證),捕獲異常處理 |
| 1169 | 欄位值重複,更新失敗 | 同 1062,發生於 UPDATE |
連線/權限/資源類
| 代碼 | 含義 | 常見原因與對策 |
| 1040 | 達到最大連線數 | 調大 max_connections、檢查連線洩漏、啟用連線池 |
| 1041 | 系統記憶體不足 | 檢查 innodb_buffer_pool_size、排序緩衝區設定 |
| 1042 | 無效主機名 | DNS 解析失敗、skip-name-resolve、/etc/hosts 配置 |
| 1043 | 無效連線 | 連線已斷、逾時、防火牆截斷 |
| 1044 | 當前用戶無資料庫權限 | GRANT 權限、FLUSH PRIVILEGES |
| 1045 | 用戶名或密碼錯誤 | 密碼錯誤、主機不匹配、密碼插件不相容(caching_sha2_password) |
| 1130 | 連線失敗,無連線權限 | 用戶 Host 欄位不允許該 IP,需授權 user@'%' 或具體 IP |
| 1133 | 資料庫用戶不存在 | 用戶未建立、拼寫錯誤、大小寫 |
| 1203 | 用戶連線數達上限 | max_user_connections 限制,調整或拆分用戶 |
| 1226 | 用戶資源用盡 | 查詢/更新/連線時數超標,調整資源限制 |
| 1227 | 權限不足 | 缺少 SUPER、FILE 等特定權限 |
交易/鎖定/逾時類
| 代碼 | 含義 | 常見原因與對策 |
| 1180 | 提交交易失敗 | 磁碟空間、Binlog 錯誤、儲存引擎錯誤 |
| 1181 | 回滾交易失敗 | 同上,檢查錯誤日誌 |
| 1205 | 鎖定逾時 | innodb_lock_wait_timeout 過短、長交易、死鎖,優化索引/縮短交易 |
| 1216 | 外鍵約束檢查失敗(更新子表) | 父表無對應記錄,先插入父表 |
| 1217 | 外鍵約束檢查失敗(刪除/修改父表) | 子表存在關聯記錄,先處理子表或設定 CASCADE |
網路/通訊類
| 代碼 | 含義 | 常見原因與對策 |
| 1081 | 無法建立 Socket 連線 | 服務未啟動、埠被佔用、防火牆、bind-address 配置 |
| 1158 | 網路讀取錯誤 | 網路抖動、MTU 設定、驅動程式 Bug |
| 1159 | 網路讀取逾時 | net_read_timeout 過短、大查詢、網路延遲 |
| 1160 | 網路寫入錯誤 | 客戶端斷開、緩衝區滿、網路中斷 |
| 1161 | 網路寫入逾時 | net_write_timeout 過短、大結果集傳輸 |
其他高頻代碼
| 代碼 | 含義 | 備註 |
| 1021 | 磁碟空間不足 | 清理日誌、擴容、tmpdir 空間 |
| 1036 | 資料表唯讀 | FLUSH TABLES WITH READ LOCK、權限、磁碟滿 |
| 1037 | 系統記憶體不足 | 重啟服務或調整緩衝區 |
| 1038 | 排序記憶體不足 | 增大 sort_buffer_size |
| 1065 | 無效 SQL(空語句) | 應用層傳入空字串 |
| 1114 | 資料表已滿 | MyISAM 達 4GB/2TB 限制、InnoDB 表空間滿、磁碟滿 |
| 1116 | 開啟資料表過多 | 增大 table_open_cache |
| 1129 | 資料庫異常 | 建議重啟、檢查錯誤日誌 |
| 1149 | SQL 語法錯誤 | 保留字未加反引號、版本語法差異 |
| 1235 | MySQL 版本過低 | 功能不支援,升級版本 |
排查實戰建議
- 優先看錯誤日誌:
log_error 路徑下的 .err 檔案含完整堆疊。
- 善用
SHOW ENGINE INNODB STATUS: 死鎖、鎖等待、外鍵錯誤詳情。
- 驗證字元集一致性: 1048/1062 常因字元集導致「看似相同實則不同」。
- 連線池配置: 1040/1203 多為連線未釋放或池子過小。
- 權限變更必執行:
FLUSH PRIVILEGES 或 mysqladmin flush-privileges。
結語
錯誤代碼是資料庫發出的求救訊號,熟悉高頻代碼含義與定位思路,能將故障處理時間從「小時級」壓縮到「分鐘級」。建議收藏本表,實戰中遇到陌生代碼再查閱官方手冊補充。