Skip to content

MySQL 错误代码参考

常见错误代码详解

1. 连接与权限错误

1044 - Access denied for user '%s'@'%s' to database '%s'

含义:用户对指定数据库没有访问权限

产生原因

  • 用户不存在
  • 用户密码错误
  • 用户没有访问指定数据库的权限
  • 主机限制(如只能从特定IP访问)

解决方案

sql
-- 授予用户访问权限
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';
-- 刷新权限
FLUSH PRIVILEGES;
-- 检查用户权限
SHOW GRANTS FOR 'username'@'host';

1045 - Access denied for user '%s'@'%s' (using password: %s)

含义:用户认证失败

产生原因

  • 密码错误
  • 用户不存在
  • 主机限制
  • 密码过期
  • 账户被锁定

解决方案

sql
-- 重置密码
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
-- 解锁账户
ALTER USER 'username'@'host' ACCOUNT UNLOCK;
-- 检查账户状态
SELECT user, host, account_locked, password_expired FROM mysql.user WHERE user = 'username';

2003 - Can't connect to MySQL server on '%s' (%d)

含义:无法连接到MySQL服务器

产生原因

  • MySQL服务未运行
  • 网络连接问题
  • 端口号错误
  • 防火墙阻止连接
  • MySQL配置了错误的绑定地址

解决方案

bash
# 检查MySQL服务状态
systemctl status mysqld
# 检查端口是否监听
netstat -tlnp | grep 3306
# 检查防火墙设置
firewall-cmd --list-ports

2. 数据库与表错误

1005 - Can't create table '%s' (errno: %d - %s)

含义:无法创建表

产生原因

  • 外键约束错误
  • 表名已存在
  • 磁盘空间不足
  • 权限不足
  • 表结构不合理(如字段长度超过限制)

解决方案

sql
-- 查看详细错误信息
SHOW ENGINE INNODB STATUS;
-- 检查外键约束
SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME IS NOT NULL;

1017 - Can't find file: '%s' (errno: %d - %s)

含义:找不到指定的文件

产生原因

  • 表文件损坏或丢失
  • 数据目录配置错误
  • 文件权限问题
  • 表名拼写错误

解决方案

bash
# 检查文件是否存在
ls -l /var/lib/mysql/database_name/
# 检查文件权限
chown -R mysql:mysql /var/lib/mysql/

1146 - Table '%s.%s' doesn't exist

含义:表不存在

产生原因

  • 表名拼写错误
  • 表已被删除
  • 数据库名错误
  • 权限不足,无法看到表

解决方案

sql
-- 列出数据库中的所有表
SHOW TABLES FROM database_name;
-- 检查表是否存在
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name';

3. SQL语法错误

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s' at line %d

含义:SQL语法错误

产生原因

  • SQL语句拼写错误
  • 关键字使用错误
  • 语法格式不正确
  • 不兼容的SQL特性

解决方案

  • 检查SQL语句拼写
  • 参考MySQL官方文档的语法规范
  • 使用MySQL客户端的语法高亮功能
  • 分步骤测试复杂SQL语句

1136 - Column count doesn't match value count at row %d

含义:插入的列数与值的数量不匹配

产生原因

  • INSERT语句中列数与值的数量不一致
  • 缺少或多余的逗号
  • 错误的括号使用

解决方案

sql
-- 正确的INSERT语法
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
-- 或不指定列名时,提供所有列的值
INSERT INTO table_name VALUES (value1, value2, value3);

1215 - Cannot add foreign key constraint

含义:无法添加外键约束

产生原因

  • 引用的表或列不存在
  • 引用的列类型不匹配
  • 引用的列不是主键或唯一键
  • 存储引擎不支持外键

解决方案

sql
-- 检查引用的表和列是否存在
SHOW TABLES LIKE 'referenced_table';
DESCRIBE referenced_table;
-- 确保引用的列是主键或唯一键
SHOW INDEXES FROM referenced_table;

4. 数据操作错误

1062 - Duplicate entry '%s' for key '%s'

含义:唯一键冲突

产生原因

  • 插入或更新操作违反了唯一键约束
  • 重复的数据
  • 复合唯一键冲突

解决方案

sql
-- 使用INSERT IGNORE忽略冲突
INSERT IGNORE INTO table_name (column1, column2) VALUES (value1, value2);
-- 使用ON DUPLICATE KEY UPDATE更新现有记录
INSERT INTO table_name (column1, column2) VALUES (value1, value2) ON DUPLICATE KEY UPDATE column2 = value2;
-- 使用REPLACE替换现有记录
REPLACE INTO table_name (column1, column2) VALUES (value1, value2);

