如何将数据从MS SQL迁移到PostgreSQL?

33

我已经搜索了一下,似乎找不到任何解决这个问题的方法。

最简单的从MS SQL Server 2005数据库移动数据到Postgres(8.x)安装的方法是什么?

我查看了几个工具,如“Full Convert Enterprise”等,它们都因为各种原因而失败,从奇怪的错误使其崩溃到插入空值而不是实际数据(wth?)。

我正在查看一个除了单个视图以外没有存储过程、函数等所有表的数据库。

目前我打算编写一个小工具来完成这个任务,但我不敢相信这是必要的。肯定有 某些东西 可以做到这一点,即使需要花费也没关系,虽然免费更好 :)


你可以使用我的答案:https://dev59.com/Bmw15IYBdhLWcg3whME1#70241329 - Simin Ghasemi
6个回答

42

我不知道为什么没有人提到最简单、最容易使用的方法,就是使用强大的MS SQL Server管理工具。

简单地说,您只需要使用内置的SSIS导入/导出功能。您可以按照以下步骤进行操作:

  1. 首先,您需要安装Windows版的PostgreSQL ODBC驱动程序。非常重要的是要安装与CPU架构(x86 / x64)相对应的正确版本。

  2. 在管理工具中,右键单击您的数据库: 任务 -> 导出数据

  3. 选择SQL Server本机客户端作为数据源。

  4. 选择.Net Framework ODBC数据提供程序作为目标驱动程序。

  5. 将连接字符串设置为以下形式的数据库:

    Driver={PostgreSQL ODBC Driver(UNICODE)};Server=;Port=;Database=;UID=;PWD=

  6. 在下一页中,您只需要选择要导出的表格。SQL Server将生成默认映射,您可以自由编辑它。可能会遇到一些类型不匹配的问题,需要花费一些时间来解决。例如,如果您在SQL Server中有一个布尔列,您应将其导出为int4。

Microsoft Docs提供了连接到PostgreSQL的ODBC详细说明。

PS:如果您想查看已安装的ODBC驱动程序,则需要通过ODBC数据源管理器进行检查。


3
是的,根据第一步骤所述,所选择的驱动程序架构(32位 vs 64位)非常重要。不知何故,我需要使用32位ODBC驱动程序才能从64位SQL Server管理工具中导出数据。我想它运行了一个仍是32位的外部导出工具。 - Jonas
2
谢谢,这比我尝试过的任何其他工具/方法都要好。我不得不更改驱动程序的名称。 - Laurence
2
这非常有帮助。对我来说,有几个需要注意的地方,可能对未来的观众有所帮助: 1)您需要为Postgres驱动程序添加数据源名称 2)确保您的数据源名称与设置的Drive = {your-data-source-name}的值匹配 - mohsen
6
现代驱动程序的名称已更改为“PostgreSQL Unicode”。 - Vertigo
3
这是我的工作配置的截图,供有兴趣的人参考。安装32位和64位ODBC驱动程序的版本似乎对我有所帮助。 - Rishi Latchmepersad
显示剩余5条评论

8

2
完美,这正是我一直在寻找的。我试用了一下,很喜欢,所以购买了完整版,现在它运行得非常好。对于那些不需要这个特定解决方案,但需要类似解决方案的人,他们提供了转换和同步MSSQL、Postgres、Oracle、MS Access、Firebird等工具。我只能谈论MSSQL/Postgres转换,但如果这些转换是任何迹象,这个软件包值得花79美元。 - Fred
@Milen A. Radev,+1 很棒! - Sarfaraz Makandar
警告!在使用试用版时,文本字段开头会添加%number%-TRIAL-%number%。 - Ashen One

5
您可以使用 MS DTS 功能(我认为在最新版本中更名为 SSIS)。 DTS 的一个问题是,在将数据加载到 pg 中时,我无法使其在每行之后提交。如果您只有几十万行左右的数据,那么这很好,但速度真的非常慢。

我通常会编写一个小脚本,以 CSV 格式将数据从 SQLServer 转储出来,然后在 PostgreSQL 端使用 COPY WITH CSV。

这两个方法仅处理数据。处理模式有点困难,因为数据类型不一定直接映射过去。但是,它可以与静态模式一起轻松地编写脚本。如果架构很简单(例如,只是 varchar/int 数据类型),则该部分也可以轻松地从 INFORMATION_SCHEMA 中的数据脚本化。


0

好的,对于MS SQL Server 2005,有.NET绑定(显然),也有针对PostgreSQL的绑定。因此,只需要几行代码就可以编写一个程序,安全地从一个数据库传输数据到另一个数据库。由于Postgres在视图方面使用的语言与SQL Server不同,所以视图可能需要手动完成。


是的,但这将需要大量维护以随着时间的推移保持更新,我更喜欢不需要每次DB模式更改时都要深入代码的东西。如果我要使它通用化,那么它就不像现在这么简单,因为我现在必须根据数据类型等做出决策。 - Fred
我认为没有简单的方法可走。请参考http://wiki.postgresql.org/wiki/Microsoft_SQL_Server_to_PostgreSQL_Migration_by_Ian_Harding,了解其中涉及的一些问题。在您的情况下,更有可能编写出能够正常工作的代码,而不是有人能够创建适用于所有情况的工具。 - Matthew Talbert

0
我在使用SSMS时遇到了一个问题,涉及到bit值(在SqlServer中是1/0,在PostgreSql中是true/false),所以我进行了搜索,并选择了DBeaver,它是免费的,可以自动映射表格和列,非常容易上手。在相对较小的表格(约100个表格,约2000万行)下,它的表现良好,不到30分钟。
然而,在大型表格(超过1000万行)和大量列的情况下,它可能会有些吃力。最终,我除了要处理的大表格外,一切都使用DBeaver,将其以CSV格式通过SSIS导出并通过COPY命令导入到PostgreSql中。此外,删除大表格上的PK、约束和索引,并在迁移后重新添加它们也有很大帮助。
如果您在Linux上运行PostgreSql,可以考虑使用FDW,它可以在不费力的情况下导入模式和数据。

0

这篇回答是为了帮助总结当前的连接字符串,因为有人可能会忽略评论。

当前版本的ODBC连接字符串为:

32位系统使用:

Driver={PostgreSQL UNICODE};Server=192.168.1.xxx;Port=5432;Database=yourDBname;Uid=postgres;Pwd=admin;

适用于64位系统

Driver={PostgreSQL UNICODE(x64)};Server=192.168.1.xxx;Port=5432;Database=yourDBname;Uid=postgres;Pwd=admin;

您可以通过在Windows搜索中键入ODBC并打开ODBC数据源管理器来检查驱动程序名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接