带有WHERE id IN(SELECT ...)的mysqldump产生表"未锁定"错误

Dan*_*anH 19 mysql mysqldump where-clause

我有2个数据库,用〜100,000行从表中缺少field_collection_itemdb1,我想通过出口来维修db2.

我实现这一目标的计划是:

  1. item_idin 识别缺失的项目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)
Run Code Online (Sandbox Code Playgroud)

我更愿意这样做而不进行更改,db2但是它并不是绝对必要的,如果事实证明这样做的唯一现实方法是删除我不想要的行然后在没有where子句的情况下转储.

UPDATE

我发现上面的工作只是通过添加--single-transaction,似乎关闭锁定.这应该是安全的,因为db2不是活的,但是我不自信我理解任何副作用,所以我不会接受这个作为没有第二意见的答案.

Ale*_*den 23

如果你的表是MyISAM,最安全,最简单的方法是传递标志--lock-all-tables.如果你的表是InnoDB那么--single-transaction更好.


Chr*_*wan 6

如果不需要一致性保证,则可以通过添加以下命令来禁用无单个事务的锁定:

--lock-tables = false

我用它来做您要做的事情(转储数据的子集)以及在复​​制从属服务器上可以停止的工作(无论如何使其保持一致)。

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