将 mongo 集合导出到 SQL Server 的最佳实践
Posted
技术标签:
【中文标题】将 mongo 集合导出到 SQL Server 的最佳实践【英文标题】:Best practices for exporting mongo collections to SQL Server 【发布时间】:2012-02-22 09:05:55 【问题描述】:我们使用 MongoDB(在 Linux 上)作为我们的主数据库。但是,我们需要定期(例如每晚)将一些集合从 Mongo 导出到 MS SQL 服务器以运行分析。
我正在考虑以下方法:
-
使用 mongodump 备份 Mongo 数据库(可能来自副本)
将数据库恢复到安装了 Mongo 的 Windows 机器中
编写一个定制的应用程序,将集合从 Mongo 导入 SQL(可能处理任何所需的规范化)。
在 Windows SQL Server 安装上运行分析。
还有其他“经过验证的”替代方案吗?
谢谢, 斯蒂法诺
编辑:对于第 4 点,分析将在 SQL Server 上运行,而不是 Mongo。
【问题讨论】:
你的步骤听起来不错。另一种选择是在原始机器上导入 mysql,执行 SQL 转储,然后在 windows 机器上导入 SQL(假设它们之间都是标准 SQL)。无论哪种方式都有效,取决于您是希望原始服务器上的 MySQL 还是目标服务器上的 Mongo。 【参考方案1】:总体看起来不错,但我可以建议两点:
-
跳过备份/恢复步骤,直接从 linux mongodb 读取数据,因为随着数据库的增长,备份/恢复数据库会越来越难。
代替定制应用使用Quartz.net 进行夜间导出,它易于使用并且可以解决任何其他计划任务。
我也可以建议研究cqrs and event sourcing 这样的新方法,这基本上可以避免导出任务。您可以实时处理消息并将数据存储到两个数据源(linux mongodb、windows sql server)中,延迟很小,甚至可以从消息中分析数据并存储在 mongodb 中。
【讨论】:
直接从实时实例读取数据会不会损害数据完整性(尤其是如果操作跨越几分钟)?如果在复制过程中数据发生了变化怎么办? @StefanoRicciardi:我看不出在读取数据时如何破坏数据完整性。即使你读了5天。数据在您阅读时发生更改也没关系,无论如何您都会对陈旧的数据进行分析。 事实上,我关心的是目标数据的完整性,而不是源数据的完整性。假设我正在清扫集合 A,其中项目 a 引用集合 B 中的项目 b。同时 b 从源中删除,当我准备复制集合 B 时,项目 b 不再存在。 只是补充一点,这个完整性问题似乎是由 mongodump 通过“--oplog”参数处理的,但我想知道如何通过从服务器实时读取来解决这个问题。 @StefanoRicciardi:我明白了。使用备份/恢复策略,您还可以破坏数据完整性,因为它不会锁定数据库。但是您可以在读取/备份数据时使用db.runCommand(fsync:1,lock:1)
来防止写入。或者最简单的解决方案是停止您的服务器。但我会选择另一种解决方案:如果某些a
项目b
不存在,您可以跳过它而不添加到sql 数据库。以上是关于将 mongo 集合导出到 SQL Server 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL Server 数据库导出到 sqlite(或 SQL Server Compact)的最佳方式