SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.06.2007 20:49:12

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

проблема с Insert delayed

Таблица достигла разрешенного ей по умолчанию размера в 4гб, после чего возникла проблема с Insert delayed.
Обычный запрос из phpMyAdmin при ручном Insert выводит ошибку 'The table is full'.
но когда я использую Insert delayed запрос c помощью С API то вижу что эти запросы висят и всё(вижу в после вызова show processlist), при этом никаких ошибок в клиенте не возникает. Может что слышали по этой проблеме ?

Неактивен

 

#2 18.06.2007 21:26:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с Insert delayed

Видимо, это все-таки ошибка, т.к. при обычных инсертах Вы получите нормальное
уведомление.

Увеличьте размер указателя в таблице и напишите отчет в bugtracker.

Неактивен

 

#3 21.06.2007 18:30:13

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: проблема с Insert delayed

хм написали что не баг это:
http://bugs.mysql.com/bug.php?id=29238

Неактивен

 

#4 21.06.2007 18:48:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: проблема с Insert delayed

Вероято, он ждет, пока освободится место в таблице и тогда вставит запись.

Неактивен

 

#5 21.06.2007 18:52:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с Insert delayed

Вы привыкли общаться на этом форуме, когда вы скрываете 99% информации
и потом выкладываете по кусочкам.

Лучше описывать проблему целиком - тогда не будет непонимания.

Багу закрыли, так что, скорее всего, прийдется делать новую.

Неактивен

 

#6 21.06.2007 18:57:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с Insert delayed

rgbeast написал:

Вероято, он ждет, пока освободится место в таблице и тогда вставит запись.

Да, ждет. Но не факт, что когда-либо дождется. DDL его точно убьет. Единственный способ - убить
строчки из таблицы.

Неактивен

 

#7 21.06.2007 19:05:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: проблема с Insert delayed

Значит может и дождаться. Какой иначе смысл в ограничении числа строк. Только такой, что больше их быть не должно в таблице и юзер за это отвечает. Вот он и ждет пока юзер за это ответит. Аналог - кончилось место на диске, запись нового файла вправе ждать. Так что, бага или нет - их право решать, другое дело, что в мануале не совсем этот случай описан.

Неактивен

 

#8 23.06.2007 14:02:27

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: проблема с Insert delayed

rgbeast написал:

Значит может и дождаться. Какой иначе смысл в ограничении числа строк. Только такой, что больше их быть не должно в таблице и юзер за это отвечает. Вот он и ждет пока юзер за это ответит. Аналог - кончилось место на диске, запись нового файла вправе ждать. Так что, бага или нет - их право решать, другое дело, что в мануале не совсем этот случай описан.

от чего тогда ж не ждет при обычном INSERT? DELAYED я так понимаю это не ожидание освобождение места, а ожидание когда наберется подходящее количество записей для реального INSERTа, а если места нет на диске почему бы этим запросам не работать одинаково?

Неактивен

 

#9 23.06.2007 14:38:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с Insert delayed

Вот на этот вопрос - к ману smile

Почему оно так работает - это понятно. Любое улучшение - feature request.

Неактивен

 

#10 23.06.2007 17:21:31

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: проблема с Insert delayed

Golova написал:

DELAYED я так понимаю это не ожидание освобождение места, а ожидание когда наберется подходящее количество записей для реального INSERTа, а если места нет на диске почему бы этим запросам не работать одинаково?

Опция DELAYED указывает серверу, что следует выполнить запрос только когда соответствующая таблица осовбодится, т.е. к ней не будет никаких  запросов, ни на чтение, ни на запись (причем если во время выполнения запроса с опцией DELAYED приходят некие другие запросы, то DELAYED-запрос приостанавливается до тех пор, пока таблица не освободится вновь).

Когда DELAYED-запрос ждет, его содержимое хранится в памяти сервера, а клиент освобождается тут же (в отличие от LOW_PRIORITY-запроса, когда клиент ждет), поэтому никакой ошибки в клиенте не возникает.
Когда таблица освобождается, из памяти формируется пакет и вставляется в таблицу.
Соответственно, если таблица заполнена, вставить в нее нельзя, и содержимое так и висит в памяти, причем клиентская сторона об этом не знает, т.к. получила от сервера "ок".

