MySQL 錯誤代碼 (Error Code) 是排查問題的第一線索。本文彙整 1005-1045 高頻錯誤的中文含義、典型觸發場景、標準解決步驟,並附上 perror 命令列工具用法與日誌分析技巧。
| 代碼 | SQLSTATE | 訊息 | 典型原因 | 解決方案 |
|---|---|---|---|---|
| 1005 | HY000 | Can't create table (errno: xxx) | 外鍵定義不匹配、引擎不支援、磁碟滿 | 檢查 REFERENCES 表/欄位型別一致、ENGINE=InnoDB、磁碟空間 |
| 1006 | HY000 | Can't create database | 權限不足、磁碟滿、目錄不存在 | 授權 CREATE、清理空間、檢查 datadir |
| 1007 | HY000 | Database exists | 重複 CREATE DATABASE | 先 DROP 或加 IF NOT EXISTS |
| 1008 | HY000 | Can't drop database | 資料庫不存在、權限不足 | 確認名稱、授權 DROP |
| 1016 | HY000 | Can't open file | .frm/.ibd 損壞、遺失、權限錯誤 | 檢查檔案存在、chown mysql:mysql、從備份還原 |
| 1021 | HY000 | Disk full | 磁碟空間耗盡 | df -h 確認、清理 binlog/臨時檔/舊備份、擴容 |
| 1022 | 23000 | Duplicate key | 唯一鍵/主鍵衝突 | 業務去重、INSERT IGNORE/ON DUPLICATE KEY UPDATE |
| 1030 | HY000 | Got error xxx from storage engine | MyISAM 索引損壞、InnoDB 表空間損壞 | MyISAM: myisamchk -r; InnoDB: innodb_force_recovery |
| 1032 | HY000 | Key not found | DELETE/UPDATE 未找到行、主從不一致 | 檢查 WHERE 條件、主從同步修復 |
| 1036 | HY000 | Table is read only | FLUSH TABLES WITH READ LOCK、磁碟只讀、myisamchk 鎖定 | UNLOCK TABLES、檢查掛載選項、結束 myisamchk |
| 1037 | HY000 | Out of memory | 記憶體不足、sort_buffer/join_buffer 過大 | 調小緩衝區、增加實體記憶體、優化查詢 |
| 1038 | HY000 | Out of sort memory | 排序緩衝不足 | 增大 sort_buffer_size (會話級)、避免大結果集排序 |
| 1040 | 08004 | Too many connections | 達到 max_connections | 增大 max_connections、檢查連線洩漏、啟用連線池 |
| 1041 | HY000 | Out of memory (system) | 系統記憶體耗盡 (OOM Killer) | 優化內存佔用、增加 Swap、升級實例 |
| 1042 | 08S01 | Bad host / Can't connect | 主機名解析失敗、網路不通、skip-name-resolve | 用 IP 直連、檢查 /etc/hosts、DNS、防火牆 |
| 1043 | 08S01 | Invalid connection | 連線協議錯誤、SSL 不匹配、驅動版本 | 升級驅動、檢查 SSL 參數、useSSL=false |
| 1044 | 42000 | Access denied for user | 權限不足 (庫/表/欄位/程序) | GRANT 相應權限、FLUSH PRIVILEGES |
| 1045 | 28000 | Access denied (password) | 密碼錯誤、主機不匹配、認證插件 | 重置密碼、檢查 host 欄位、ALTER USER ... IDENTIFIED WITH mysql_native_password |
# 1. 停庫
systemctl stop mysqld
# 2. 跳過授權表啟動
mysqld_safe --skip-grant-tables --skip-networking &
# 3. 免密登入修改
mysql -uroot
UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
# 4. 正常重啟
pkill mysqld
systemctl start mysqld