首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 錯誤代碼完整對照表 (1005-1235) 與排查指南

     編輯:MySQL 資料庫相關知識

使用說明

本表依據 MySQL 原始碼 include/mysqld_error.h 整理,涵蓋常見錯誤代碼 (Error Code)、SQLSTATE (部分)、訊息與排查方向。實際開發中請搭配 perror 指令或 SHOW WARNINGS 確認完整上下文。

核心錯誤代碼分類速查

範圍類別典型代碼
1005-1011建立/刪除資料庫/資料表失敗1005, 1007, 1008, 1010
1020-1038儲存引擎/記錄/記憶體/磁碟1021, 1032, 1037, 1038
1040-1049連線/認證/權限1040, 1044, 1045, 1049
1050-1065資料表/欄位/語法1050, 1051, 1054, 1062, 1065
1081-1116網路/通訊/資源限制1081, 1114, 1116
1129-1149權限/使用者/語法1130, 1133, 1142, 1146, 1149
1158-1161網路讀寫超時/錯誤1158, 1159, 1160, 1161
1169-1235外鍵/資源/版本/權限1169, 1216, 1217, 1226, 1227, 1235

高頻錯誤詳細解析與對策

1005 (ER_CANT_CREATE_TABLE) / 1006 (ER_CANT_CREATE_DB)

  • 原因:磁碟空間不足、權限不足、檔案系統唯讀、InnoDB 表空間滿、外鍵定義錯誤 (1005 常伴隨 1216/1217)。
  • 排查:df -h、ls -ld /data/mysql、SHOW ENGINE INNODB STATUS 觀察表空間、檢查外鍵參照欄位類型一致。

1007 (ER_DB_CREATE_EXISTS) / 1008 (ER_DB_DROP_EXISTS)

  • 資料庫已存在/不存在。CREATE DATABASE IF NOT EXISTS、DROP DATABASE IF EXISTS 避免報錯。

1021 (ER_DISK_FULL)

  • 磁碟空間耗盡。清理日誌、備份檔、擴充磁碟、PURGE BINARY LOGS、調整 expire_logs_days。

1032 (ER_KEY_NOT_FOUND)

  • 記錄不存在 (通常是 UPDATE/DELETE WHERE 不匹配)。檢查 WHERE 條件、主鍵值、從庫複寫延遲導致主從不一致。

1037 (ER_OUTOFMEMORY) / 1038 (ER_OUT_OF_SORTMEMORY)

  • 記憶體不足。增加 sort_buffer_size、join_buffer_size、優化 SQL 避免大排序、檢查記憶體洩漏、升級實體記憶體。

1040 (ER_CON_COUNT_ERROR) / 1203 (ER_USER_CON_COUNT_ERROR)

  • 連線數達上限。調大 max_connections、檢查連線洩漏 (應用端未關閉)、使用連線池、啟用 thread_cache_size。

1044 (ER_DBACCESS_DENIED_ERROR) / 1045 (ER_ACCESS_DENIED_ERROR) / 1130 (ER_HOST_NOT_PRIVILEGED)

  • 權限/認證失敗。確認使用者存在、密碼正確、Host 匹配 (%、具體 IP、localhost)、FLUSH PRIVILEGES、skip-grant-tables 重置密碼。

1048 (ER_BAD_NULL_ERROR) / 1049 (ER_BAD_DB_ERROR)

  • 欄位不可為 NULL / 資料庫不存在。修正 Schema 定義、應用端傳值檢查。

1050 (ER_TABLE_EXISTS_ERROR) / 1051 (ER_BAD_TABLE_ERROR) / 1054 (ER_BAD_FIELD_ERROR)

  • 資料表/欄位存在/不存在。DDL 加 IF NOT EXISTS/IF EXISTS、遷移腳本版本控管。

1062 (ER_DUP_ENTRY) / 1169 (ER_DUP_UNIQUE)

  • 唯一鍵/主鍵衝突。應用端捕獲錯誤碼處理冪等、使用 INSERT IGNORE/ON DUPLICATE KEY UPDATE/REPLACE INTO。

1065 (ER_EMPTY_QUERY)

  • 空 SQL 語句。應用端檢查動態 SQL 生成邏輯。

1081 (ER_CANT_CREATE_SOCKET)

  • 無法建立 Socket。檢查 socket 路徑權限、/tmp 空間、SELinux/AppArmor。

1114 (ER_TABLE_FULL)

  • 資料表滿 (MyISAM 檔案大小限制、InnoDB 表空間滿、記憶體表 max_heap_table_size 限制)。轉 InnoDB、擴充表空間、調整參數。

1116 (ER_TOO_MANY_OPEN_TABLES) 開啟資料表過多。調大 table_open_cache、table_definition_cache、檢查應用頻繁開關表。

1129 (ER_HOST_IS_BLOCKED)

  • 主機被封鎖 (連線錯誤超過 max_connect_errors)。FLUSH HOSTS、調大 max_connect_errors、排查應用連線邏輯。

1133 (ER_PASSWORD_NO_MATCH) / 1141-1143 (ER_TABLEACCESS_DENIED_ERROR 等)

  • 使用者不存在/權限不足。SHOW GRANTS、GRANT 補足權限。

1146 (ER_NO_SUCH_TABLE) / 1149 (ER_SYNTAX_ERROR)

  • 資料表不存在 / SQL 語法錯誤。檢查拼寫、保留字需反引號 \`、版本相容性 (如 LATERAL、CTE 需 8.0+)。

1158-1161 (網路讀寫錯誤/超時)

  • 網路不穩、防火牆截斷、wait_timeout/net_read_timeout/net_write_timeout 過小、MTU 問題。抓包分析、調整超時參數、啟用 TCP keepalive。

1216 (ER_NO_REFERENCED_ROW_2) / 1217 (ER_ROW_IS_REFERENCED_2)

  • 外鍵約束失敗:子表插入父表不存在的值 / 刪除父表被子表參照的行。檢查業務邏輯順序、使用 ON DELETE CASCADE/SET NULL、暫時關閉 foreign_key_checks=0 (極度謹慎)。

1226 (ER_USER_LIMIT_REACHED)

  • 使用者資源上限 (MAX_QUERIES_PER_HOUR 等)。調整 GRANT ... WITH MAX_QUERIES_PER_HOUR 或移除限制。

1227 (ER_SPECIFIC_ACCESS_DENIED_ERROR)

  • 權限不足執行特定操作 (如 SUPER, SHUTDOWN, FILE)。授予對應權限或改用具備權限的帳號。

1235 (ER_NOT_SUPPORTED_YET)

  • 版本不支援功能 (如 5.6 不支援 CTE、Window Function、JSON_TABLE 等)。升級 MySQL 版本或改寫 SQL。

快速查詢指令

# Linux 終端機查詢錯誤訊息
perror 1062
# 輸出:MySQL error code 1062: Duplicate entry '%s' for key '%s'

# MySQL 客戶端查詢
SHOW WARNINGS;
SHOW ENGINE INNODB STATUS;  -- 含最新外鍵/死鎖錯誤詳情

結語

熟悉高頻錯誤代碼與背後機制,能大幅縮短排查時間。建議將本表整合至團隊知識庫,並在應用端針對關鍵錯誤碼 (1062, 1205, 1216, 1217 等) 實作專用重試/告警/降級邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved