2013-08-05 11 views
10

Mam 2 bazy danych, z ~ 100 000 wierszy brakuje w tabeli field_collection_item z db1, które chciałbym naprawić eksportując od db2 .mysqldump z WHERE id IN (WYBIERZ ...) daje tabelę "nie został zablokowany" błąd

Mój plan był do osiągnięcia tego celu:

  1. zidentyfikować brakujące elementy przez item_id w db2, eksport listy item_id s.
  2. importować item_id s do db1 do nowej tabeli missing_field_collection_item
  3. Korzystanie następujące mysqldump wyciągnąć dane:

    mysqldump -u użytkownik -pPASS DATABASE --no-create-info --tables field_collection_item --where = "item_id IN (SELECT id_produktu z missing_field_collection_item);"

jednak daje to błąd:

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) 

wolałbym to zrobić bez wprowadzania zmian do db2 jednak nie jest to bezwzględnie konieczne, jeśli okazuje się, że jedyną realną drogą do tego jest upuszczać wiersze, których nie chcę, a następnie zrzucać bez klauzuli where.

UPDATE

odkryłem powyższe prace po prostu dodając --single-transaction, który wydaje się, aby wyłączyć blokadę. To powinno być bezpieczne, ponieważ db2 nie jest na żywo, jednak nie jestem pewien, czy rozumiem jakiekolwiek skutki uboczne, więc nie przyjmuję tego jako odpowiedzi bez drugiej opinii.

+0

zawiera listę obu tabel w działaniu polecenia "--tables'? – Stobor

+0

Tak, ale wtedy musiałbym przeanalizować zrzut i wykluczyć wstawki 'missing_field_collection_item'. Nie jest to szczególnie trudne, ale wydaje się trochę brudne. Może masz rację, lepiej, żebyś wiedział diabła. – DanH

Odpowiedz

13

Jeśli Twoje stoły są MyISAM, najbezpieczniejszym, najłatwiejszym sposobem na ich obsługę jest przekazanie flagi --lock-all-tables. Jeśli twoje tabele są InnoDB, to lepiej jest --single-transaction.

+0

Dzięki, skończyłem z - również jedną transakcją :) – DanH

2

Jeśli nie trzeba zagwarantować spójność, można wyłączyć blokowanie bez pojedynczej transakcji dodając:

--lock-tables=false

Używam tego zrobić to samo jesteś po (podzbiory danych dumping) i na niewolnikach replikacji, które mogę zatrzymać (czyniąc to mimo wszystko).

Zaleta w stosunku do --single-transaction polega na tym, że można używać/mieszać tabele silników innych niż MVCC.

Powiązane problemy