带有 WHERE id IN (SELECT ...) 的 mysqldump 产生表 "was not locked"错误

标签 mysql mysqldump where-clause

我有 2 个数据库,db1 的表 field_collection_item 中缺少约 100,000 行,我想通过从 db2.

我的计划是:

  1. db2 中通过 item_id 识别缺失的项目,导出 item_id 的列表。
  2. item_id 导入 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 不是实时的,但是我不确定我是否理解任何副作用,所以我不会在没有第二个意见的情况下接受这个作为答案。

最佳答案

如果您的表是 MyISAM,最安全、最简单的处理方法是传递标记 --lock-all-tables。如果您的表是 InnoDB,则 --single-transaction 更好。

关于带有 WHERE id IN (SELECT ...) 的 mysqldump 产生表 "was not locked"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18053229/

相关文章:

mysql - 使用 stddev 优化外汇数据历史记录的子查询

java - 未找到函数 "DATE"; SQL语句:

PHP MySQL登录设置错误

mysql - mysqldump : "--defaults-extra-file" option is not working as expected 的问题

php - 使用 .php 文件生成 MySQL 转储

mysql - 将两次传递给 xargs 的数据放在一行中

mysql - WHERE 子句后跟 JOIN

c# - SubmitChanges 在内部将所有字段添加为 where 子句,如何摆脱它

mysql - 在子查询中访问父列信息

java - 使用 jdbctemplate/jdbc for Hana db 获取按序列生成的主键