MySQL 常見錯誤代碼速查表
遭遇資料庫錯誤時,透過錯誤代碼快速定位原因是維運關鍵。以下整理最常見的 MySQL 錯誤代碼、原因與建議處置。
連線與權限類 (1040-1045, 1130, 1133, 1227)
| 代碼 | 訊息 | 常見原因 | 建議處置 |
| 1040 | Too many connections | 達到 max_connections 上限 | 調大參數、檢查連線洩漏、啟用連線池 |
| 1042 | Bad host | 主機名解析失敗 | 檢查 DNS、/etc/hosts、skip-name-resolve |
| 1043 | Invalid connection | 協定不符、SSL 問題 | 確認 client/server 版本相容 |
| 1044 | Access denied for user | 無資料庫權限 | GRANT 權限、FLUSH PRIVILEGES |
| 1045 | Access denied (password) | 帳號密碼錯誤 | 重設密碼、確認 host 欄位匹配 |
| 1130 | Host not allowed to connect | IP 未在 user 表允許清單 | 新增 'user'@'%' 或具體 IP |
| 1133 | User doesn't exist | 使用者不存在 | CREATE USER、確認 host 寫法 |
| 1227 | Access denied; need privilege | 執行操作缺乏 SUPER 等權限 | 授予對應權限或由 DBA 執行 |
資料完整性類 (1022, 1048, 1062, 1169)
| 代碼 | 訊息 | 常見原因 | 建議處置 |
| 1022 | Duplicate key | 唯一索引/主鍵衝突 | 檢查業務邏輯、使用 INSERT IGNORE/ON DUPLICATE KEY |
| 1048 | Column cannot be null | NOT NULL 欄位未給值 | 修正 INSERT 語句、設定 DEFAULT |
| 1062 | Duplicate entry | 同 1022,含具體值資訊 | 同上 |
| 1169 | Duplicate value on update | UPDATE 導致唯一鍵衝突 | 檢查 WHERE 條件、業務去重 |
資源與儲存類 (1021, 1037, 1038, 1114, 1116, 1205, 1226)
| 代碼 | 訊息 | 常見原因 | 建議處置 |
| 1021 | Disk full | 磁碟空間不足 | 清理空間、擴充磁碟、啟用壓縮 |
| 1037 | Out of memory | 系統記憶體耗盡 | 重啟服務、調整 innodb_buffer_pool_size |
| 1038 | Sort buffer full | 排序緩衝區不足 | 增大 sort_buffer_size |
| 1114 | Table is full | MEMORY 表滿 / 磁碟滿 | 調整 max_heap_table_size、清理空間 |
| 1116 | Too many open tables | table_cache 過小 | 增大 table_open_cache |
| 1205 | Lock wait timeout | 交易鎖等待超時 | 優化長交易、調整 innodb_lock_wait_timeout |
| 1226 | User resource limit exceeded | 使用者連線/查詢/更新超限 | 調整 user 資源限制、重啟服務 |
結構與語法類 (1005-1011, 1025, 1050, 1051, 1054, 1065, 1146, 1149, 1235)
| 代碼 | 訊息 | 常見原因 | 建議處置 |
| 1005 | Can't create table | 外鍵定義錯誤、引擎不支援 | 檢查 REFERENCES 語法、引擎相容性 |
| 1007/1008 | Database exists/not exists | 建立/刪除資料庫衝突 | 使用 IF NOT EXISTS / IF EXISTS |
| 1025 | Error on rename | RENAME TABLE 失敗 | 檢查權限、外鍵依賴、觸發器 |
| 1050 | Table already exists | 重複建表 | 使用 CREATE TABLE IF NOT EXISTS |
| 1051/1146 | Table doesn't exist | 查詢不存在的表 | 確認拼寫、大小寫敏感度 (Linux) |
| 1054 | Unknown column | 欄位名錯誤 | 檢查拼寫、DESCRIBE 表結構 |
| 1065 | Empty query | SQL 字串為空 | 應用層驗證 SQL 非空 |
| 1149 | Syntax error | SQL 語法錯誤 | 參考手冊、使用 EXPLAIN 驗證 |
| 1235 | Version too old | 功能需較新版本 | 升級 MySQL、改用相容寫法 |
網路與複寫類 (1081, 1158-1161, 1180, 1181, 1216, 1217)
| 代碼 | 訊息 | 常見原因 | 建議處置 |
| 1081 | Can't create socket | 埠被佔用、權限不足 | 檢查 3306 埠、防火牆、SELinux |
| 1158-1161 | Network read/write timeout/error | 網路不穩、MTU、防火牆 | 檢查網路、增大 net_read/write_timeout |
| 1180/1181 | Commit/Rollback failed | 交易日誌損壞、磁碟錯誤 | 檢查錯誤日誌、備份還原 |
| 1216/1217 | Foreign key constraint fails | 子表/父表資料不一致 | 先處理子表、暫停 FK 檢查 |
快速排查清單
- 查看
SHOW ENGINE INNODB STATUS 詳細錯誤
- 檢查錯誤日誌
/var/log/mysql/error.log
- 確認參數設定
SHOW VARIABLES
- 驗證權限
SHOW GRANTS FOR 'user'@'host'
- 測試網路連通
telnet host 3306
建議將此表儲存為團隊維運手冊附件,遇到錯誤時快速對照處理。