Мне кажется, что не баг, а недочет в механизме работы сервера (поэтому баг и закрыли).

Неактивен

 

#11 25.06.2007 16:33:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с Insert delayed

Перепостил: http://bugs.mysql.com/bug.php?id=29335
Что-то в этом моторе все-таки не так...

Неактивен

 

#12 27.06.2007 14:31:57

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: проблема с Insert delayed

немного не адекватные люди там у них в суппорте... сначала вообще не поняла что предлагается, а потом влепила стандартную фразу:
"INSERT DELAYED returns no error by design.
This is documented and you have to change
logic of the application if you want to get error."

мне что перед каждым таким DELAYED INSERT вызывать:
SHOW TABLE STATUS LIKE 'f';
вычислять результат (Data_length: 327675, Max_data_length: 327679,  Avg_row_length: 5) самому высчитывая не превысят ли данные максимального размера?
или это дурдом или есть иной способ?
можно конечно поставить размер 256TB и не париться.....

Отредактированно Golova (27.06.2007 14:33:51)

Неактивен

 

#13 27.06.2007 14:32:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с Insert delayed

Непробиваемо. You have to change the logic of your application.

Неактивен

 

#14 27.06.2007 14:42:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с Insert delayed

Нет, просто не используйте DELAYED. Нужен низкий приоритет - INSERT LOW_PRIORITY.

Эта штука действительно асинхронная. Проверил ее в случае уникального ключа - она
тоже тихо проходит. Прийдется переписать приложение smile

Неактивен

 

#15 04.01.2014 18:06:48

JohnSmith
Участник
Зарегистрирован: 28.11.2013
Сообщений: 12

Re: проблема с Insert delayed

paulus написал:

Нет, просто не используйте DELAYED. Нужен низкий приоритет - INSERT LOW_PRIORITY.

Эта штука действительно асинхронная. Проверил ее в случае уникального ключа - она
тоже тихо проходит. Прийдется переписать приложение smile

Здравствуйте!
Скажите, а правильно ли я понял, что в данном случае указание DELAYED приводит к тому, что запросы выполнятся асинхронно (то есть не в том порядке, в котором они поступили в очередь)?
В отличии от LOW_PRIORITY, когда запросы выполняются в той последовательности, в которой они поступают.

Неактивен

 

#16 04.01.2014 18:32:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: проблема с Insert delayed

DELAYED значит запрос будет как будто выполнен и управление вернется к скрипту. Сам запрос будет отложен в долгий ящик и может быть выполнится скоро, может быть нескоро, а может быть никогда. DELAYED не нужно использовать никогда.

LOW_PRIORITY - значит запрос будет уступать запросам на выборку, но пока он не выполнится, управление скрипту не вернется. Это дает возможность отследить ошибку, если она возникнет (например, таймаут).

Неактивен

 

#17 04.01.2014 23:16:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: проблема с Insert delayed

Дополню, чтобы все про DELAYED было в одной теме.

По умолчанию:
-) запросы на запись (update, delete) имеют приоритет перед запросами на чтение (select)
-) сервер осуществляет запросы на запись в том порядке в каком они ему поступили

Можно влиять на механизм планировки выполнения запросов, используя модификаторы LOW_PRIORITY, HIGH_PRIORITY и DELAYED.
DELAYED (insert, replace) позволяют накапливать в буфере на сервере INSERTы пока таблица не освободится. Возможна ситуация, что добавление и не произойдет, при этом не будет никаких сообщений об ошибке. В доке рекомендуют использовать DELAYED, если не критична потеря части информации. Кроме того при каждом INSERT DELAYED опустошается кэш таблицы, а добавление когда ещё произойдет (если произойдет smile )


И, пожалуй, главное


http://dev.mysql.com/doc/refman/5.6/en/insert-delayed.html написал:

Note

INSERT DELAYED is slower than a normal INSERT if the table is not otherwise in use. There is also the additional overhead for the server to handle a separate thread for each table for which there are delayed rows. This means that you should use INSERT DELAYED only when you are really sure that you need it.

As of MySQL 5.6.6, INSERT DELAYED is deprecated, and will be removed in a future release. Use INSERT (without DELAYED) instead.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson