![将 PostgreSQL 数据库迁移到 MS SQL 2005 的最佳工具是什么?](https://linux22.com/image/493643/%E5%B0%86%20PostgreSQL%20%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E5%88%B0%20MS%20SQL%202005%20%E7%9A%84%E6%9C%80%E4%BD%B3%E5%B7%A5%E5%85%B7%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我在 PostgreSQL 8.3.1 中有一个数据库,我想将其迁移到 MS SQL Server 2005(或者可能是 2008),包括表架构和数据。该数据库大小约为 50GB,约有 400,000,000 行,所以我认为简单的 INSERT 语句是不可能的。有人可以推荐执行此迁移的最佳工具吗?显然,它需要可靠,因此目标数据库中的数据与源数据库中的数据完全相同,并且它需要能够在合理的时间内复制此量的数据。
答案1
我最终没有使用任何第三方工具来处理数据,因为我尝试过的所有工具都无法处理大型表。甚至 SSIS 也失败了。不过,我确实使用了一个商业工具来处理架构。所以我的转换过程如下:
- 完全转换企业复制模式(无数据)。
- pg_dump以“纯文本”格式从 Postgres 导出数据,这基本上是一个制表符分隔值 (TSV) 文件。
- Python 脚本将导出的文件转换为 bcp 可以理解的格式。
- 支助和协调局将数据导入MSSQL。
转换步骤处理了 pg_dump 和 bcp 使用的格式的一些差异,例如:
- pg_dump 将一些 Postgres 特定的内容放在文件开头,并以“。”结束数据,而 bcp 则期望整个文件包含数据
- pg_dump 将 NULL 值存储为“\N”,而 bcp 不需要用任何内容代替 NULL(即,列分隔符之间没有数据)
- pg_dump 将制表符编码为“\t”,将换行符编码为“\n”,而 bcp 则按字面意思处理它们
- pg_dump 始终使用制表符和换行符作为分隔符,而 bcp 允许用户指定分隔符。如果数据包含任何制表符或换行符,则这很有必要,因为它们未经编码。
我还发现,一些在 Postgres 中没有问题的唯一约束在 MSSQL 中被违反了,所以我不得不删除它们。这是因为在 MSSQL 中 NULL=NULL(即 NULL 被视为唯一值),但在 Postgres 中不是这样。
答案2
如果您在 SQL 2005 机器上安装了适当的 Postgres 支持驱动程序(或者希望通过 ODBC 使用 Postgres,或者希望将数据从 Postgres 转储到文件并从中导入),则可以使用 SQL Server 中的导入/导出向导来复制数据。这将询问您各种问题,然后使用适当的批量插入操作将导入作为 SQL Server Integration Services (SSIS) 包作业执行。
但是如果该向导不是一个选项,那么值得考虑的是,尽管您有大量的行,但每个行的单独大小平均小于 135 字节,并且有足够的事务日志空间来允许 50 GB 的事务发生“简单插入”语句本身并不是不可能。
答案3
就是这样 :) 不幸的是,它有点贵。
答案4
近 10 年过去了,这仍然不是一个直接的问题。我最终找到了一个混合解决方案,我通过使用以下命令导出架构和表/列注释来推出自己的架构映射器:
pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql
然后,我编写了一个 PHP 脚本,将模式转换为 T-SQL。随后,我使用以下第三方软件进行实际的行导入(无关联):
http://www.convert-in.com/pgs2mss.htm
虽然有点慢,但目前为止还不错。我们的数据库比你的小,只有 15GB,但那个工具似乎处理得很好。这也是我能找到的最便宜的,大约 50 美元。到目前为止,这是一项值得的投资。