2013-08-05 35 views
10

我有2個數據庫,約有100,000行丟失從表field_collection_itemdb1,我想通過從db2mysqldump與WHERE ID IN(SELECT ...)產生表「未鎖定」錯誤

我的計劃來完成這個是:

  1. 通過item_iddb2標識缺項,出口的item_id是清單。
  2. 導入item_id s轉換db1到一個新表missing_field_collection_item
  3. 使用以下的mysqldump提取數據:

    的mysqldump -u用戶-pPASS DATABASE --no創建-信息--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沒有生效,但是我不確定我是否理解任何副作用,所以我不會接受這個答案而沒有第二個意見。

+0

確實在'--tables'命令中列出了兩個表的工作? – Stobor

+0

是的,然後我需要解析轉儲並排除'missing_field_collection_item'插入。不是特別困難,但它似乎有點骯髒。也許你是對的,你知道的魔鬼更好。 – DanH

回答

13

如果你的表是MyISAM,處理這個最安全,最簡單的方法是通過標誌--lock-all-tables。如果你的表是InnoDB,那麼--single-transaction更好。

+0

謝謝,我結束了--single-transaction太:) – DanH

2

如果您不需要一致性保證,您可以通過添加禁用沒有單個事務鎖:

--lock-tables=false

我用這個做你同樣的事情後(傾銷的數據子集)並在複製奴隸,我可以停止(無論如何使其一致)。

--single-transaction相比,您可以使用/混合非MVCC引擎表。

相關問題