我有一个PostgreSQL数据库,我想迁移到SQL Server - 模式和数据。我很穷,所以我不想支付任何钱。我也很懒,所以我不想做很多工作。目前我按桌子做这张桌子,大约有100张桌子。这是非常乏味的。将PostgreSQL数据库迁移到SQL Server的最简单方法
是否存在某种我想要的技巧?
我有一个PostgreSQL数据库,我想迁移到SQL Server - 模式和数据。我很穷,所以我不想支付任何钱。我也很懒,所以我不想做很多工作。目前我按桌子做这张桌子,大约有100张桌子。这是非常乏味的。将PostgreSQL数据库迁移到SQL Server的最简单方法
是否存在某种我想要的技巧?
我相信你可能因为从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,只能采用其他方式。有些事情,我希望是一个问题,但是(当然,不是一个详尽的列表):
DEFAULT
一个NOT NULL INTEGER
场链接到SEQUENCE
自动递增领域。在SQL Server中,这是一个IDENTITY
列,但它们并不完全相同。我不确定它们是否相同,但是如果您的原始模式中充满了“id”字段,您可能会遇到一些麻烦。我不知道SQL Server是否有CREATE SEQUENCE
,所以你可能不得不删除这些。CREATE FUNCTION
语句并手动翻译算法。pg_dump
有一个选项--encoding=
,可以让你设置一个特定的编码。我似乎回想起Windows倾向于使用双字节,UTF-16编码用于Unicode,其中PostgreSQL使用UTF-8。由于UTF-16的输出,我从SQL Server到PostgreSQL有一些问题,所以值得研究。TEXT
只是一个没有最大长度的VARCHAR
。在SQL Server中,TEXT
...很复杂(并且已弃用)。需要针对适当的SQL Server数据类型对原始模式中声明为TEXT
的每个字段进行审核。UNICODE
数据的额外数据类型。我不太熟悉它提出建议。我只是指出这可能是一个问题。非常棒的信息。非常感谢。在没有商业产品的情况下转换模式的任何提示?我也被困在这里。 – Hut8
更多细节补充。请注意,我还修复了pg_dump命令的数据版本以添加关键选项: - 仅限数据。 –
我发现了一个更快,更简单的方法来实现这一点。
首先你的表(或查询)复制到一个制表符分隔的文件,像这样:
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并不稳定。
我必须问,如果你没有钱,你为什么要转向SQL Server?虽然Express可能是免费的,但部署它所需的基础设施将不会... –
这些降价是愚蠢的;这是一个完全合法的问题,MS SQL - > MySQL迁移问题已经在这里提出。我正在转向SQL Server,因为我已经拥有了一个MS SQL数据库,但我可以使用的许多有价值的数据仅存在于PostgreSQL数据库中。对于大多数服务器托管的价格大致相同,我喜欢ASP.NET MVC 3,因为它没有第三方附加组件。 LINQ to SQL对PostgreSQL来说是一片光明。 – Hut8
在SQL Server上使用pg_dump SQL方法和导入DDL/DML遇到了哪些问题? “我按桌子做这张桌子”是什么意思? –