2013-08-05 3 views
10

テーブルから〜100,000行が抜けている2つのデータベースがあります db1から修復したいdb2item_idのリストをエクスポートし、db2item_idで不足している項目を識別WHERE ID IN(SELECT ...)を使用してmysqldumpがテーブル「ロックされていませんでした」エラーを返します

  1. :これを達成する

    私の計画をしました。

  2. データを取得するために、次のmysqldumpを使用して、新しいテーブルにdb1missing_field_collection_item
  3. item_id Sをインポートします。--no-作成-情報

    のmysqldump -u USER -pPASS DATABASEはfield_collection_itemを--tables --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はライブではないので、安全であるはずですが、私は副作用を理解しているとは確信していませんので、2番目の意見なしにこれを答えとして受け入れません。

+0

'--tables'コマンドの両方のテーブルをリスト表示しませんか? – Stobor

+0

はい、しかし、私はダンプを解析し、 'missing_field_collection_item'の挿入を除外する必要があります。それほど難しいことではありませんが、ちょっと汚いようです。たぶんあなたは正しいですが、それはあなたが知っている悪魔の方がいいです。 – DanH

答えて

13

テーブルがMyISAMの場合、これを処理する最も安全で簡単な方法は、フラグ--lock-all-tablesを渡すことです。テーブルがInnoDBの場合は、--single-transactionが優れています。あなたは一貫性の保証を必要としない場合は

+0

ありがとう、私も一緒に行く--single-トランザクションも:) – DanH

2

、あなたは追加することにより、単一のトランザクションのないロックを無効にすることができます

--lock-tables=false

は私が(データのサブセットをダンプ)した後、あなたがしている同じことを行うためにこれを使用しますレプリケーションスレーブ上で停止することができます(とにかく一貫性を持たせる)。

--single-transactionを超える利点は、MVCC以外のエンジンテーブルを使用/混合できることです。

関連する問題