1. 首页 > MySQL教程 > 正文

MySQL教程FG265-MySQL错误消息解析

本文档风哥主要介绍MySQL错误消息的分类、结构和解析方法,包括常见错误的诊断和解决方案,风哥教程参考MySQL官方文档Error Messages章节,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 MySQL错误消息概述

MySQL错误消息是数据库返回给客户端的诊断信息,用于指示操作失败的原因:

# MySQL错误消息概述

1. 错误消息组成

MySQL错误消息由以下部分组成:
– 错误代码(Error Code):数字标识符
– SQL状态(SQLSTATE):5字符代码
– 错误消息(Message):描述性文本

示例:
ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

解析:
– 错误代码:1045
– SQL状态:28000
– 错误消息:Access denied for user ‘root’@’localhost’ (using password: YES)

2. 错误代码范围

MySQL错误代码范围:
+—————-+—————————+
| 错误代码范围 | 描述 |
+—————-+—————————+
| 1000-1999 | MySQL服务器错误 |
| 2000-2999 | MySQL客户端错误 |
| 3000-3999 | MySQL服务器扩展错误 |
| 4000-4999 | MySQL服务器扩展错误 |
+—————-+—————————+

查看错误代码范围:
mysql> SELECT MIN(ERROR_CODE), MAX(ERROR_NAME)
FROM INFORMATION_SCHEMA.ERRORS;

输出示例:
+—————–+—————–+
| MIN(ERROR_CODE) | MAX(ERROR_NAME) |
+—————–+—————–+
| 1000 | 1954 |
+—————–+—————–+

3. SQL状态代码

SQLSTATE分类:
+———-+——————————————+
| 类别 | 描述 |
+———-+——————————————+
| 00 | 成功完成 |
| 01 | 警告 |
| 02 | 无数据 |
| 07 | 动态SQL错误 |
| 08 | 连接异常 |
| 0A | 不支持的特性 |
| 21 | 基数违规 |
| 22 | 数据异常 |
| 23 | 完整性约束违规 |
| 24 | 无效游标状态 |
| 25 | 无效事务状态 |
| 26 | 无效SQL语句名称 |
| 27 | 触发数据更改违规 |
| 28 | 无效授权规范 |
| 2A | 直接SQL语法错误 |
| 2B | 依赖特权描述符仍然存在 |
| 2C | 无效字符集名称 |
| 2D | 无效事务终止 |
| 2E | 无效连接名称 |
| 33 | 无效SQL描述符名称 |
| 34 | 无效游标名称 |
| 35 | 无效条件编号 |
| 3C | 不支持的游标特性 |
| 3D | 无效目录名称 |
| 3F | 无效模式名称 |
| 40 | 事务回滚 |
| 42 | 语法错误或访问违规 |
| 44 | 违规检查约束 |
| HY | CLI特定条件 |
| HZ | 外部例程异常 |
+———-+——————————————+

4. 错误消息存储

错误消息存储位置:
– 服务器端错误:errmsg.sys文件
– 客户端错误:errmsg.sys文件
– 语言文件:各语言目录

查看错误消息文件:
ls -la /usr/share/mysql/english/errmsg.sys

输出示例:
-rw-r–r– 1 root root 123456 Apr 1 00:00 /usr/share/mysql/english/errmsg.sys

查看支持的错误语言:
ls /usr/share/mysql/

输出示例:
bulgarian czech danish dutch english estonian french german greek
hungarian italian japanese korean norwegian norwegian-ny polish
portuguese romanian russian serbian slovak spanish swedish ukrainian

5. 错误消息查询

查询错误信息:
mysql> SELECT ERROR_CODE, ERROR_NAME, SQL_STATE, MESSAGE
FROM INFORMATION_SCHEMA.ERRORS
WHERE ERROR_CODE = 1045;

输出示例:
+————+————————+———–+————————————————+
| ERROR_CODE | ERROR_NAME | SQL_STATE | MESSAGE |
+————+————————+———–+————————————————+
| 1045 | ER_ACCESS_DENIED_ERROR | 28000 | Access denied for user ‘%s’@’%s’ (using password: %s) |
+————+————————+———–+————————————————+

按SQL状态查询:
mysql> SELECT ERROR_CODE, ERROR_NAME, MESSAGE
FROM INFORMATION_SCHEMA.ERRORS
WHERE SQL_STATE = ‘28000’;

输出示例:
+————+————————+————————————————+
| ERROR_CODE | ERROR_NAME | MESSAGE |
+————+————————+————————————————+
| 1045 | ER_ACCESS_DENIED_ERROR | Access denied for user ‘%s’@’%s’… |
| 1698 | ER_ACCESS_DENIED_NO_PASSWORD_ERROR | Access denied for user… |
+————+————————+————————————————+

1.2 错误消息结构

MySQL错误消息有特定的结构,理解结构有助于诊断问题:

# 错误消息结构

1. 标准错误格式

格式:
ERROR [错误代码] ([SQL状态]): [错误消息]

示例:
ERROR 1064 (42000): You have an error in your SQL syntax

结构解析:
– ERROR:错误标识
– 1064:MySQL错误代码
– 42000:SQLSTATE代码
– You have an error…:错误描述

2. 错误消息占位符

MySQL错误消息使用占位符表示动态内容:
%s – 字符串
%d – 整数
%u – 无符号整数
%f – 浮点数

