Ответ 1
Если ваши таблицы являются MyISAM, самый безопасный и простой способ справиться с этим - передать флаг --lock-all-tables
. Если ваши таблицы InnoDB, то --single-transaction
лучше.
У меня есть 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
не является живым, однако я не уверен, что понимаю любые побочные эффекты, поэтому я не буду принимать это как ответ без второго мнения.
Если ваши таблицы являются MyISAM, самый безопасный и простой способ справиться с этим - передать флаг --lock-all-tables
. Если ваши таблицы InnoDB, то --single-transaction
лучше.
Если вам не нужна гарантия согласованности, вы можете отключить блокировку без отдельной транзакции, добавив:
- блокировка таблицы = ложь
Я использую это, чтобы сделать то же самое, что вам нужно (сбрасывать подмножества данных) и на ведомые устройства репликации, которые я могу остановить (делая это в любом случае).
Преимущество над --single-transaction
заключается в том, что вы можете использовать/смешивать таблицы, не относящиеся к MVCC.