在InnoDB中错误处理不像SQL标准中指定的一样。按照标准,在SQL语句过程中的任何错误应该导致该语句的
回滚。InnoDB有时仅回滚部分语句,或者整个事务。下列条目叙述InnoDB如何执行错误处理:
·
如果你耗尽表空间中的文件空间,你使得MySQL表完全错误,并且InnoDB返回SQL语句。
·
一个事务死锁导致InnoDB回滚整个事务,在锁定等待超时的情况,InnoDB仅回滚最近的SQL语句。
当一个事务回滚因为死锁或锁定等待超时而发生,它在事务中撤销语句的作用。但是如果事务是用START TRANSACTION或BEGIN语句开始的,它就不撤销该语句。进一步,SQL语句变成事务的一部分直到COMMIT, ROLLBACK或者导致暗地提交的SQL语句发生。
· 如果你没有在语句中指定IGNORE选项,重复键错误回滚SQL语句。
·
行太长错误回滚SQL语句。
·
其它错误主要被代码的MySQL层(在InnoDB存储引擎级别以上)探测,它们回滚相应的SQL语句。在单个SQL语句中的回滚中锁定不被释放。
在暗地回滚过程中,就像在一个明确的ROLLBACK SQL命令的执行过程中一样,SHOW
PROCESSLIST在State列为有关的连接显示Rolling back。
下面的这个不完全列表是你可能遇见的常见的InnoDB专有错误,带着为什么发生的原因以及如何该解决问题的相关信息
·
1005 (ER_CANT_CREATE_TABLE)
不能创建表。如果错误信息字符串指向errno 150,因为
外键约束被不正确地形成,所以表创建失败。
·
1016 (ER_CANT_OPEN_FILE)
虽然对某表的.frm文件存在,但不能从InnoDB数据文件找到该InnoDB表。请参阅15.2.17.1节,“InnoDB数据词典操作
故障诊断和排除”。
·
1114 (ER_RECORD_FILE_FULL)
InnoDB耗尽表空间中的可用空间,你应该重新配置表空间来添加一个新数据文件。
·
1205 (ER_LOCK_WAIT_TIMEOUT)
锁定等待超时过期。事务被回滚。
·
1213 (ER_LOCK_DEADLOCK)
事务死锁。你应该重运行事务。
·
1216 (ER_NO_REFERENCED_ROW)
你正试着添加一行,但没有父行,并且一个外键约束失败。你应该先添加父行。
·
1217 (ER_ROW_IS_REFERENCED)
你正试图删除一个有子行的父行,并且一个外键约束失败。你应该先删除子行。
要打印一个操作系统错误号的意思,请使用MySQL
下面表提供一些常用Linux系统错误代码。更完整的列表请参阅Linux
source code。
·
1 (EPERM)
操作不被允许
·
2 (ENOENT)
无此文件或目录
·
3 (ESRCH)
无此进程
·
4 (EINTR)
中断的系统调用
·
5 (EIO)
I/O 错误
·
6 (ENXIO)
无此设备或地址
·
7 (E2BIG)
Arg列表太长
·
8 (ENOEXEC)
Exec合适错误
·
9 (EBADF)
坏文件号
·
10 (ECHILD)
无子进程
·
11 (EAGAIN)
再试一次
·
12 (ENOMEM)
内存耗尽
·
13 (EACCES)
许可被否定
·
14 (EFAULT)
坏地址
·
15 (ENOTBLK)
阻止需求的设备
·
16 (EBUSY)
设备或资源忙
·
17 (EEXIST)
文件存在
·
18 (EXDEV)
交叉设备连接
·
19 (ENODEV)
无此设备
·
20 (ENOTDIR)
不是一个目录
·
21 (EISDIR)
是一个目录?
·
22 (EINVAL)
非法参量
·
23 (ENFILE)
文件表溢出
·
24 (EMFILE)
打开的文件过多
·
25 (ENOTTY)
设备不适合的ioctl
·
26 (ETXTBSY)
文本文件忙
·
27 (EFBIG)
文件太大
·
28 (ENOSPC)
设备上没空间了
·
29 (ESPIPE)
非法查找
·
30 (EROFS)
只读文件系统
·
31 (EMLINK)
太多连接
下列表提供一列常用Windows系统错误代码。完整列表请访问Microsoft website。
·
1 (ERROR_INVALID_FUNCTION)
不正确函数。
·
2 (ERROR_FILE_NOT_FOUND)
系统不能找到指定的文件。
·
3 (ERROR_PATH_NOT_FOUND)
系统不能找到指定的路径。
·
4 (ERROR_TOO_MANY_OPEN_FILES)
系统不能打开文件。
·
5 (ERROR_ACCESS_DENIED)
访问被拒绝。
·
6 (ERROR_INVALID_HANDLE)
句柄非法。
·
7 (ERROR_ARENA_TRASHED)
存储控制块被破坏。
·
8 (ERROR_NOT_ENOUGH_MEMORY)
无足够存储来处理这个命令。
·
9 (ERROR_INVALID_BLOCK)
存储控制块地址非法。
·
10 (ERROR_BAD_ENVIRONMENT)
环境不正确。
·
11 (ERROR_BAD_FORMAT)
试图用不正确的格式装载一个程序。
·
12 (ERROR_INVALID_ACCESS)
访问代码不合法。
·
13 (ERROR_INVALID_DATA)
数据不合法。
·
14 (ERROR_OUTOFMEMORY)
无足够的存储来完成这个操作。
·
15 (ERROR_INVALID_DRIVE)
系统不能找到指定的驱动器。
·
16 (ERROR_CURRENT_DIRECTORY)
目录不能被删除。
·
17 (ERROR_NOT_SAME_DEVICE)
系统不能移动此文件到一个不同的磁盘驱动器。
·
18 (ERROR_NO_MORE_FILES)
没有更多文件。
·
19 (ERROR_WRITE_PROTECT)
媒质写保护。
·
20 (ERROR_BAD_UNIT)
系统不能找到指定的设备。
·
21 (ERROR_NOT_READY)
设备未准备好。
·
22 (ERROR_BAD_COMMAND)
设备不能识别此命令。
·
23 (ERROR_CRC)
数据错误(循环冗余码校验).
·
24 (ERROR_BAD_LENGTH)
程序发出一个命令,但是命令长度不正确。
·
25 (ERROR_SEEK)
驱动器不能在磁盘上定位指定区域或磁道。
·
26 (ERROR_NOT_DOS_DISK)
指定的磁盘或软盘不能被访问。
·
27 (ERROR_SECTOR_NOT_FOUND)
驱动器不能找到请求的扇区。
·
28 (ERROR_OUT_OF_PAPER)
打印机缺纸。
·
29 (ERROR_WRITE_FAULT)
系统不能写指定设备。
·
30 (ERROR_READ_FAULT)
系统不能从指定设备读。
·
31 (ERROR_GEN_FAILURE)
附加到系统的设备不起作用。
·
32 (ERROR_SHARING_VIOLATION)
进程不能访问文件,因为它正被另一个进程使用。
·
33 (ERROR_LOCK_VIOLATION)
进程不能访问文件,因为另一个进程已经锁定文件的一部分。
·
34 (ERROR_WRONG_DISK)
驱动器的的磁盘不正确,请插入 %2 (卷系列号: %3) 到驱动器
%1.
·
36 (ERROR_SHARING_BUFFER_EXCEEDED)
太多文件被打开以共享。
·
38 (ERROR_HANDLE_EOF)
到达文件的末尾。
·
39 (ERROR_HANDLE_DISK_FULL)
磁盘已满。
·
87 (ERROR_INVALID_PARAMETER)
参数不正确。(如果你在Windows中得到这个错误,并且已经在my.cnf或my.ini文件中设置innodb_file_per_table,则添加innodb_flush_method=unbuffered到你的my.cnf或my.ini文件)。
·
112 (ERROR_DISK_FULL)
磁盘已满。
·
123 (ERROR_INVALID_NAME)
文件名,目录名或者卷标语法不正确。
·
1450 (ERROR_NO_SYSTEM_RESOURCES)
存在系统资源不够完成请求的服务。