查看错误模板:
mysql> SELECT ERROR_CODE, MESSAGE
FROM INFORMATION_SCHEMA.ERRORS
WHERE ERROR_CODE = 1062;

输出示例:
+————+————————————————+
| ERROR_CODE | MESSAGE |
+————+————————————————+
| 1062 | Duplicate entry ‘%s’ for key ‘%s’ |
+————+————————————————+

实际错误示例:
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’

3. 错误消息级别

MySQL错误消息级别:
+———-+——————————————+
| 级别 | 描述 |
+———-+——————————————+
| Error | 错误,操作失败 |
| Warning | 警告,操作成功但有警告 |
| Note | 注意,信息性消息 |
+———-+——————————————+

查看警告:
mysql> SHOW WARNINGS;

输出示例:
+——-+——+——————————————+
| Level | Code | Message |
+——-+——+——————————————+
| Note | 1007 | Can’t create database ‘test’; database exists |
+——-+——+——————————————+

查看错误:
mysql> SHOW ERRORS;

输出示例:
+——-+——+——————————————+
| Level | Code | Message |
+——-+——+——————————————+
| Error | 1064 | You have an error in your SQL syntax |
+——-+——+——————————————+

4. 错误消息上下文

错误消息可能包含上下文信息:
– 位置信息(行号、字符位置)
– 相关对象名称
– 操作类型

示例:
ERROR 1064 (42000): 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 ‘SELEC * FROM users’ at line 1

解析:
– 错误类型:SQL语法错误
– 错误位置:near ‘SELEC * FROM users’
– 错误行号:line 1

5. 错误消息国际化

MySQL支持多语言错误消息:

查看当前语言:
mysql> SHOW VARIABLES LIKE ‘lc_messages’;

输出示例:
+—————+——-+
| Variable_name | Value |
+—————+——-+
| lc_messages | en_US |
+—————+——-+

设置语言:
mysql> SET GLOBAL lc_messages = ‘zh_CN’;

输出示例:
Query OK, 0 rows affected (0.00 sec)

配置文件设置:
[mysqld]
lc_messages = zh_CN

1.3 错误分类

MySQL错误按类型可分为多个类别:

# 错误分类

1. 连接错误(1xxx-2xxx)

常见连接错误:
+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1045 | 访问被拒绝 |
| 1044 | 数据库访问被拒绝 |
| 2002 | 无法连接到服务器 |
| 2003 | 无法连接到MySQL服务器 |
| 2006 | MySQL服务器已断开连接 |
| 2013 | 查询期间与MySQL服务器失去连接 |
+——+——————————————+

示例:
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (111)

2. SQL语法错误(1xxx)

常见SQL语法错误:
+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1064 | SQL语法错误 |
| 1146 | 表不存在 |
| 1054 | 未知列 |
| 1051 | 未知表 |
| 1049 | 未知数据库 |
| 1091 | 无法删除,列/键不存在 |
+——+——————————————+

示例:
ERROR 1064 (42000): You have an error in your SQL syntax

3. 数据完整性错误(1xxx)

常见数据完整性错误:
+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1062 | 重复键值 |
| 1216 | 外键约束失败 |
| 1217 | 无法删除父行 |
| 1451 | 无法删除或更新父行 |
| 1452 | 无法添加或更新子行 |
| 1048 | 列不能为空 |
+——+——————————————+

示例:
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’

4. 存储引擎错误(1xxx)

常见存储引擎错误:
+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1205 | 锁等待超时 |
| 1213 | 死锁 |
| 1114 | 表已满 |
| 1366 | 不正确的字符串值 |
| 1265 | 数据被截断 |
| 1364 | 字段没有默认值 |
+——+——————————————+

示例:
ERROR 1205 (HY000): Lock wait timeout exceeded

5. 权限错误(1xxx)

常见权限错误:
+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1044 | 数据库访问被拒绝 |
| 1045 | 访问被拒绝 |
| 1142 | 命令被拒绝 |
| 1143 | 列命令被拒绝 |
| 1227 | 访问被拒绝,需要权限 |
| 1370 | 执行命令被拒绝 |
+——+——————————————+

示例:
ERROR 1142 (42000): SELECT command denied to user ‘app’@’localhost’ for table ‘users’

6. 服务器错误(MY-xxxxx)

MySQL 8.x新增的服务器错误格式:
格式:MY-xxxxx

常见服务器错误:
+———-+————————————–+
| 代码 | 描述 |
+———-+————————————–+
| MY-010000| 服务器启动 |
| MY-013169| 服务器启动中 |
| MY-013576| InnoDB初始化开始 |
| MY-013577| InnoDB初始化完成 |
| MY-013313| 服务器关闭 |
+———-+————————————–+

示例:
[System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.4.0) starting as process 1234

Part02-生产环境规划与建议

2.1 错误处理策略

在生产环境中需要制定合理的错误处理策略:

# 错误处理策略

1. 应用层错误处理

错误捕获示例(Python):
import mysql.connector

try:
conn = mysql.connector.connect(
host=’localhost’,
user=’app_user’,
password=’password’,
database=’production_db’
)
cursor = conn.cursor()
cursor.execute(“SELECT * FROM users”)
except mysql.connector.Error as err:
print(f”Error Code: {err.errno}”)
print(f”SQLSTATE: {err.sqlstate}”)
print(f”Message: {err.msg}”)

