Задавайте вопросы, мы ответим
Вы не зашли.
Таблица достигла разрешенного ей по умолчанию размера в 4гб, после чего возникла проблема с Insert delayed.
Обычный запрос из phpMyAdmin при ручном Insert выводит ошибку 'The table is full'.
но когда я использую Insert delayed запрос c помощью С API то вижу что эти запросы висят и всё(вижу в после вызова show processlist), при этом никаких ошибок в клиенте не возникает. Может что слышали по этой проблеме ?
Неактивен
Видимо, это все-таки ошибка, т.к. при обычных инсертах Вы получите нормальное
уведомление.
Увеличьте размер указателя в таблице и напишите отчет в bugtracker.
Неактивен
хм написали что не баг это:
http://bugs.mysql.com/bug.php?id=29238
Неактивен
Вероято, он ждет, пока освободится место в таблице и тогда вставит запись.
Неактивен
Вы привыкли общаться на этом форуме, когда вы скрываете 99% информации
и потом выкладываете по кусочкам.
Лучше описывать проблему целиком - тогда не будет непонимания.
Багу закрыли, так что, скорее всего, прийдется делать новую.
Неактивен
rgbeast написал:
Вероято, он ждет, пока освободится место в таблице и тогда вставит запись.
Да, ждет. Но не факт, что когда-либо дождется. DDL его точно убьет. Единственный способ - убить
строчки из таблицы.
Неактивен
Значит может и дождаться. Какой иначе смысл в ограничении числа строк. Только такой, что больше их быть не должно в таблице и юзер за это отвечает. Вот он и ждет пока юзер за это ответит. Аналог - кончилось место на диске, запись нового файла вправе ждать. Так что, бага или нет - их право решать, другое дело, что в мануале не совсем этот случай описан.
Неактивен
rgbeast написал:
Значит может и дождаться. Какой иначе смысл в ограничении числа строк. Только такой, что больше их быть не должно в таблице и юзер за это отвечает. Вот он и ждет пока юзер за это ответит. Аналог - кончилось место на диске, запись нового файла вправе ждать. Так что, бага или нет - их право решать, другое дело, что в мануале не совсем этот случай описан.
от чего тогда ж не ждет при обычном INSERT? DELAYED я так понимаю это не ожидание освобождение места, а ожидание когда наберется подходящее количество записей для реального INSERTа, а если места нет на диске почему бы этим запросам не работать одинаково?
Неактивен
Вот на этот вопрос - к ману
Почему оно так работает - это понятно. Любое улучшение - feature request.
Неактивен
Golova написал:
DELAYED я так понимаю это не ожидание освобождение места, а ожидание когда наберется подходящее количество записей для реального INSERTа, а если места нет на диске почему бы этим запросам не работать одинаково?
Опция DELAYED указывает серверу, что следует выполнить запрос только когда соответствующая таблица осовбодится, т.е. к ней не будет никаких запросов, ни на чтение, ни на запись (причем если во время выполнения запроса с опцией DELAYED приходят некие другие запросы, то DELAYED-запрос приостанавливается до тех пор, пока таблица не освободится вновь).
Когда DELAYED-запрос ждет, его содержимое хранится в памяти сервера, а клиент освобождается тут же (в отличие от LOW_PRIORITY-запроса, когда клиент ждет), поэтому никакой ошибки в клиенте не возникает.
Когда таблица освобождается, из памяти формируется пакет и вставляется в таблицу.
Соответственно, если таблица заполнена, вставить в нее нельзя, и содержимое так и висит в памяти, причем клиентская сторона об этом не знает, т.к. получила от сервера "ок".
Мне кажется, что не баг, а недочет в механизме работы сервера (поэтому баг и закрыли).
Неактивен
Перепостил: http://bugs.mysql.com/bug.php?id=29335
Что-то в этом моторе все-таки не так...
Неактивен
немного не адекватные люди там у них в суппорте... сначала вообще не поняла что предлагается, а потом влепила стандартную фразу:
"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)
Неактивен
Непробиваемо. You have to change the logic of your application.
Неактивен
Нет, просто не используйте DELAYED. Нужен низкий приоритет - INSERT LOW_PRIORITY.
Эта штука действительно асинхронная. Проверил ее в случае уникального ключа - она
тоже тихо проходит. Прийдется переписать приложение
Неактивен
paulus написал:
Нет, просто не используйте DELAYED. Нужен низкий приоритет - INSERT LOW_PRIORITY.
Эта штука действительно асинхронная. Проверил ее в случае уникального ключа - она
тоже тихо проходит. Прийдется переписать приложение
Здравствуйте!
Скажите, а правильно ли я понял, что в данном случае указание DELAYED приводит к тому, что запросы выполнятся асинхронно (то есть не в том порядке, в котором они поступили в очередь)?
В отличии от LOW_PRIORITY, когда запросы выполняются в той последовательности, в которой они поступают.
Неактивен
DELAYED значит запрос будет как будто выполнен и управление вернется к скрипту. Сам запрос будет отложен в долгий ящик и может быть выполнится скоро, может быть нескоро, а может быть никогда. DELAYED не нужно использовать никогда.
LOW_PRIORITY - значит запрос будет уступать запросам на выборку, но пока он не выполнится, управление скрипту не вернется. Это дает возможность отследить ошибку, если она возникнет (например, таймаут).
Неактивен
Дополню, чтобы все про DELAYED было в одной теме.
По умолчанию:
-) запросы на запись (update, delete) имеют приоритет перед запросами на чтение (select)
-) сервер осуществляет запросы на запись в том порядке в каком они ему поступили
Можно влиять на механизм планировки выполнения запросов, используя модификаторы LOW_PRIORITY, HIGH_PRIORITY и DELAYED.
DELAYED (insert, replace) позволяют накапливать в буфере на сервере INSERTы пока таблица не освободится. Возможна ситуация, что добавление и не произойдет, при этом не будет никаких сообщений об ошибке. В доке рекомендуют использовать DELAYED, если не критична потеря части информации. Кроме того при каждом INSERT DELAYED опустошается кэш таблицы, а добавление когда ещё произойдет (если произойдет )
И, пожалуй, главное
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.
Неактивен