#mysql #indexing #innodb
#mysql #индексирование #innodb
Вопрос:
всем привет, у меня есть таблица innodb, для которой я пытаюсь запустить индекс, и я получаю следующую ошибку:
Deadlock found when trying to get lock; try restarting transaction
Синтаксис такой:
ALTER TABLE mytable ADD INDEX (fieldtoindex);
есть идеи относительно того, почему это приведет к ошибке взаимоблокировки? Спасибо!
Комментарии:
1. Что-то еще использует базу данных, пока вы пытаетесь добавить индекс?
Ответ №1:
Вы не предоставляете достаточно информации, чтобы ответить на ваш вопрос.
В InnoDB, как правило, при возникновении ошибки, посмотрите на выходные данные SHOW ENGINE INNODB STATUS. Вы хотите запустить это в клиенте командной строки и завершить команду символом G (обратная косая черта в верхнем регистре G), чтобы сделать вывод читаемым.
В вашем случае соответствующая информация будет находиться в верхней части вывода состояния SHOW ENGINE INNODB, где говорится что-то вроде
------------------------
LATEST DETECTED DEADLOCK
------------------------
100720 14:27:32
*** (1) TRANSACTION:
TRANSACTION 3 572739397, ACTIVE 2 sec, process no 3057, OS thread id 1362831680 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1216, 3 row lock(s)
MySQL thread id 37496388, query id 1645924019 host 10.147.209.20 db Updating
update t set aid='4921978' where id in (302885,303582,303907,303911)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 36004 page no 147 n bits 216 index `PRIMARY` of table `db`.`t` trx id 3 572739397 lock_mode X locks rec but not gap waiting
Record lock, heap no 43 PHYSICAL RECORD: n_fields 19; compact format; info bits 0
Здесь перечислены соответствующие имена таблиц и индексов, а также задействованные операторы. С этой информацией ваша проблема становится разрешимой.
Смотрите также http://www.mysqlperformanceblog.com/2006/07/17/show-innodb-status-walk-through / для получения дополнительной информации.
Если это случается чаще, взгляните на http://freshmeat.net/projects/innotop, экран «D» (отображение взаимоблокировки).