# 根据错误代码处理
if err.errno == 1045:
print(“认证失败,请检查用户名和密码”)
elif err.errno == 2003:
print(“无法连接服务器,请检查网络”)
else:
print(f”未知错误: {err}”)
finally:
if conn.is_connected():
cursor.close()
conn.close()

输出示例:
Error Code: 1045
SQLSTATE: 28000
Message: Access denied for user ‘app_user’@’localhost’ (using password: YES)
认证失败,请检查用户名和密码

2. 存储过程错误处理

DECLARE处理程序:
DELIMITER //

CREATE PROCEDURE insert_user(
IN p_name VARCHAR(100),
IN p_email VARCHAR(100)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@code = MYSQL_ERRNO, @state = RETURNED_SQLSTATE, @msg = MESSAGE_TEXT;

SELECT @code AS error_code, @state AS sql_state, @msg AS message;
END;

INSERT INTO users (name, email) VALUES (p_name, p_email);
END //

DELIMITER ;

调用示例:
mysql> CALL insert_user(‘test’, ‘test@example.com’);

输出示例:
+————+———–+————————————————+
| error_code | sql_state | message |
+————+———–+————————————————+
| 1062 | 23000 | Duplicate entry ‘test@example.com’ for key ’email’ |
+————+———–+————————————————+

3. 错误日志记录

应用层日志记录:
import logging
import mysql.connector

logging.basicConfig(
filename=’mysql_errors.log’,
level=logging.ERROR,
format=’%(asctime)s – %(levelname)s – %(message)s’
)

try:
# MySQL操作
pass
except mysql.connector.Error as err:
logging.error(f”MySQL Error {err.errno} ({err.sqlstate}): {err.msg}”)

输出示例:
2026-04-01 12:00:00 – ERROR – MySQL Error 1045 (28000): Access denied

4. 错误重试策略

自动重试示例:
import time
import mysql.connector

def execute_with_retry(query, max_retries=3, delay=1):
for attempt in range(max_retries):
try:
conn = mysql.connector.connect(…)
cursor = conn.cursor()
cursor.execute(query)
return cursor.fetchall()
except mysql.connector.Error as err:
if err.errno in [1205, 1213]: # 锁等待超时、死锁
if attempt < max_retries - 1: time.sleep(delay) continue raise err finally: if conn.is_connected(): conn.close() 输出示例: Retry attempt 1/3 for lock timeout Retry attempt 2/3 for lock timeout Query executed successfully

2.2 错误日志配置

正确配置错误日志对于问题诊断至关重要:

# 错误日志配置

1. 错误日志配置

查看当前配置:
mysql> SHOW VARIABLES LIKE ‘log_error%’;

输出示例:
+———————+————————–+
| Variable_name | Value |
+———————+————————–+
| log_error | /var/log/mysql/error.log |
| log_error_verbosity | 3 |
+———————+————————–+

配置错误日志:
[mysqld]
log_error = /var/log/mysql/error.log
log_error_verbosity = 3
log_error_services = ‘log_filter_internal; log_sink_internal’

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted successfully.

2. 错误日志详细级别

log_error_verbosity级别:
1 – 错误消息
2 – 错误消息 + 警告
3 – 错误消息 + 警告 + 注意

设置详细级别:
mysql> SET GLOBAL log_error_verbosity = 3;

输出示例:
Query OK, 0 rows affected (0.00 sec)

3. 错误日志格式

查看日志格式:
tail -20 /var/log/mysql/error.log

输出示例:
2026-04-01T12:00:00.123456Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.4.0) starting as process 1234
2026-04-01T12:00:01.234567Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2026-04-01T12:00:02.345678Z 0 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2026-04-01T12:00:03.456789Z 0 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.

日志格式解析:
时间戳 线程ID [级别] [错误代码] [子系统] 消息

4. 错误日志轮转

配置日志轮转:
vim /etc/logrotate.d/mysql

内容:
/var/log/mysql/error.log {
daily
rotate 7
compress
missingok
notifempty
create 644 mysql mysql
postrotate
mysqladmin flush-logs
endscript
}

手动轮转:
logrotate -f /etc/logrotate.d/mysql

输出示例:
Log rotation completed.

5. 错误日志分析

查找错误:
grep -i error /var/log/mysql/error.log | tail -10

输出示例:
2026-04-01T12:00:00.000000Z 0 [ERROR] [MY-013183] [InnoDB] Assertion failure
2026-04-01T12:00:01.000000Z 0 [ERROR] [MY-013183] [InnoDB] We intentionally generate a crash

查找警告:
grep -i warning /var/log/mysql/error.log | tail -10

输出示例:
2026-04-01T12:00:00.000000Z 0 [Warning] [MY-010068] [Server] CA certificate is self signed
2026-04-01T12:00:01.000000Z 0 [Warning] [MY-010055] [Server] IP address could not be resolved

2.3 错误监控方案

建立完善的错误监控体系可以及时发现和解决问题:

# 错误监控方案

1. 错误监控脚本

创建监控脚本:
vim /opt/mysql/scripts/monitor_errors.sh

脚本内容:
#!/bin/bash

LOG_FILE=”/var/log/mysql/error.log”
ALERT_EMAIL=”dba@company.com”
TEMP_FILE=”/tmp/mysql_errors_$(date +%Y%m%d_%H%M%S).txt”

