错误码字典
MariaDB 最常见的 50 条错误码,每条给人话原因 + 解决 + 预防
浏览器里
Ctrl/Cmd + F搜你看到的错误码或关键词。
按错误号排序。
1006 — Can't create database
ERROR 1006 (HY000): Can't create database 'foo'原因:数据目录无权限 / 磁盘满 / 名字冲突。
解决:
sudo chown -R mysql:mysql /var/lib/mysql
df -h /var/lib/mysql # 查磁盘1045 — Access denied
ERROR 1045 (28000): Access denied for user 'foo'@'host'原因:密码错 / 主机限制不允许 / 账号不存在。
解决:
-- 查账号到底有哪些 host 允许
SELECT user, host FROM mysql.user WHERE user = 'foo';
-- 重置密码
ALTER USER 'foo'@'%' IDENTIFIED BY 'newpass';
FLUSH PRIVILEGES;1049 — Unknown database
ERROR 1049 (42000): Unknown database 'foo'原因:库不存在或当前用户没权限看到。
解决:SHOW DATABASES; 确认;或 CREATE DATABASE foo;。
1062 — Duplicate entry for key
ERROR 1062 (23000): Duplicate entry 'a@x.com' for key 'uq_email'原因:唯一索引冲突。
解决:
-- 处理重复时的常见模式
INSERT INTO users (email) VALUES (?) ON DUPLICATE KEY UPDATE updated_at = NOW();
-- 或
INSERT IGNORE INTO users (email) VALUES (?);
-- MariaDB 10.5+: 安全的 upsert
INSERT INTO users (email) VALUES (?) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);1064 — SQL syntax error
ERROR 1064 (42000): You have an error in your SQL syntax原因:SQL 拼错。
排查:错误信息里"near '...'"指出错误位置;用了保留字(order、group 等)作为列名时要反引号。
-- ❌
SELECT order FROM tbl;
-- ✅
SELECT `order` FROM tbl;1146 — Table doesn't exist
ERROR 1146 (42S02): Table 'mydb.users' doesn't exist原因:表名拼错 / 大小写敏感 / 未切到正确 db。
排查:
SHOW TABLES LIKE 'us%';
SELECT @@lower_case_table_names; -- Linux 默认 0:大小写敏感1213 — Deadlock found
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction原因:两个事务互相等对方持有的锁。
解决:MariaDB 已自动回滚其中一个,应用层重试:
for _ in range(3):
try:
run_transaction()
break
except mariadb.OperationalError as e:
if e.errno == 1213:
time.sleep(0.05); continue
raise预防:所有事务按固定顺序访问表/行;缩短事务时长。详见 事务。
1205 — Lock wait timeout exceeded
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction原因:等行锁超过 innodb_lock_wait_timeout(默认 50s)。
排查:
SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
-- 找到阻塞的事务并 KILL
KILL 12345;1216 / 1217 — Foreign key constraint fails
ERROR 1216: Cannot add or update a child row: foreign key constraint fails
ERROR 1217: Cannot delete or update a parent row: foreign key constraint fails原因:父表没这行 / 子表还有引用。
解决:删父行前先删子行;插子行前先建父行;或加 ON DELETE CASCADE。
1226 — User has exceeded the 'max_questions' resource
ERROR 1226 (42000): User 'app' has exceeded the 'max_user_connections' resource原因:账号资源被限。
解决:
ALTER USER 'app'@'%' WITH MAX_USER_CONNECTIONS 100;
FLUSH PRIVILEGES;1227 — Access denied; you need ... privilege
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege原因:账号权限不够做这个操作(如改 GLOBAL 变量)。
解决:用 root 或单独 GRANT。
1264 — Out of range value
ERROR 1264 (22003): Out of range value for column 'count'原因:数字越界(如 INT 存了 > 2147483647)。
解决:改 BIGINT;或检查输入。
1273 — Unknown collation
ERROR 1273: Unknown collation: 'utf8mb4_0900_ai_ci'原因:导入了 MySQL 8 的 dump 文件,里面有 MariaDB 不认识的 collation。
解决:sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g; s/utf8mb4_0900_as_cs/utf8mb4_unicode_ci/g' dump.sql。详见 迁移:MySQL 8 → MariaDB 11。
1364 — Field 'xxx' doesn't have a default value
原因:sql_mode 含 STRICT_TRANS_TABLES,INSERT 时漏列。
解决:给列加默认值,或 INSERT 时显式赋值。
1366 — Incorrect string value
ERROR 1366: Incorrect string value: '\xF0\x9F\x98\x80' for column 'msg'原因:列字符集是 utf8(3-byte),存不下 4-byte UTF-8(如 emoji)。
解决:改成 utf8mb4:
ALTER TABLE messages MODIFY msg VARCHAR(255) CHARACTER SET utf8mb4;1396 — Operation CREATE USER failed
原因:用户已存在。
解决:DROP USER 'x'@'host' 然后重建,或用 CREATE USER IF NOT EXISTS。
1406 — Data too long for column
原因:插入的字符串超过列定义长度。
解决:扩列或截断;推荐扩列。
1426 — Too big precision
原因:DECIMAL(M,D) 中 M > 65 或 D > 30。
1452 — Cannot add foreign key constraint
原因:父子列类型 / 字符集 / collation 不一致;父列没索引;存储引擎不是 InnoDB。
解决:让两边完全一致;用 InnoDB。
1467 — Failed to read auto-increment value from storage engine
原因:磁盘问题 / 表损坏。
解决:
CHECK TABLE foo;
REPAIR TABLE foo;1709 — Index column size too large
原因:索引列太宽(如 VARCHAR(1000) 用 utf8mb4 = 4000 字节,超过 3072 索引上限)。
解决:用前缀索引 INDEX idx (col(255)),或缩短列。
1819 — Your password does not satisfy the current policy requirements
原因:装了密码策略插件。
解决:临时降低要求,或满足复杂度:
SET GLOBAL validate_password_policy = LOW;1864 — Multi-statement transaction required more than 'max_binlog_cache_size'
原因:单事务的 binlog 太大。
解决:拆事务;或调高 max_binlog_cache_size。
1927 — Connection was killed
原因:管理员或心跳超时 KILL 了你的连接。
排查:
SHOW VARIABLES LIKE '%timeout%';
-- wait_timeout, interactive_timeout2002 — Can't connect through socket
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'原因:服务没启动 / socket 路径错。
解决:
systemctl status mariadb
sudo systemctl start mariadb
mariadb --socket=/correct/path/mysqld.sock2003 — Can't connect to MySQL server on host
原因:网络 / 防火墙 / 端口;或服务没监听对外。
排查:
nc -zv host 3306
sudo lsof -i :3306my.cnf 里 bind-address = 0.0.0.0(而非 127.0.0.1)才能对外。
2005 — Unknown MySQL server host
原因:DNS 解析不了。
2006 — MySQL server has gone away
原因:连接被服务端断(超时 / 重启 / max_allowed_packet 超)。
解决:
SET GLOBAL max_allowed_packet = 64 * 1024 * 1024; -- 64 MB应用层 retry。
2013 — Lost connection during query
原因:网络抖动 / 查询超时被杀。
解决:retry + 看慢日志。
2026 — SSL connection error
原因:TLS 握手失败 — 证书 / TLS 版本 / 双方启用不一致。
排查:SHOW STATUS LIKE 'Ssl_cipher';
3098 — The table does not comply with the requirements by an external plugin
原因:表不符合 audit / 加密插件要求。
解决:看具体插件文档。
3503 — Got error 'XX' from regexp
原因:正则语法错。MariaDB 用 PCRE。
4031 — The client was disconnected by the server because of inactivity
原因:wait_timeout 超。
解决:连接池配置 idle 回收;或调大 timeout。
SQLSTATE HY000 综合错误
很多 server 内部错误都用 HY000 + 具体 errno。看 errno 是真信息。
排查通用思路
- 看完整错误:包括 SQLSTATE、errno、message 三部分
- 看 SHOW ENGINE INNODB STATUS:锁、死锁、IO 都在这
- 看错误日志:
SELECT @@log_error;找到位置 - 看慢日志:500ms+ 的查询
- 看 PROCESSLIST:
SHOW FULL PROCESSLIST;
-- 一站式诊断
SHOW ENGINE INNODB STATUS\G
SELECT * FROM information_schema.PROCESSLIST WHERE state != '';
SELECT * FROM information_schema.INNODB_LOCK_WAITS;你没找到?
去 MariaDB 官方错误码列表,或在 GitHub 给本站提 issue 补一条。
AI 友好提示:把这一页喂给 Cursor / Claude,它能在你贴错误时直接对照。