24

field_collection_item我有 2 个数据库,表中缺少约 100,000 行db1,我想通过从 导出来修复db2

我的计划是:

  1. item_id通过in识别缺失的项目db2,导出item_ids 的列表。
  2. item_ids 导入db1到新表中missing_field_collection_item
  3. 使用以下 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 子句的情况下转储。

更新

我发现上面的工作只是通过添加--single-transaction,这似乎关闭了锁定。这应该是安全的,因为db2它不是实时的,但是我不确定我是否理解任何副作用,所以我不会在没有第二意见的情况下接受这个作为答案。

4

2 回答 2

30

如果您的表是 MyISAM,最安全、最简单的处理方法是传递 flag --lock-all-tables。如果你的表是 InnoDB 那就--single-transaction更好了。

于 2014-04-09T21:25:48.053 回答
7

如果您不需要一致性保证,您可以通过添加以下内容来禁用没有单个事务的锁定:

--lock-tables=false

我用它来做同样的事情(转储数据子集)和我可以停止的复制从属服务器(无论如何都要保持一致)。

一个优势--single-transaction是您可以使用/混合非 MVCC 引擎表。

于 2017-02-04T15:52:30.500 回答