Mysqldump с WHERE id IN (SELECT...) приводит к ошибке "не заблокирована" таблицы

У меня есть 2 базы данных, из которых <100 > нет строк в таблице field_collection_item из db1, которые я хотел бы восстановить, экспортировав из db2.

Мой план состоит в следующем:

  • идентифицировать отсутствующие элементы item_id в db2, экспортируя список item_id s.
  • импортируйте item_id в db1 в новую таблицу missing_field_collection_item
  • Используя следующий mysqldump, вытащите данные:

    mysqldump -u USER -pPASS DATABASE --no-create-info --tables field_collection_item --where = "item_id IN (SELECT item_id FROM missing_field_collection_item);

однако это дает ошибку:

Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `field_collection_item` WHERE item_id IN (SELECT item_id FROM missing_field_collection_item);': Table 'missing_field_collection_item' was not locked with LOCK TABLES (1100)

Я бы предпочел сделать это, не внося изменения в db2, но это не является строго необходимым, если окажется, что единственный реалистичный способ сделать это - отказаться от строк, которые я не хочу, а затем сбросить без предложения where.

UPDATE

Я обнаружил вышеуказанные работы просто добавив --single-transaction, который, кажется, отключает блокировку. Это должно быть безопасным, так как db2 не является живым, однако я не уверен, что понимаю любые побочные эффекты, поэтому я не буду принимать это как ответ без второго мнения.

Ответ 1

Если ваши таблицы являются MyISAM, самый безопасный и простой способ справиться с этим - передать флаг --lock-all-tables. Если ваши таблицы InnoDB, то --single-transaction лучше.

Ответ 2

Если вам не нужна гарантия согласованности, вы можете отключить блокировку без отдельной транзакции, добавив:

- блокировка таблицы = ложь

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

Преимущество над --single-transaction заключается в том, что вы можете использовать/смешивать таблицы, не относящиеся к MVCC.