1048 - Column '%s' cannot be null

含义:列不能为NULL

产生原因

  • 列定义为NOT NULL,但插入了NULL值
  • 更新操作将NOT NULL列设置为NULL
  • 缺少必填字段

解决方案

sql
-- 为列提供值
INSERT INTO table_name (not_null_column) VALUES ('value');
-- 或修改表结构,允许NULL值
ALTER TABLE table_name MODIFY column_name datatype NULL;

1264 - Out of range value for column '%s' at row %d

含义:列值超出范围

产生原因

  • 数值超出列的定义范围(如TINYINT存储256)
  • 字符串长度超过列定义的长度
  • 日期时间格式错误

解决方案

sql
-- 调整列类型或长度
ALTER TABLE table_name MODIFY column_name BIGINT;
-- 或使用合适的值
INSERT INTO table_name (column_name) VALUES (127);

5. 复制错误

1590 - Failed to initialize the master info structure

含义:无法初始化主库信息结构

产生原因

  • 主库连接信息错误
  • 主库二进制日志文件不存在
  • 复制用户权限不足
  • 网络连接问题

解决方案

sql
-- 检查复制配置
SHOW SLAVE STATUS\G
-- 重新配置复制
CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_AUTO_POSITION=1;
-- 启动复制
START SLAVE;

1591 - Could not find first log file name in binary log index file

含义:在二进制日志索引文件中找不到第一个日志文件名

产生原因

  • 二进制日志索引文件损坏
  • 二进制日志文件丢失
  • 索引文件与实际日志文件不一致

解决方案

sql
-- 重建二进制日志索引文件
RESET MASTER;
-- 或重新配置复制
CHANGE MASTER TO MASTER_AUTO_POSITION=1;

1062 - Error 'Duplicate entry '%s' for key '%s'' on query. Default database: '%s'. Query: '%s'

含义:复制过程中遇到唯一键冲突

产生原因

  • 主从数据不一致
  • 从库上有独立的写入操作
  • 复制过滤规则配置错误

解决方案

sql
-- 跳过一个事务
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
-- 或重新初始化从库

6. 存储引擎错误

1205 - Lock wait timeout exceeded; try restarting transaction

含义:锁等待超时

产生原因

  • 事务持有锁时间过长
  • 死锁
  • 高并发场景下锁竞争激烈
  • 事务隔离级别过高

解决方案

sql
-- 查看当前事务
SHOW ENGINE INNODB STATUS\G
-- 查看锁等待
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
-- 终止长时间运行的事务
KILL QUERY thread_id;

1213 - Deadlock found when trying to get lock; try restarting transaction

含义:检测到死锁

产生原因

  • 两个或多个事务互相等待对方释放锁
  • 事务顺序不一致
  • 高并发场景

解决方案

  • 重试事务
  • 优化事务顺序,保持一致的访问顺序
  • 减少事务持有锁的时间
  • 降低事务隔离级别

1451 - Cannot delete or update a parent row: a foreign key constraint fails (%s)

含义:外键约束冲突,无法删除或更新父行

产生原因

  • 尝试删除或更新被其他表引用的行
  • 外键约束未设置CASCADE选项

解决方案

sql
-- 删除子表中的引用行
DELETE FROM child_table WHERE parent_id = 1;
-- 或修改外键约束,添加CASCADE选项
ALTER TABLE child_table DROP FOREIGN KEY fk_name;
ALTER TABLE child_table ADD CONSTRAINT fk_name FOREIGN KEY (parent_id) REFERENCES parent_table(id) ON DELETE CASCADE ON UPDATE CASCADE;

错误诊断与排查工具

1. 错误日志

MySQL错误日志记录了服务器的启动、关闭和运行过程中的错误信息。

查看错误日志位置

sql
SHOW VARIABLES LIKE 'log_error';

常见错误日志路径

  • Linux: /var/log/mysqld.log
  • Windows: C:\ProgramData\MySQL\MySQL Server 8.0\Data\hostname.err

2. SHOW ENGINE INNODB STATUS

显示InnoDB存储引擎的详细状态信息,包括死锁、锁等待、缓冲池使用等。

sql
SHOW ENGINE INNODB STATUS\G

3. 性能模式(Performance Schema)

提供MySQL服务器执行的详细信息,包括错误统计、锁等待、内存使用等。

