将PostgreSQL数据库迁移到SQL Server最简单的方法之一

我有一个PostgreSQL数据库,我想移动到SQL Server – 架构和数据。 我很穷,所以我不想付任何钱。 我也很懒,所以我不想做太多的工作。 目前我按桌子做这张桌子,大约有100张桌子。 这是非常乏味的

有什么我想要的技巧吗?

我相信你可能因为从PostgreSQL生成一个简单的SQL脚本,理论上可以重新运行几乎所有的DBMS而简单易行,因而得到了低票。 如果你是普通的PostgreSQL用户,这听起来像一个愚蠢的问题。

这是不公平的,因为事实certificate这实际上是一个中等难度的问题(尽pipe更多的是由于SQL Server的奇怪的语法和界面比任何PostgreSQL的失败)。

你应该能够find一些有用的信息在这个Serverfault页面接受的答案: https ://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005年 。

如果您可以在不使用数据的情况下转换模式,则可以使用以下命令缩短数据的步骤:

pg_dump --data-only --column-inserts your_db_name > data_load_script.sql 

这个加载将会非常慢,但是--column-inserts选项会为每一行数据生成最通用的INSERT语句,并且应该是兼容的。

编辑:转换模式的build议如下:

我将首先转储模式,但删除所有权或权限。 这应该够了:

 pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql 

编辑这个文件来添加行BEGIN TRANSACTION; 到开始和ROLLBACK TRANSACTION; 到最后。 现在您可以加载它并在SQL Server的查询窗口中运行它。 如果出现任何错误,请确保您转到文件底部,突出显示ROLLBACK语句并运行它(在语句突出显示时按F5键)。

基本上,你必须解决每个错误,直到脚本运行干净。 然后,您可以将ROLLBACK TRANSACTION更改为COMMIT TRANSACTION并最后一次运行。

不幸的是,我不能帮助你看到哪些错误,因为我从来没有从PostgreSQL转到SQL Server,只能反过来。 (但显然,这并不是一个详尽的列表):

  • PostgreSQL通过使用DEFAULTNOT NULL INTEGER字段链接到SEQUENCE来自动增加字段。 在SQL Server中,这是一个IDENTITY列,但它们并不完全一样。 我不确定它们是否相同,但是如果你的原始模式充满了“id”字段,你可能会遇到一些麻烦。 我不知道SQL Server是否有CREATE SEQUENCE ,所以你可能不得不删除这些。
  • 数据库function/存储过程不会在RDBMS平台之间转换。 您将需要删除任何CREATE FUNCTION语句并手动翻译algorithm。
  • 请注意数据文件的编码。 我是一个Linux人员,所以我不知道如何在Windows中validation编码,但是您需要确保SQL Server所期望的与您从PostgreSQL导入的文件相同。 pg_dump有一个选项--encoding=可以让你设置一个特定的编码。 我似乎还记得,Windows倾向于使用双字节的UTF-16编码用于Unicode,其中PostgreSQL使用UTF-8。 由于UTF-16的输出,我从SQL Server到PostgreSQL有一些问题,所以值得研究。
  • PostgreSQL数据typesTEXT只是一个没有最大长度的VARCHAR 。 在SQL Server中, TEXT是…复杂的(并且被弃用)。 原始模式中声明为TEXT每个字段都需要针对相应的SQL Server数据types进行审阅。
  • SQL Server具有用于UNICODE数据的额外数据types。 我不太熟悉它提出build议。 我只是指出这可能是一个问题。

我发现了一个更快,更简单的方法来完成这一点。

首先复制你的表(或查询)到一个制表符分隔的文件,如下所示:

 COPY (SELECT siteid, searchdist, listtype, list, sitename, county, street, city, state, zip, georesult, elevation, lat, lng, wkt, unlocated_bool, id, status, standard_status, date_opened_or_reported, date_closed, notes, list_type_description FROM mlocal) TO 'c:\SQLAzureImportFiles\data_script_mlocal.tsv' NULL E'' 

接下来,你需要在SQL中创build你的表,这不会为你处理任何模式。 模式必须按照字段顺序和数据types匹配导出的tsv文件。

最后你运行SQL的bcp工具来引入tsv文件,如下所示:

 bcp MyDb.dbo.mlocal in "\\NEWDBSERVER\SQLAzureImportFiles\data_script_mlocal.tsv" -S tcp:YourDBServer.database.windows.net -U YourUserName -P YourPassword -c 

我遇到的一些注意事项。 Postgres和SQL Server处理布尔字段的方式不同。 您的SQL Server架构需要将您的布尔字段设置为varchar(1),结果数据将为“f”,“t”或null。 然后你将不得不把这个领域转换一下。 做一些事情:

 ALTER TABLE mlocal ADD unlocated bit; UPDATE mlocal SET unlocated=1 WHERE unlocated_bool='t'; UPDATE mlocal SET unlocated=0 WHERE unlocated_bool='f'; ALTER TABLE mlocal DROP COLUMN unlocated_bool; 

另一件事情是两个平台之间的地理/几何领域是非常不同的。 使用ST_AsText(geo)将几何字段导出为WKT,并在SQL Server端适当地进行转换。

可能会有更多的不兼容需要调整这样的。

编辑。 所以,虽然这种技术在技术上是行得通的,但我试图从100个以上的表格向SQL Azure和bcp传输数百万条logging到SQL Azure,结果相当不错。 我一直得到间歇性无法打开BCP主机数据文件错误,服务器间歇性超时,出于某种原因某些logging没有传输,没有任何错误或问题的迹象。 所以这种技术对于将大量数据传输到Azure SQL并不稳定。