【发布时间】:2016-03-25 09:39:00
【问题描述】:
我将数据从 SQL 数据库导入到 mongodb。我使用导入器将数据迁移到通过 API 向网站提供数据的 mongodb。
导入可能需要几分钟,如果失败,我希望能够回滚(能够回滚多个导入会很糟糕)或删除未提交行的数据库/集合(如果您将其视为 SQL 事务)。
我尝试将所有内容导入到事务集合中,该集合在成功后将数据移动到正确的集合中。这需要很长时间才能发挥作用。我还尝试了导入临时数据库然后交换它们的解决方案。但是如果有人遇到问题,例如在 db-copy 之后但在导入完成之前在网站上注册一个新用户(交换时该用户将丢失)。
如何以安全的方式执行导入并且不存在最基本的并发问题?
编辑: 澄清解决方案: 我将在 cron 作业中运行导入程序,至少每天一次。我目前为最新同步保留一个时间戳,并选择比 SQL-db 更新的所有内容。随着时间的推移,事物会自动出现在 SQL-db 中。
在导入结束时,我运行一个下载器,从 SQL 数据库中的 url 下载所有图像。
我不想在下载图像之前开始新的同步,因为这可能会导致奇怪的行为。
【问题讨论】:
-
您是否有理由必须在导入过程中使用节点?我认为有比 node 更专业的数据迁移工具会是更好的选择; github.com/compose/transporter一人
-
正如@markthethomas 提到的,很可能有一个专门的工具可以做到这一点。关于回滚,这很复杂,因为 SQL 是基于 ACID 的数据库系统,而 Mongo 是基于 BASE 的数据库系统,因此它们与事务的原子性具有非常不同的特征。小故事是,您需要跟踪写入 Mongo DB 的内容,然后在需要回滚 SQL 事务时触发删除这些文档。
标签: mysql node.js mongodb dbmigrate