# 检查最近1小时的错误
grep “$(date -d ‘1 hour ago’ +’%Y-%m-%dT%H’)” $LOG_FILE | grep -i error > $TEMP_FILE

if [ -s $TEMP_FILE ]; then
mail -s “MySQL Error Alert” $ALERT_EMAIL < $TEMP_FILE fi rm -f $TEMP_FILE 设置定时任务: crontab -e 添加内容: */5 * * * * /opt/mysql/scripts/monitor_errors.sh 输出示例: crontab: installing new crontab 2. 错误统计 统计错误类型: grep -i error /var/log/mysql/error.log | \ awk -F'[][]' '{print $4}' | \ sort | uniq -c | sort -rn | head -10 输出示例: 50 MY-013183 25 MY-010068 10 MY-010055 5 MY-013169 统计错误频率: grep -i error /var/log/mysql/error.log | \ awk '{print $1}' | \ cut -dT -f1 | \ sort | uniq -c 输出示例: 100 2026-04-01 50 2026-04-02 25 2026-04-03 3. 错误告警规则 配置告警规则: #!/bin/bash # 检查关键错误 CRITICAL_ERRORS=( "MY-013183" # InnoDB断言失败 "MY-013313" # 服务器关闭 "MY-013576" # InnoDB初始化失败 ) for error in "${CRITICAL_ERRORS[@]}"; do count=$(grep -c "$error" /var/log/mysql/error.log) if [ $count -gt 0 ]; then echo "CRITICAL: Found $count occurrences of $error" fi done 输出示例: CRITICAL: Found 5 occurrences of MY-013183 4. 集成监控系统 Prometheus错误指标: # 创建错误指标导出器 vim /opt/mysql/scripts/error_exporter.sh 内容: #!/bin/bash echo "# HELP mysql_errors_total Total number of MySQL errors" echo "# TYPE mysql_errors_total counter" error_count=$(grep -c -i error /var/log/mysql/error.log) echo "mysql_errors_total $error_count" 输出示例: # HELP mysql_errors_total Total number of MySQL errors # TYPE mysql_errors_total counter mysql_errors_total 150

Part03-生产环境项目实施方案

3.1 常见错误解析

以下是MySQL常见错误的详细解析:

# 常见错误解析

1. 连接错误解析

错误1045 – 访问被拒绝:
ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

原因分析:
– 用户名或密码错误
– 用户不存在
– 主机名不匹配
– 认证插件不兼容

解决方案:
# 重置密码
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’;

# 或使用mysqladmin
mysqladmin -u root password “new_password”

输出示例:
Query OK, 0 rows affected (0.01 sec)

错误2003 – 无法连接:
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (111)

原因分析:
– MySQL服务未运行
– 端口被阻止
– 绑定地址限制
– 防火墙规则

解决方案:
# 检查服务状态
systemctl status mysqld

# 输出示例:
Active: active (running)

# 检查端口
netstat -tlnp | grep 3306

# 输出示例:
tcp6 0 0 :::3306 :::* LISTEN 1234/mysqld

2. SQL语法错误解析

错误1064 – SQL语法错误:
ERROR 1064 (42000): You have an error in your SQL syntax

原因分析:
– SQL语句语法错误
– 使用了保留字
– 引号不匹配
– 括号不匹配

解决方案:
# 检查SQL语法
mysql> SELEC * FROM users;
ERROR 1064 (42000): You have an error in your SQL syntax

# 修正语法
mysql> SELECT * FROM users;

# 输出示例:
+—-+——+
| id | name |
+—-+——+
| 1 | test |
+—-+——+

错误1146 – 表不存在:
ERROR 1146 (42S02): Table ‘production_db.users’ doesn’t exist

原因分析:
– 表名拼写错误
– 数据库名错误
– 表确实不存在

解决方案:
# 检查表是否存在
mysql> SHOW TABLES FROM production_db LIKE ‘users’;

# 输出示例:
Empty set (0.00 sec)

# 创建表
mysql> CREATE TABLE users (id INT, name VARCHAR(100));

# 输出示例:
Query OK, 0 rows affected (0.02 sec)

3. 数据完整性错误解析

错误1062 – 重复键:
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’

原因分析:
– 主键冲突
– 唯一索引冲突

解决方案:
# 检查现有数据
mysql> SELECT * FROM users WHERE id = 1;

# 输出示例:
+—-+——+
| id | name |
+—-+——+
| 1 | test |
+—-+——+

# 使用INSERT IGNORE
mysql> INSERT IGNORE INTO users VALUES (1, ‘new’);

# 输出示例:
Query OK, 0 rows affected (0.00 sec)

# 或使用ON DUPLICATE KEY UPDATE
mysql> INSERT INTO users VALUES (1, ‘new’)
ON DUPLICATE KEY UPDATE name = ‘new’;

# 输出示例:
Query OK, 2 rows affected (0.01 sec)

错误1452 – 外键约束:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails

原因分析:
– 外键引用的记录不存在
– 违反外键约束

解决方案:
# 检查外键约束
mysql> SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME = ‘orders’;

# 输出示例:
+——————–+——————-+—————–+
| CONSTRAINT_NAME | CONSTRAINT_TYPE | TABLE_NAME |
+——————–+——————-+—————–+
| fk_orders_users | FOREIGN KEY | orders |
+——————–+——————-+—————–+

