Error handling in InnoDB is not always the
same as specified in the SQL standard. According to the
standard, any error during an SQL statement should cause
rollback of that statement. InnoDB sometimes
rolls back only part of the statement, or the whole transaction.
The following items describe how InnoDB
performs error handling:
If you run out of file space in a
tablespace, a MySQL
Table is full error occurs and
InnoDB rolls back the SQL statement.
A transaction deadlock
causes InnoDB to
roll back the entire
transaction. Retry
the whole transaction when this happens.
A lock wait timeout causes InnoDB to roll
back only the single statement that was waiting for the lock
and encountered the timeout. (To have the entire transaction
roll back, start the server with the
--innodb_rollback_on_timeout
option.) Retry the statement if using the current behavior,
or the entire transaction if using
--innodb_rollback_on_timeout.
Both deadlocks and lock wait timeouts are normal on busy servers and it is necessary for applications to be aware that they may happen and handle them by retrying. You can make them less likely by doing as little work as possible between the first change to data during a transaction and the commit, so the locks are held for the shortest possible time and for the smallest possible number of rows. Sometimes splitting work between different transactions may be practical and helpful.
When a transaction rollback occurs due to a deadlock or lock
wait timeout, it cancels the effect of the statements within
the transaction. But if the start-transaction statement was
START
TRANSACTION or
BEGIN
statement, rollback does not cancel that statement. Further
SQL statements become part of the transaction until the
occurrence of COMMIT,
ROLLBACK,
or some SQL statement that causes an implicit commit.
A duplicate-key error rolls back the SQL statement, if you
have not specified the IGNORE option in
your statement.
A row too long error rolls back the SQL
statement.
Other errors are mostly detected by the MySQL layer of code
(above the InnoDB storage engine level),
and they roll back the corresponding SQL statement. Locks
are not released in a rollback of a single SQL statement.
During implicit rollbacks, as well as during the execution of an
explicit
ROLLBACK SQL
statement, SHOW PROCESSLIST
displays Rolling back in the
State column for the relevant connection.
The following is a nonexhaustive list of common
InnoDB-specific errors that you may
encounter, with information about why each occurs and how to
resolve the problem.
1005 (ER_CANT_CREATE_TABLE)
Cannot create table. If the error message refers to error
150, table creation failed because a
foreign key
constraint was not correctly formed. If the error
message refers to error –1, table creation probably
failed because the table includes a column name that
matched the name of an internal InnoDB
table.
1016 (ER_CANT_OPEN_FILE)
Cannot find the InnoDB table from the
InnoDB
data files,
although the .frm file for the table
exists. See
Section 14.2.4.7, “Troubleshooting InnoDB Data Dictionary Operations”.
1114 (ER_RECORD_FILE_FULL)
InnoDB has run out of free space in the
tablespace. Reconfigure the tablespace to add a new data
file.
1205 (ER_LOCK_WAIT_TIMEOUT)
Lock wait timeout expired. The statement that waited too
long was rolled back
(not the entire
transaction). You
can increase the value of the
innodb_lock_wait_timeout
configuration option if SQL statements should wait longer
for other transactions to complete, or decrease it if too
many long-running transactions are causing
locking problems and
reducing
concurrency on a
busy system.
1206 (ER_LOCK_TABLE_FULL)
The total number of locks exceeds the amount of memory
InnoDB devotes to managing locks. To
avoid this error, increase the value of
innodb_buffer_pool_size.
Within an individual application, a workaround may be to
break a large operation into smaller pieces. For example,
if the error occurs for a large
INSERT, perform several
smaller INSERT operations.
1213 (ER_LOCK_DEADLOCK)
The transaction
encountered a
deadlock and was
automatically rolled
back so that your application could take corrective
action. To recover from this error, run all the operations
in this transaction again. A deadlock occurs when requests
for locks arrive in inconsistent order between
transactions. The transaction that was rolled back
released all its locks, and the other transaction can now
get all the locks it requested. Thus when you re-run the
transaction that was rolled back, it might have to wait
for other transactions to complete, but typically the
deadlock does not recur. If you encounter frequent
deadlocks, make the sequence of locking operations
(LOCK TABLES, SELECT ... FOR
UPDATE, and so on) consistent between the
different transactions or applications that experience the
issue. See Section 14.2.3.10, “How to Cope with Deadlocks” for details.
1216 (ER_NO_REFERENCED_ROW)
You are trying to add a row but there is no parent row, and a foreign key constraint fails. Add the parent row first.
1217 (ER_ROW_IS_REFERENCED)
You are trying to delete a parent row that has children, and a foreign key constraint fails. Delete the children first.
To print the meaning of an operating system error number, use the perror program that comes with the MySQL distribution.
The following table provides a list of some common Linux system error codes. For a more complete list, see Linux source code.
| Number | Macro | Description |
|---|---|---|
| 1 | EPERM | Operation not permitted |
| 2 | ENOENT | No such file or directory |
| 3 | ESRCH | No such process |
| 4 | EINTR | Interrupted system call |
| 5 | EIO | I/O error |
| 6 | ENXIO | No such device or address |
| 7 | E2BIG | Arg list too long |
| 8 | ENOEXEC | Exec format error |
| 9 | EBADF | Bad file number |
| 10 | ECHILD | No child processes |
| 11 | EAGAIN | Try again |
| 12 | ENOMEM | Out of memory |
| 13 | EACCES | Permission denied |
| 14 | EFAULT | Bad address |
| 15 | ENOTBLK | Block device required |
| 16 | EBUSY | Device or resource busy |
| 17 | EEXIST | File exists |
| 18 | EXDEV | Cross-device link |
| 19 | ENODEV | No such device |
| 20 | ENOTDIR | Not a directory |
| 21 | EISDIR | Is a directory |
| 22 | EINVAL | Invalid argument |
| 23 | ENFILE | File table overflow |
| 24 | EMFILE | Too many open files |
| 25 | ENOTTY | Inappropriate ioctl for device |
| 26 | ETXTBSY | Text file busy |
| 27 | EFBIG | File too large |
| 28 | ENOSPC | No space left on device |
| 29 | ESPIPE | File descriptor does not allow seeking |
| 30 | EROFS | Read-only file system |
| 31 | EMLINK | Too many links |
The following table provides a list of some common Windows system error codes. For a complete list, see the Microsoft Web site.
| Number | Macro | Description |
|---|---|---|
| 1 | ERROR_INVALID_FUNCTION | Incorrect function. |
| 2 | ERROR_FILE_NOT_FOUND | The system cannot find the file specified. |
| 3 | ERROR_PATH_NOT_FOUND | The system cannot find the path specified. |
| 4 | ERROR_TOO_MANY_OPEN_FILES | The system cannot open the file. |
| 5 | ERROR_ACCESS_DENIED | Access is denied. |
| 6 | ERROR_INVALID_HANDLE | The handle is invalid. |
| 7 | ERROR_ARENA_TRASHED | The storage control blocks were destroyed. |
| 8 | ERROR_NOT_ENOUGH_MEMORY | Not enough storage is available to process this command. |
| 9 | ERROR_INVALID_BLOCK | The storage control block address is invalid. |
| 10 | ERROR_BAD_ENVIRONMENT | The environment is incorrect. |
| 11 | ERROR_BAD_FORMAT | An attempt was made to load a program with an incorrect format. |
| 12 | ERROR_INVALID_ACCESS | The access code is invalid. |
| 13 | ERROR_INVALID_DATA | The data is invalid. |
| 14 | ERROR_OUTOFMEMORY | Not enough storage is available to complete this operation. |
| 15 | ERROR_INVALID_DRIVE | The system cannot find the drive specified. |
| 16 | ERROR_CURRENT_DIRECTORY | The directory cannot be removed. |
| 17 | ERROR_NOT_SAME_DEVICE | The system cannot move the file to a different disk drive. |
| 18 | ERROR_NO_MORE_FILES | There are no more files. |
| 19 | ERROR_WRITE_PROTECT | The media is write protected. |
| 20 | ERROR_BAD_UNIT | The system cannot find the device specified. |
| 21 | ERROR_NOT_READY | The device is not ready. |
| 22 | ERROR_BAD_COMMAND | The device does not recognize the command. |
| 23 | ERROR_CRC | Data error (cyclic redundancy check). |
| 24 | ERROR_BAD_LENGTH | The program issued a command but the command length is incorrect. |
| 25 | ERROR_SEEK | The drive cannot locate a specific area or track on the disk. |
| 26 | ERROR_NOT_DOS_DISK | The specified disk or diskette cannot be accessed. |
| 27 | ERROR_SECTOR_NOT_FOUND | The drive cannot find the sector requested. |
| 28 | ERROR_OUT_OF_PAPER | The printer is out of paper. |
| 29 | ERROR_WRITE_FAULT | The system cannot write to the specified device. |
| 30 | ERROR_READ_FAULT | The system cannot read from the specified device. |
| 31 | ERROR_GEN_FAILURE | A device attached to the system is not functioning. |
| 32 | ERROR_SHARING_VIOLATION | The process cannot access the file because it is being used by another process. |
| 33 | ERROR_LOCK_VIOLATION | The process cannot access the file because another process has locked a portion of the file. |
| 34 | ERROR_WRONG_DISK | The wrong diskette is in the drive. Insert %2 (Volume Serial Number: %3) into drive %1. |
| 36 | ERROR_SHARING_BUFFER_EXCEEDED | Too many files opened for sharing. |
| 38 | ERROR_HANDLE_EOF | Reached the end of the file. |
| 39 | ERROR_HANDLE_DISK_FULL | The disk is full. |
| 87 | ERROR_INVALID_PARAMETER | The parameter is incorrect. |
| 112 | ERROR_DISK_FULL | The disk is full. |
| 123 | ERROR_INVALID_NAME | The file name, directory name, or volume label syntax is incorrect. |
| 1450 | ERROR_NO_SYSTEM_RESOURCES | Insufficient system resources exist to complete the requested service. |

User Comments
Add your own comment.