在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)
存在系统资源不够完成请求的服务。