2013-08-05 10 views
10

Ho 2 basi di dati, con ~ 100.000 righe mancante dalla tabella field_collection_item da db1, che mi piacerebbe riparare esportando da db2 .mysqldump con WHERE id IN (SELECT ...) produce tavola "non è stato bloccato" errore

Il mio piano per raggiungere questo obiettivo è stato quello di:

  1. identificare gli elementi mancanti dalla item_id in db2, esportando l'elenco dei item_id s.
  2. importare il item_id s in db1 in una nuova tabella missing_field_collection_item
  3. Utilizzando il seguente mysqldump per estrarre i dati:

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

tuttavia questo dà l'errore:

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) 

io preferirei fare questo senza apportare modifiche al db2 tuttavia non è strettamente necessario, se si scopre l'unico modo realistico per farlo è per eliminare le righe che non desidero e quindi eseguire il dump senza una clausola where.

UPDATE

ho scoperto le opere di cui sopra semplicemente con l'aggiunta --single-transaction, che sembra per spegnere bloccaggio. Questo dovrebbe essere sicuro dal momento che db2 non è attivo, tuttavia non sono sicuro di aver capito alcun effetto collaterale, quindi non accetterò questo come risposta senza una seconda opinione.

+0

fa elencare entrambe le tabelle nel comando '--tables'? – Stobor

+0

Sì, comunque avrei bisogno di analizzare il dump ed escludere gli inserti 'missing_field_collection_item'. Non particolarmente difficile ma sembra solo un po 'sporco. Forse hai ragione, è meglio il diavolo che conosci. – DanH

risposta

13

Se i tuoi tavoli sono MyISAM, il modo più sicuro e semplice per gestirli è passare la bandiera --lock-all-tables. Se i tuoi tavoli sono InnoDB, allora --single-transaction è meglio.

+0

Grazie, ho finito con --single-transaction too :) – DanH

2

Se non avete bisogno di una garanzia di coerenza, è possibile disattivare il blocco senza singola transazione con l'aggiunta di:

--lock-tables=false

Io lo uso per fare la stessa cosa che stai dopo (sottoinsiemi di dati scarico) e sugli schiavi della replica che posso fermare (rendendolo coerente comunque).

Un vantaggio rispetto a --single-transaction è che è possibile utilizzare/mixare tabelle di motori non MVCC.

Problemi correlati