# 确保引用记录存在
mysql> SELECT * FROM users WHERE id = 1;

# 输出示例:
+—-+——+
| id | name |
+—-+——+
| 1 | test |
+—-+——+

4. 锁错误解析

错误1205 – 锁等待超时:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

原因分析:
– 长时间运行的事务
– 锁竞争激烈
– 死锁检测

解决方案:
# 查看锁等待
mysql> SELECT * FROM sys.innodb_lock_waits\G

# 输出示例:
wait_age: 00:00:30
waiting_query: UPDATE orders SET status = ‘processing’

# 终止阻塞事务
mysql> KILL QUERY 5;

# 输出示例:
Query OK, 0 rows affected (0.00 sec)

错误1213 – 死锁:
ERROR 1213 (40001): Deadlock found when trying to get lock

原因分析:
– 多个事务相互等待
– 锁获取顺序不一致

解决方案:
# 查看死锁信息
mysql> SHOW ENGINE INNODB STATUS\G

# 输出示例:
————————
LATEST DETECTED DEADLOCK
————————
TRANSACTION 12345, ACTIVE 5 sec

# 重试事务
# 应用程序应实现死锁重试逻辑

3.2 错误诊断方法

以下是MySQL错误诊断的系统方法:

# 错误诊断方法

1. 错误代码查询

查询错误详情:
mysql> SELECT ERROR_CODE, ERROR_NAME, SQL_STATE, MESSAGE
FROM INFORMATION_SCHEMA.ERRORS
WHERE ERROR_CODE = 1213;

输出示例:
+————+—————-+———–+——————————————+
| ERROR_CODE | ERROR_NAME | SQL_STATE | MESSAGE |
+————+—————-+———–+——————————————+
| 1213 | ER_LOCK_DEADLOCK | 40001 | Deadlock found when trying to get lock |
+————+—————-+———–+——————————————+

2. 错误日志分析

查看最近的错误:
tail -100 /var/log/mysql/error.log | grep -i error

输出示例:
2026-04-01T12:00:00.000000Z 0 [ERROR] [MY-013183] [InnoDB] Assertion failure

按时间范围查看:
grep “2026-04-01T1[0-2]:” /var/log/mysql/error.log | grep -i error

输出示例:
2026-04-01T10:00:00.000000Z 0 [ERROR] [MY-013183] [InnoDB] …
2026-04-01T11:00:00.000000Z 0 [ERROR] [MY-013183] [InnoDB] …

3. 状态变量检查

查看错误相关状态:
mysql> SHOW STATUS LIKE ‘%error%’;

输出示例:
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| Com_stmt_close | 0 |
| Com_stmt_execute | 0 |
| Com_stmt_fetch | 0 |
| Com_stmt_prepare | 0 |
| Com_stmt_reset | 0 |
| Com_stmt_send_long_data | 0 |
| Errors | 123 |
+——————–+——-+

查看连接错误:
mysql> SHOW STATUS LIKE ‘%connect%’;

输出示例:
+————————–+——-+
| Variable_name | Value |
+————————–+——-+
| Aborted_connects | 5 |
| Connection_errors_accept | 0 |
| Connection_errors_internal| 0 |
| Connection_errors_max_connections| 0|
| Connection_errors_peer_address| 0 |
| Connection_errors_select| 0 |
| Connection_errors_tcpwrap| 0 |
| Connections | 1000 |
| Max_used_connections | 50 |
+————————–+——-+

4. Performance Schema诊断

查看错误统计:
mysql> SELECT EVENT_NAME, COUNT_STAR, SUM_ERRORS
FROM performance_schema.events_statements_summary_global_by_event_name
WHERE SUM_ERRORS > 0
ORDER BY SUM_ERRORS DESC
LIMIT 10;

输出示例:
+———————————–+————+————+
| EVENT_NAME | COUNT_STAR | SUM_ERRORS |
+———————————–+————+————+
| statement/sql/select | 12345 | 100 |
| statement/sql/insert | 5678 | 50 |
+———————————–+————+————+

查看错误详情:
mysql> SELECT * FROM performance_schema.events_statements_history
WHERE ERRORS > 0
ORDER BY TIMER_START DESC
LIMIT 5\G

输出示例:
*************************** 1. row ***************************
THREAD_ID: 25
EVENT_ID: 100
END_EVENT_ID: 100
EVENT_NAME: statement/sql/insert
SOURCE: sql_parse.cc:1234
TIMER_START: 12345678901234567
TIMER_END: 12345678901256789
TIMER_WAIT: 12222
LOCK_TIME: 0
SQL_TEXT: INSERT INTO users VALUES (1, ‘test’)
DIGEST: a1b2c3d4e5f6…
DIGEST_TEXT: INSERT INTO `users` VALUES (?)
CURRENT_SCHEMA: production_db
MESSAGE_TEXT: Duplicate entry ‘1’ for key ‘PRIMARY’
ERRORS: 1
WARNINGS: 0

3.3 错误解决流程

以下是MySQL错误解决的标准流程:

# 错误解决流程

1. 错误识别

步骤:
1. 记录错误代码
2. 记录SQL状态
3. 记录错误消息
4. 记录发生时间
5. 记录操作上下文

