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


8

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


4
只是出于好奇:您为什么要这么做?
wzzrd

我想您是出于某些其他原因而不仅仅是Windows功能而移至Windows服务器?我希望:)
沃伦

Answers:


6

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

  1. 完全转换企业以复制架构(无数据)。
  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则允许用户指定分隔符。如果数据包含任何制表符或换行符,则这是必要的,因为它们未进行编码。

我还发现在MSSQL中违反了一些在Postgres中很好的独特约束,所以我不得不放弃它们。这是因为在MSSQL中NULL = NULL(即NULL被视为唯一值),但在Postgres中却没有。


这是一个SQL-Server怪癖。代替唯一约束,您需要设置过滤的唯一INDEX(WHERE column_name IS NOT NULL)。
2015年

您带给我一个我说服老板购买的工具。令人敬畏的#FullConvert
戴维·大卫

6

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

但是,如果没有该向导,则值得考虑的是,尽管您有大量的行,但平均每个行的大小小于135字节,并且有足够的事务日志空间来允许进行50 GB的事务'简单插入语句本身并不是不可能的。


1
如果最终要导出数据然后导入到SQL Server,请考虑使用BCP(它是SQL Server附带的实用程序)。但是,如果只想直接从PG服务器上使用SSIS,则是个好主意,但可能会给您带来日志麻烦。
ColtonCat

SSIS软件包听起来很有希望,我尝试了一下,但不幸的是它用完了内存并失败了。:(错误[HY000]读取元组时内存不足。;执行查询时出错(PSQLODBC35W.DLL)
EMP


0

将近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美元。到目前为止,这是值得的投资。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.