sql
-- 查看错误统计
SELECT * FROM performance_schema.error_log;
-- 查看锁等待
SELECT * FROM performance_schema.data_lock_waits;

4. 第三方工具

  • MySQL Enterprise Monitor:提供错误监控和告警
  • Percona Monitoring and Management (PMM):综合监控和诊断工具
  • pt-deadlock-logger:监控和记录死锁
  • pt-query-digest:分析慢查询日志和错误日志

错误处理最佳实践

1. 预防错误

  • 使用参数化查询:防止SQL注入和语法错误
  • 验证输入数据:确保数据符合列定义和业务规则
  • 合理设计表结构:使用适当的数据类型和约束
  • 优化事务设计:减少事务持有锁的时间
  • 定期维护数据库:检查和修复表、优化索引

2. 错误捕获与处理

  • 使用TRY-CATCH机制:在应用程序中捕获和处理SQL错误
  • 记录详细错误信息:包括错误码、SQLSTATE、错误信息和上下文
  • 提供友好的错误提示:向用户展示易懂的错误信息
  • 实现重试机制:对于临时错误,如死锁、锁等待超时,实现自动重试

3. 监控与告警

  • 监控错误日志:设置错误日志监控,及时发现异常
  • 配置告警规则:对关键错误(如连接失败、死锁)设置告警
  • 定期分析错误趋势:识别频繁发生的错误,找出根本原因
  • 建立错误知识库:记录常见错误的解决方案,便于快速参考

不同MySQL版本的错误代码差异

MySQL 5.6

  • 错误信息相对简单
  • 部分错误码的含义可能有所不同
  • 缺少一些新的错误码(如JSON相关错误)

MySQL 5.7

  • 增强了错误信息的详细程度
  • 新增了JSON相关错误码
  • 改进了复制错误的诊断信息

MySQL 8.0

  • 进一步增强了错误信息
  • 新增了更多错误码
  • 改进了错误分类
  • 支持错误信息本地化
  • 新增了数据字典相关错误码

常见问题(FAQ)

Q1: 如何快速查找MySQL错误代码的含义?

A1: 可以通过以下方式查找:

Q2: 遇到未知错误码怎么办?

A2: 可以采取以下步骤:

  • 查看完整的错误信息和上下文
  • 搜索MySQL官方文档和社区论坛
  • 检查MySQL错误日志获取更多信息
  • 考虑升级MySQL版本,可能是旧版本的bug
  • 联系MySQL支持(商业版本)

Q3: 如何区分是客户端错误还是服务器错误?

A3: 可以通过错误码范围判断:

  • 1000-1999:客户端错误
  • 2000-2999:服务器错误
  • 10000+:存储引擎错误

也可以通过错误信息的前缀判断,如"ERROR"表示服务器错误,"Warning"表示警告。

Q4: 如何防止常见的MySQL错误?

A4: 可以采取以下措施:

  • 使用参数化查询防止SQL注入
  • 合理设计表结构和索引
  • 优化查询和事务
  • 定期维护和监控数据库
  • 备份数据,防止数据丢失
  • 遵循MySQL最佳实践

Q5: 如何处理大量的MySQL错误?

A5: 可以采取以下步骤:

  • 分析错误日志,识别频繁发生的错误
  • 找出根本原因,如慢查询、锁竞争、资源不足等
  • 实施相应的优化措施
  • 配置监控和告警,及时发现和处理错误
  • 考虑使用自动重试机制处理临时错误

Q6: 复制错误应该如何处理?

A6: 复制错误的处理步骤:

  • 查看SHOW SLAVE STATUS\G获取详细错误信息
  • 根据错误类型采取相应措施:
    • 权限错误:检查复制用户权限
    • 数据不一致:重新初始化从库或跳过错误
    • 网络错误:检查网络连接
  • 对于频繁发生的复制错误,考虑优化主库配置或调整复制架构

Q7: 如何使用perror工具?

A7: perror是MySQL提供的命令行工具,用于查询错误码的含义:

bash
# 查询单个错误码
perror 1045
# 查询多个错误码
perror 1044 1045 1146

Q8: 如何查看MySQL的错误日志?

A8: 可以通过以下方式查看:

sql
-- 查看错误日志位置
SHOW VARIABLES LIKE 'log_error';

然后使用文件查看工具查看:

bash
# Linux
tail -f /var/log/mysqld.log
# Windows
notepad "C:\ProgramData\MySQL\MySQL Server 8.0\Data\hostname.err"