示例:
错误代码:1062
SQL状态:23000
错误消息:Duplicate entry ‘1’ for key ‘PRIMARY’
发生时间:2026-04-01 12:00:00
操作:INSERT INTO users VALUES (1, ‘test’)

2. 错误分析

步骤:
1. 查询错误代码含义
2. 分析错误原因
3. 检查相关对象
4. 查看日志信息

示例:
# 查询错误含义
mysql> SELECT MESSAGE FROM INFORMATION_SCHEMA.ERRORS WHERE ERROR_CODE = 1062;

# 输出示例:
+————————————————+
| MESSAGE |
+————————————————+
| Duplicate entry ‘%s’ for key ‘%s’ |
+————————————————+

# 检查表结构
mysql> SHOW CREATE TABLE users\G

# 输出示例:
CREATE TABLE `users` (
`id` int NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
)

3. 制定解决方案

根据错误类型选择解决方案:
– 连接错误:检查网络、认证
– SQL错误:修正语法
– 数据错误:处理数据冲突
– 权限错误:授予权限
– 资源错误:扩容或清理

4. 实施解决方案

示例:
# 方案1:使用INSERT IGNORE
mysql> INSERT IGNORE INTO users VALUES (1, ‘new’);

# 输出示例:
Query OK, 0 rows affected (0.00 sec)

# 方案2:使用REPLACE
mysql> REPLACE INTO users VALUES (1, ‘new’);

# 输出示例:
Query OK, 2 rows affected (0.01 sec)

# 方案3:使用ON DUPLICATE KEY UPDATE
mysql> INSERT INTO users VALUES (1, ‘new’)
ON DUPLICATE KEY UPDATE name = ‘new’;

# 输出示例:
Query OK, 2 rows affected (0.01 sec)

5. 验证解决结果

步骤:
1. 重新执行操作
2. 检查结果
3. 确认无副作用
4. 记录解决方案

示例:
mysql> SELECT * FROM users WHERE id = 1;

# 输出示例:
+—-+——+
| id | name |
+—-+——+
| 1 | new |
+—-+——+

Part04-生产案例与实战讲解

4.1 连接错误案例

以下是MySQL连接错误的实战案例:

# 连接错误案例

# 案例1:认证失败

# 错误信息:
ERROR 1045 (28000): Access denied for user ‘app_user’@’localhost’ (using password: YES)

# 诊断步骤:
# 1. 检查用户是否存在
mysql> SELECT USER, HOST, PLUGIN FROM mysql.user WHERE USER=’app_user’;

# 输出示例:
# +———-+——+———————–+
# | USER | HOST | PLUGIN |
# +———-+——+———————–+
# | app_user | % | caching_sha2_password |
# +———-+——+———————–+

# 2. 检查认证插件兼容性
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE ‘%auth%’;

# 输出示例:
# +———————–+—————+
# | PLUGIN_NAME | PLUGIN_STATUS |
# +———————–+—————+
# | caching_sha2_password | ACTIVE |
# | mysql_native_password | ACTIVE |
# +———————–+—————+

# 解决方案:
# 方案1:修改用户认证方式
mysql> ALTER USER ‘app_user’@’%’ IDENTIFIED WITH mysql_native_password BY ‘password’;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

# 方案2:使用SSL连接
mysql -u app_user -p –ssl-mode=REQUIRED

# 输出示例:
# Welcome to the MySQL monitor.

# 案例2:连接超时

# 错误信息:
ERROR 2006 (HY000): MySQL server has gone away

# 诊断步骤:
# 1. 检查超时设置
mysql> SHOW VARIABLES LIKE ‘%timeout%’;

# 输出示例:
# +—————————–+———-+
# | Variable_name | Value |
# +—————————–+———-+
# | connect_timeout | 10 |
# | wait_timeout | 28800 |
# | interactive_timeout | 28800 |
# +—————————–+———-+

# 2. 检查最大包大小
mysql> SHOW VARIABLES LIKE ‘max_allowed_packet’;

# 输出示例:
# +——————–+———-+
# | Variable_name | Value |
# +——————–+———-+
# | max_allowed_packet | 4194304 |
# +——————–+———-+

# 解决方案:
# 调整超时参数
mysql> SET GLOBAL wait_timeout = 86400;
mysql> SET GLOBAL max_allowed_packet = 67108864;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 案例3:连接数限制

# 错误信息:
ERROR 1040 (HY000): Too many connections

# 诊断步骤:
# 1. 检查当前连接数
mysql> SHOW STATUS LIKE ‘Threads_connected’;

# 输出示例:
# +——————-+——-+
# | Variable_name | Value |
# +——————-+——-+
# | Threads_connected | 150 |
# +——————-+——-+

# 2. 检查最大连接数
mysql> SHOW VARIABLES LIKE ‘max_connections’;

# 输出示例:
# +—————–+——-+
# | Variable_name | Value |
# +—————–+——-+
# | max_connections | 150 |
# +—————–+——-+

# 解决方案:
# 增加最大连接数
mysql> SET GLOBAL max_connections = 500;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 查看连接详情
mysql> SHOW PROCESSLIST;

# 输出示例:
# +—-+———-+———–+——+———+——+———-+——————+
# | Id | User | Host | db | Command | Time | State | Info |
# +—-+———-+———–+——+———+——+———-+——————+
# | 5 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST |
# +—-+———-+———–+——+———+——+———-+——————+

