Вы можете провести эксперимент:
В первом сеансе запуска:
mysql> LOCK TABLE foobar WRITE;
mysql> ALTER TABLE foobar ENGINE=MyISAM;
Во втором сеансе (т.е. откройте второе окно терминала) запустите:
mysql> SHOW ENGINE INNODB STATUS\G
Внизу в разделе ТРАНЗАКЦИИ вы обнаружите, что ваш поток ALTER выполняется:
---TRANSACTION 69638, ACTIVE 45 sec fetching rows
mysql tables in use 1, locked 1
14626 lock struct(s), heap size 1898936, 5145657 row lock(s)
Ого! Он создает много отдельных блокировок строк, несмотря на действующую LOCK TABLE.
(Это всего лишь пример; вы увидите, что количество блокировок строк со временем увеличивается по мере того, как ALTER TABLE работает с вашей таблицей.)
Поэтому вам нужно гарантировать место для большого количества блокировок строк.
https://dev.mysql.com/doc/refman/5.6/en/innodb-error-codes.html говорит:
1206 (ER_LOCK_TABLE_FULL)
Общее количество блокировок превышает объем памяти, который InnoDB выделяет для управления блокировками. Чтобы избежать этой ошибки, увеличьте значение innodb_buffer_pool_size
. В отдельном приложении обходной путь может состоять в том, чтобы разбить большую операцию на более мелкие части. Например, если ошибка возникает для большого INSERT
, выполните несколько меньших операций INSERT
.
(выделено мной)
Также прочитайте Сколько памяти действительно блокирует Innodb взять?
Блокировки на уровне строк в Innodb реализуются за счет наличия специальной таблицы блокировок, расположенной в пуле буферов, где можно установить небольшую запись, выделенную для каждого хэша и для каждой строки, заблокированной на этом бите страницы. Теоретически это может дать накладные расходы всего в несколько бит на строку.
Таким образом, для блокировки 160 миллионов строк требуется около 60-80 МБ места в таблице блокировки. Ваш буферный пул может быть слишком мал, чтобы вместить это.
Размер буферного пула InnoDB по умолчанию составлял всего 8 МБ в MySQL 5.1.27 и более ранних версиях. Значение по умолчанию было увеличено до 128 МБ в MySQL 5.1.28.
Повторите ваш комментарий:
каждый инструмент выполняет свою работу ;) - MyISAM тоже
MyISAM не поддерживает атомарность, согласованность, изоляцию или долговечность. Кроме этого, это здорово. :-)
person
Bill Karwin
schedule
19.03.2014