Spec-Zone .ru
спецификации, руководства, описания, API
|
Обработка ошибок в InnoDB
не всегда то же самое как определено в стандарте SQL.
Согласно стандарту, любая ошибка во время SQL-оператора должна вызвать откат того оператора. InnoDB
иногда откатывает только часть оператора, или целую транзакцию. Следующие
элементы описывают как InnoDB
выполняет обработку ошибок:
Если Вы исчерпываете файловое пространство в табличной
области, MySQL Table is full
ошибка происходит и InnoDB
откатывает SQL-оператор.
Мертвая
блокировка транзакции вызывает InnoDB
откатывать
всю транзакцию. Повторите
целую транзакцию, когда это происходит.
Блокировка ожидает причины тайм-аута InnoDB
откатывать только
единственный оператор, который ожидал блокировки и встретился с тайм-аутом. (Чтобы иметь всю
транзакцию откатывают, запускают сервер с --innodb_rollback_on_timeout
опция.) Повторяют оператор, используя
текущее поведение, или всю транзакцию, используя --innodb_rollback_on_timeout
.
Обе мертвых блокировки и блокировка ожидают, тайм-ауты нормальны на занятых серверах, и необходимо для приложений знать, что они могут произойти и обработать их, повторяя. Можно сделать их менее вероятно, делая так небольшую работу насколько возможно между первым изменением к данным во время транзакции и фиксацией, таким образом, блокировки сохранены в течение самого короткого времени и для самого маленького числа строк. Иногда разделение работы между различными транзакциями может быть практичным и полезным.
Когда откат транзакции происходит из-за мертвой блокировки, или блокировка ожидают тайм-аут, это
отменяет эффект операторов в пределах транзакции. Но если оператор запускать-транзакции был START
TRANSACTION
или BEGIN
оператор, откат не отменяет тот оператор. Дальнейшие
SQL-операторы становятся частью транзакции до возникновения COMMIT
, ROLLBACK
, или некоторый SQL-оператор, который вызывает неявную
фиксацию.
Двойная ключевая ошибка откатывает SQL-оператор, если Вы не определили IGNORE
опция в Вашем операторе.
A row too long error
откатывает SQL-оператор.
Другие ошибки главным образом обнаруживаются уровнем MySQL кода (выше InnoDB
уровень механизма хранения), и они откатывают соответствующий
SQL-оператор. Блокировки не выпускаются в откате единственного SQL-оператора.
Во время неявных откатов, так же как во время выполнения явного ROLLBACK
SQL-оператор, SHOW PROCESSLIST
дисплеи Rolling back
в State
столбец для соответствующего соединения.
Следующее является неисчерпывающим списком общих InnoDB
Специфичные ошибки, с
которыми можно встретиться с информацией о том, почему каждый происходит и как разрешить проблему.
1005 (ER_CANT_CREATE_TABLE)
Не может составить таблицу. Если сообщение об ошибке относится к ошибке 150, табличное создание,
отказавшее, потому что ограничение внешнего ключа не было
правильно сформировано. Если сообщение об ошибке относится к ошибке–1, табличное создание,
вероятно, отказавшее, потому что таблица включает имя столбца, которое соответствовало имя
внутреннего InnoDB
таблица.
1016 (ER_CANT_OPEN_FILE)
Не может найти InnoDB
таблица от InnoDB
файлы данных, хотя .frm
файл для таблицы существует. См. Раздел
14.2.4.7, "Диагностируя InnoDB
Операции Словаря данных"
.
1114 (ER_RECORD_FILE_FULL)
InnoDB
исчерпал свободное пространство в табличной области.
Реконфигурируйте табличную область, чтобы добавить новый файл данных.
1205 (ER_LOCK_WAIT_TIMEOUT)
Блокировка ожидает истекший тайм-аут. Оператор, который ожидал слишком долго,
откатывался (не вся транзакция). Можно увеличить значение innodb_lock_wait_timeout
параметр конфигурации, если
SQL-операторы должны ожидать дольше других транзакций, чтобы завершить, или уменьшить это, если
слишком много продолжительных транзакций вызывают проблемы блокировки и
сокращение параллелизма
на занятой системе.
1206 (ER_LOCK_TABLE_FULL)
Общее количество блокировок превышает объем памяти InnoDB
посвящает
управлению блокировками. Чтобы избежать этой ошибки, увеличьте значение innodb_buffer_pool_size
. В пределах отдельного приложения
обходное решение может быть должно повредить большую работу в мелкие кусочки. Например, если
ошибка происходит для большого INSERT
, выполните несколько меньшие INSERT
операции.
1213 (ER_LOCK_DEADLOCK)
Транзакция, с
которой встречаются, мертвая
блокировка и автоматически откатывалась так, чтобы Ваше
приложение могло принять меры по ликвидации последствий. Чтобы восстановиться с этой ошибки,
выполните все операции в этой транзакции снова. Мертвая блокировка происходит, когда запросы на
блокировки прибывают в непоследовательный порядок между транзакциями. Транзакция, которая
откатывалась, выпускала все свои блокировки, и другая транзакция может теперь получить все
блокировки, которые это запрашивало. Таким образом, когда Вы запускаете повторно транзакцию,
которая откатывалась, ей, возможно, придется ожидать других транзакций, чтобы завершиться, но
обычно мертвая блокировка не повторяется. Если Вы встречаетесь с частыми мертвыми блокировками,
сделайте последовательность из блокировки операций (LOCK TABLES
,
SELECT ... FOR UPDATE
, и так далее) непротиворечивый между
различными транзакциями или приложениями, которые испытывают проблему. См. Раздел
14.2.3.10, "Как Справиться с Мертвыми блокировками" для деталей.
1216 (ER_NO_REFERENCED_ROW)
Вы пытаетесь добавить строку, но нет никакой родительской строки, и ограничение внешнего ключа перестало работать. Добавьте родительскую строку сначала.
1217 (ER_ROW_IS_REFERENCED)
Вы пытаетесь удалить родительскую строку, у которой есть дочерние элементы, и ограничение внешнего ключа перестало работать. Удалите дочерние элементы сначала.
Чтобы напечатать значение кода ошибки операционной системы, используйте perror программу, которая идет с распределением MySQL.
Следующая таблица обеспечивает список некоторых общих кодов системной ошибки Linux. Для более
полного списка см.
Число | Макрос | Описание |
---|---|---|
1 | EPERM |
Работа, не разрешенная |
2 | ENOENT |
Никакой такой файл или каталог |
3 | ESRCH |
Никакой такой процесс |
4 | EINTR |
Прерванный системный вызов |
5 | EIO |
Ошибка ввода-вывода |
6 | ENXIO |
Никакое такое устройство или адрес |
7 | E2BIG |
Список аргумента слишком долго |
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. Для
полного списка см.
Число | Макрос | Описание |
---|---|---|
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 |
Параметр является неправильным. |
112 | ERROR_DISK_FULL |
Диск полон. |
123 | ERROR_INVALID_NAME |
Имя файла, имя каталога, или синтаксис метки тома являются неправильными. |
1450 | ERROR_NO_SYSTEM_RESOURCES |
Недостаточные системные ресурсы существуют, чтобы завершить требуемую службу. |