15.2.15 . InnoDB错误处理

在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。

15.2.15 .1. InnoDB错误代码

下面的这个不完全列表是你可能遇见的常见的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)

你正试图删除一个有子行的父行,并且一个外键约束失败。你应该先删除子行。

15.2.15 .2. 操作系统错误代码

要打印一个操作系统错误号的意思,请使用MySQL 分发版 里的perror程序。

下面表提供一些常用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)

存在系统资源不够完成请求的服务。

关注编程学问公众号