4.2 SQL错误案例

以下是MySQL SQL错误的实战案例:

# SQL错误案例

# 案例1:语法错误

# 错误信息:
ERROR 1064 (42000): 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 ‘SELEC * FROM users’ at line 1

# 诊断步骤:
# 1. 定位错误位置
# 错误提示:near ‘SELEC * FROM users’

# 2. 检查SQL语句
# 原始SQL:SELEC * FROM users
# 正确SQL:SELECT * FROM users

# 解决方案:
mysql> SELECT * FROM users;

# 输出示例:
# +—-+——+
# | id | name |
# +—-+——+
# | 1 | test |
# +—-+——+

# 案例2:列不存在

# 错误信息:
ERROR 1054 (42S22): Unknown column ‘username’ in ‘field list’

# 诊断步骤:
# 1. 检查表结构
mysql> DESCRIBE users;

# 输出示例:
# +——-+————–+——+—–+———+——-+
# | Field | Type | Null | Key | Default | Extra |
# +——-+————–+——+—–+———+——-+
# | id | int | NO | PRI | NULL | |
# | name | varchar(100) | YES | | NULL | |
# +——-+————–+——+—–+———+——-+

# 解决方案:
# 使用正确的列名
mysql> SELECT name FROM users;

# 输出示例:
# +——+
# | name |
# +——+
# | test |
# +——+

# 案例3:GROUP BY错误

# 错误信息:
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘production_db.orders.customer_id’ which is not functionally dependent on columns in GROUP BY clause

# 诊断步骤:
# 1. 检查SQL模式
mysql> SELECT @@sql_mode;

# 输出示例:
# ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,…

# 2. 分析SQL语句
# 原始SQL:SELECT id, customer_id, COUNT(*) FROM orders GROUP BY id

# 解决方案:
# 方案1:修改SQL
mysql> SELECT id, customer_id, COUNT(*) FROM orders GROUP BY id, customer_id;

# 输出示例:
# +—-+————-+———-+
# | id | customer_id | COUNT(*) |
# +—-+————-+———-+
# | 1 | 100 | 5 |
# +—-+————-+———-+

# 方案2:使用ANY_VALUE
mysql> SELECT id, ANY_VALUE(customer_id), COUNT(*) FROM orders GROUP BY id;

# 输出示例:
# +—-+————————-+———-+
# | id | ANY_VALUE(customer_id) | COUNT(*) |
# +—-+————————-+———-+
# | 1 | 100 | 5 |
# +—-+————————-+———-+

4.3 服务器错误案例

以下是MySQL服务器错误的实战案例:

# 服务器错误案例

# 案例1:InnoDB错误

# 错误信息:
ERROR 1114 (HY000): The table ‘orders’ is full

# 诊断步骤:
# 1. 检查磁盘空间
df -h /var/lib/mysql

# 输出示例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 100G 95G 5.0G 95% /var/lib/mysql

# 2. 检查表大小
mysql> SELECT TABLE_NAME,
ROUND(DATA_LENGTH/1024/1024, 2) AS DATA_MB
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘production_db’ AND TABLE_NAME = ‘orders’;

# 输出示例:
# +————+———-+
# | TABLE_NAME | DATA_MB |
# +————+———-+
# | orders | 50000.00 |
# +————+———-+

# 解决方案:
# 清理旧数据
mysql> DELETE FROM orders WHERE created_at < '2025-01-01'; # 输出示例: # Query OK, 1000000 rows affected (30.12 sec) # 优化表 mysql> OPTIMIZE TABLE orders;

# 输出示例:
# +——————-+———-+———-+———-+
# | Table | Op | Msg_type | Msg_text |
# +——————-+———-+———-+———-+
# | production_db.orders | optimize | status | OK |
# +——————-+———-+———-+———-+

# 案例2:内存错误

# 错误信息:
ERROR 1037 (HY001): Out of memory; check if mysqld or some other process uses all available memory

# 诊断步骤:
# 1. 检查系统内存
free -h

# 输出示例:
# total used free
# Mem: 16Gi 15Gi 1.0Gi
# Swap: 8.0Gi 7.0Gi 1.0Gi

# 2. 检查MySQL内存使用
mysql> SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;

# 输出示例:
# +————————-+————+
# | Variable_name | Value |
# +————————-+————+
# | innodb_buffer_pool_size | 12884901888|
# +————————-+————+

# 解决方案:
# 减少缓冲池大小
mysql> SET GLOBAL innodb_buffer_pool_size = 8589934592;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 案例3:复制错误

# 错误信息:
ERROR 1062 (23000): Error ‘Duplicate entry ‘1’ for key ‘PRIMARY” on query

# 诊断步骤:
# 1. 检查复制状态
mysql> SHOW REPLICA STATUS\G

# 输出示例:
# Replica_IO_Running: Yes
# Replica_SQL_Running: No
# Last_SQL_Error: Error ‘Duplicate entry ‘1’ for key ‘PRIMARY” on query

# 解决方案:
# 跳过错误
mysql> STOP REPLICA;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START REPLICA;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 验证复制状态
mysql> SHOW REPLICA STATUS\G

# 输出示例:
# Replica_IO_Running: Yes
# Replica_SQL_Running: Yes

Part05-风哥经验总结与分享

5.1 错误预防措施

以下是MySQL错误预防的措施:

