MySQL InnoDB зависает при ожидании блокировок на уровне таблицы - PullRequest
10 голосов
/ 31 мая 2011

У меня большое производственное веб-приложение (Glassfish 3.1 + MySQL 5.5).Все таблицы InnoDB.Раз в несколько дней приложение полностью зависает.SHOW FULL PROCESSLIST показывает множество простых запросов вставки или обновления для разных таблиц, но все они имеют статус

Ожидание блокировки на уровне таблицы

Примеры:

update user<br>
set user.hasnewmessages = NAME_CONST('in_flag',_binary'\0' COLLATE 'binary')
where user.id = NAME_CONST('in_uid',66381)

insert into exchanges_itempacks
set packid = NAME_CONST('in_packId',332149), type = NAME_CONST('in_type',1), itemid = NAME_CONST('in_itemId',23710872)

Запросы с самым длинным временем ожидают блокировки на уровне таблицы.Пожалуйста, помогите понять, почему MySQL пытается получить блокировку уровня и что может блокировать все эти таблицы.Во всех статьях о блокировке InnoDB говорится, что этот движок не использует блокировку таблиц, если вы не заставляете его это делать.

My my.cnf имеет следующее:

innodb_flush_log_at_trx_commit = 0
innodb_support_xa = 0
innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode=2

Двоичный журнал отключен,У меня нет "LOCK TABLES" или других явных команд блокировки вообще.Транзакции: READ_UNCOMMITED.

SHOW ENGINE INNODB STATUS Вывод: http://avatar -studio.ru: 8080 / ph / imonout.txt

Ответы [ 6 ]

4 голосов
/ 13 июля 2011

Используете ли вы MSQLDump для резервного копирования базы данных, пока она еще используется вашим приложением?Это может вызвать такое поведение.

1 голос
/ 24 июля 2011

Я вижу, что вы активно используете NAME_CONST в своем коде.Просто постарайтесь не использовать его.Вы знаете, mysql иногда может содержать ошибки (я также обнаружил несколько ошибок), поэтому я рекомендую не полагаться на функции, которые не так часто / хорошо проверены.Он связан с именами столбцов, так что, может быть, он что-то блокирует?Ну, не должно, если это влияет только на результат, но кто знает?Это подозрительно.Кроме того, это помечено как функция только для внутреннего использования.

1 голос
/ 31 мая 2011

Я думаю, что в некоторых ситуациях MySQL выполняет полную блокировку таблицы (то есть, используя auto-inc).Я нашел ссылку, которая может вам помочь: http://mysqldatabaseadministration.blogspot.com/2007/06/innodb-table-locks.html

Также просмотрите код сохраняемости Java, в котором все con зафиксированы / откатаны и закрыты.(Закрытие всегда в блоке finally.)

Попробуйте установить innodb_table_locks=0 в конфигурации MySQL.http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_table_locks

Всего несколько идей ...

0 голосов
/ 12 июля 2011

в этом случае вам нужно создать несколько разных таблиц базы данных с одним и тем же столбцом и не вставлять более 3000 строк в таблицу; в этом случае, если вы хотите ввести больше данных в таблицу, вам нужно создать другую динамическую таблицу ( создать таблицу с использованием кода) и вставить новые данные в эту таблицу и получить доступ к данным из этой таблицы. в вашем состоянии, если вам нужно будет сгенерировать все больше и больше таблиц, то вам нужно создать новую базу данных.

Думаю, этот совет поможет вам более тщательно спроектировать базу данных и устранить ошибку.

0 голосов
/ 10 июля 2011

Рассматривали ли вы использовать MyISAM вместо InnoDB?

Если вы не используете какие-либо транзакционные функции, MyISAM может иметь больше смысла. Его проще, проще оптимизировать, и, поскольку он не имеет сложных транзакционных возможностей, его легче настроить в my.cnf.

Кроме того, в зависимости от типа загрузки базы данных, которую создает ваше приложение, MyISAM может быть более подходящим. Я предпочитаю MyISAM для приложений с большим объемом чтения, опять же, его легче настроить и понять.

Другие предложения:

  • Возможно, было бы неплохо найти способ не использовать NAME_CONST в вашем SQL . "Эта функция была добавлена ​​в MySQL 5.0.12. Она предназначена только для внутреннего использования." Когда документация о продукте с открытым исходным кодом говорит об этом, вероятно, это хорошая идея, чтобы прислушаться к советам.

  • По умолчанию MySQL хранит все данные таблиц и схем InnoDB в 1 огромном файле, там может быть какая-то блокировка уровня ОС для этого конкретного файла, распространяющегося на MySQL, который запрещает доступ ко всем таблицам , Используя опцию innodb_file_per_table , вы можете устранить эту потенциальную проблему. Это также делает MySQL более экономичным.

0 голосов
/ 10 июля 2011

Это может показаться простым, но у вас нет длительной инструкции select, которая может блокировать обновления и вставки?Нет запроса, который на самом деле работает и не заблокирован?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...