将 PostgreSQL 数据库迁移到 MS SQL 2005 的最佳工具?

EMP*_*EMP 8 postgresql migration sql-server

我在 PostgreSQL 8.3.1 中有一个数据库,我想将其迁移到 MS SQL Server 2005(或 2008),包括表架构和数据。数据库大小约为 50GB,大约有 400,000,000 行,所以我认为简单的 INSERT 语句是不可能的。有人可以推荐执行此迁移的最佳工具吗?显然它需要可靠,因此目标数据库中的数据与源数据库中的数据完全相同,并且需要能够在合理的时间内复制这一数量的数据。

小智 6

如果您在 SQL 2005 机器上安装了适当的 Postgres 支持驱动程序(或希望通过 ODBC 使用 Postgres,或希望将 Postgres 中的数据转储到文件并从中导入),您可以在 SQL Server 中使用导入/导出向导为了复制数据。这将询问您各种问题,然后使用适当的批量插入操作将导入作​​为 SQL Server Integration Services (SSIS) 包作业执行。

但是,如果该向导不是一个选项,那么值得考虑的是,尽管您有大量行,但各行的平均大小小于 135 字节,并且提供了足够的事务日志空间以允许 50 GB 的事务发生 '简单的插入语句本身并不是不可能的。


EMP*_*EMP 6

我最终没有使用任何第三方工具来处理数据,因为我尝试过的工具都不适用于大表。甚至 SSIS 也失败了。不过,我确实为模式使用了商业工具。所以我的转换过程如下:

  1. Full Convert Enterprise以复制架构(无数据)。
  2. pg_dump以“纯文本”格式从 Postgres 导出数据,它基本上是一个制表符分隔值 (TSV) 文件。
  3. 将导出的文件转换为 bcp 能够理解的格式的 Python 脚本。
  4. 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 中被违反了,所以我不得不放弃它们。这是因为 NULL=NULL 在 MSSQL 中(即 NULL 被视为唯一值),而不是在 Postgres 中。