2011-07-03 194 views
42

我有一个PostgreSQL数据库,我想迁移到SQL Server - 模式和数据。我很穷,所以我不想支付任何钱。我也很懒,所以我不想做很多工作。目前我按桌子做这张桌子,大约有100张桌子。这是非常乏味的。将PostgreSQL数据库迁移到SQL Server的最简单方法

是否存在某种我想要的技巧?

+2

我必须问,如果你没有钱,你为什么要转向SQL Server?虽然Express可能是免费的,但部署它所需的基础设施将不会... –

+8

这些降价是愚蠢的;这是一个完全合法的问题,MS SQL - > MySQL迁移问题已经在这里提出。我正在转向SQL Server,因为我已经拥有了一个MS SQL数据库,但我可以使用的许多有价值的数据仅存在于PostgreSQL数据库中。对于大多数服务器托管的价格大致相同,我喜欢ASP.NET MVC 3,因为它没有第三方附加组件。 LINQ to SQL对PostgreSQL来说是一片光明。 – Hut8

+0

在SQL Server上使用pg_dump SQL方法和导入DDL/DML遇到了哪些问题? “我按桌子做这张桌子”是什么意思? –

回答

43

我相信你可能因为从PostgreSQL生成一个简单的SQL脚本非常容易而得到反对票,理论上可以在任何DBMS上运行它。如果一个是普通的PostgreSQL用户,那么听起来像一个愚蠢的问题

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

您应该能够在此服务器默认页面的接受答案中找到一些有用的信息: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语句,并且应该是兼容的。

编辑:有关转换模式的建议如下:

我会被倾销的模式,但是,消除任何有所有权或权限做开始。这应该是足够了:

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里面使用DEFAULT一个NOT NULL INTEGER场链接到SEQUENCE自动递增领域。在SQL Server中,这是一个IDENTITY列,但它们并不完全相同。我不确定它们是否相同,但是如果您的原始模式中充满了“id”字段,您可能会遇到一些麻烦。我不知道SQL Server是否有CREATE SEQUENCE,所以你可能不得不删除这些。
  • 数据库函数/存储过程不会在RDBMS平台之间进行转换。您需要删除任何CREATE FUNCTION语句并手动翻译算法。
  • 请注意数据文件的编码。我是一名Linux员工,所以我不知道如何在Windows中验证编码,但是您需要确保SQL Server所期望的与您从PostgreSQL导入的文件相同。 pg_dump有一个选项--encoding=,可以让你设置一个特定的编码。我似乎回想起Windows倾向于使用双字节,UTF-16编码用于Unicode,其中PostgreSQL使用UTF-8。由于UTF-16的输出,我从SQL Server到PostgreSQL有一些问题,所以值得研究。
  • PostgreSQL数据类型TEXT只是一个没有最大长度的VARCHAR。在SQL Server中,TEXT ...很复杂(并且已弃用)。需要针对适当的SQL Server数据类型对原始模式中声明为TEXT的每个字段进行审核。
  • SQL Server具有用于UNICODE数据的额外数据类型。我不太熟悉它提出建议。我只是指出这可能是一个问题。
+0

非常棒的信息。非常感谢。在没有商业产品的情况下转换模式的任何提示?我也被困在这里。 – Hut8

+0

更多细节补充。请注意,我还修复了pg_dump命令的数据版本以添加关键选项: - 仅限数据。 –

1

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

首先你的表(或查询)复制到一个制表符分隔的文件,像这样:

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你的表,这将不会办理任何模式为您服务。架构必须按照字段顺序和数据类型匹配导出的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传输数百万条记录到SQL Azure,结果非常糟糕。我一直处于间歇状态无法打开BCP主机数据文件错误,服务器间歇性地超时,出于某种原因某些记录没有传输,没有任何错误或问题的迹象。所以这种技术对于将大量数据传输到Azure SQL并不稳定。

相关问题