我有 2 个数据库,db1
的表 field_collection_item
中缺少约 100,000 行,我想通过从 db2中导出来修复它
.
我的计划是:
- 在
db2
中通过item_id
识别缺失的项目,导出item_id
的列表。 - 将
item_id
导入db1
到新表missing_field_collection_item
使用以下 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/