# 错误预防措施

1. 开发阶段预防

– 使用参数化查询防止SQL注入
– 添加适当的索引
– 编写事务处理逻辑
– 进行代码审查

参数化查询示例:
# Python
cursor.execute(“SELECT * FROM users WHERE id = %s”, (user_id,))

# Java
PreparedStatement stmt = conn.prepareStatement(“SELECT * FROM users WHERE id = ?”);
stmt.setInt(1, userId);

2. 测试阶段预防

– 进行压力测试
– 测试边界条件
– 模拟故障场景
– 验证错误处理

压力测试示例:
mysqlslap –concurrency=100 –iterations=10 –query=”SELECT * FROM users”

输出示例:
Benchmark
Average number of seconds to run all queries: 5.234 seconds
Minimum number of seconds to run all queries: 4.567 seconds
Maximum number of seconds to run all queries: 6.123 seconds
Number of clients running queries: 100
Average number of queries per client: 10

3. 运维阶段预防

– 定期备份
– 监控关键指标
– 设置告警阈值
– 定期维护

监控脚本示例:
#!/bin/bash
mysql -u monitor -p -e ”
SHOW STATUS LIKE ‘Threads_connected’;
SHOW STATUS LIKE ‘Innodb_buffer_pool_read%’;

4. 文档化

– 记录常见错误
– 编写故障处理手册
– 建立知识库
– 定期更新文档

5.2 错误分析工具

以下是MySQL错误分析的工具:

# 错误分析工具

1. MySQL Shell

使用MySQL Shell分析:
mysqlsh user@localhost

分析查询:
MySQL> util.checkTableSchema(‘production_db’, ‘users’)

输出示例:
{
“schema”: “production_db”,
“table”: “users”,
“status”: “OK”
}

2. MySQL Workbench

使用Workbench:
1. 连接到服务器
2. 打开Server Status
3. 查看错误日志
4. 分析性能指标

3. 命令行工具

分析错误日志:
grep -i error /var/log/mysql/error.log | tail -20

输出示例:
2026-04-01T12:00:00.000000Z 0 [ERROR] [MY-013183] [InnoDB] …

分析慢查询:
mysqldumpslow -s t /var/log/mysql/slow.log | head -10

输出示例:
Count: 100 Time=5.00s (500s) Lock=0.00s (0s) Rows=1000.0
SELECT * FROM orders WHERE status = ‘S’

4. Performance Schema

查询错误统计:
mysql> SELECT EVENT_NAME, COUNT_STAR, SUM_ERRORS
FROM performance_schema.events_statements_summary_global_by_event_name
WHERE SUM_ERRORS > 0;

输出示例:
+—————————+————+————+
| EVENT_NAME | COUNT_STAR | SUM_ERRORS |
+—————————+————+————+
| statement/sql/select | 12345 | 100 |
+—————————+————+————+

5.3 错误代码参考

以下是MySQL常用错误代码参考:

# 错误代码参考

1. 连接错误(1xxx-2xxx)

+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1040 | 连接数过多 |
| 1044 | 数据库访问被拒绝 |
| 1045 | 访问被拒绝 |
| 2002 | 无法通过socket连接 |
| 2003 | 无法连接到MySQL服务器 |
| 2006 | MySQL服务器已断开 |
| 2013 | 查询期间失去连接 |
+——+——————————————+

2. SQL错误(1xxx)

+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1048 | 列不能为空 |
| 1054 | 未知列 |
| 1060 | 重复列名 |
| 1062 | 重复键值 |
| 1064 | SQL语法错误 |
| 1091 | 无法删除,列/键不存在 |
| 1146 | 表不存在 |
+——+——————————————+

3. 数据完整性错误(1xxx)

+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1062 | 重复键值 |
| 1216 | 外键约束失败 |
| 1217 | 无法删除父行 |
| 1451 | 无法删除或更新父行 |
| 1452 | 无法添加或更新子行 |
+——+——————————————+

4. 存储引擎错误(1xxx)

+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1114 | 表已满 |
| 1205 | 锁等待超时 |
| 1213 | 死锁 |
| 1214 | 不支持的存储引擎 |
| 1265 | 数据被截断 |
| 1366 | 不正确的字符串值 |
+——+——————————————+

5. 权限错误(1xxx)

+——+——————————————+
| 代码 | 描述 |
+——+——————————————+
| 1044 | 数据库访问被拒绝 |
| 1045 | 访问被拒绝 |
| 1142 | 命令被拒绝 |
| 1143 | 列命令被拒绝 |
| 1227 | 访问被拒绝,需要权限 |
| 1370 | 执行命令被拒绝 |
+——+——————————————+

风哥提示:MySQL错误消息是诊断问题的重要依据。理解错误消息的结构和含义,掌握错误诊断方法,对于DBA来说至关重要。建议建立错误知识库,记录常见错误和解决方案,以便快速响应问题。在生产环境中,要做好错误监控和告警,及时发现和处理问题。更多视频教程请访问www.fgedu.net.cn

注意:本文档内容基于MySQL 8.4官方文档编写,适合DBA人员在学习和测试中使用。在生产环境中应用时,请务必进行充分的测试和验证。错误消息可能因MySQL版本不同而有所差异,请根据实际情况进行调整。遇到严重错误时,建议先备份数据再进行修复操作。

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息