【问题标题】:How to migrate a PostgreSQL database into a SQLServer one?如何将 PostgreSQL 数据库迁移到 SQLServer 数据库?
【发布时间】:2011-09-27 16:13:42
【问题描述】:

我有一个 PostgreSQL 数据库,我想将它迁移到 SQL Server —— 架构和数据。我很穷,所以我不想付任何钱。我也很懒,所以我不想做太多的工作。目前我正在逐表做这个,大约有100个表要做。这是非常乏味的。

有什么技巧可以满足我的要求吗?

【问题讨论】:

  • 我必须问,如果你没有钱,为什么要迁移到 SQL Server?虽然 Express 可能是免费的,但部署它所需的基础设施不会......
  • 这些反对票是愚蠢的;这是一个完全合法的问题,并且 MS SQL -> MySQL 迁移问题已在此处获得支持。我正在迁移到 SQL Server,因为我已经有一个 MS SQL 数据库,但我可以使用的许多有价值的数据只存在于 PostgreSQL 数据库中。大多数服务器的托管价格大致相同,我喜欢 ASP.NET MVC 3,因为它没有第三方附加组件。 LINQ to SQL 与 PostgreSQL 很不一样。
  • 在 SQL Server 上使用 pg_dump SQL 方法和导入 DDL/DML 遇到什么问题? “我正在逐桌做这个”是什么意思?

标签: sql-server database postgresql migration


【解决方案1】:

您可以使用 Navicate 一个强大的 GUI 工具来处理各种数据库,包括 Postgres 和 SQL Server。 您可以轻松地传输架构和数据,如下所示:

  1. 为源数据库和目标数据库创建两个连接

  1. 转到工具 -> 数据传输

选择源数据库和目标数据库及其 IP、数据库名称和架构

正如你在选项中看到的,如果目标表不存在,它将创建

Tada,将我的 63 个表及其数据从 Postgres 传输到 SQL Server 需要 10 分钟。

尽情享受吧!

【讨论】:

    【解决方案2】:

    您应该能够在此 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 语句,并且应该兼容。

    编辑:关于转换架构的建议如下:

    我将从转储架构开始,但删除与所有权或权限有关的任何内容。这应该足够了:

    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,所以您可能需要删除它们。
    • 数据库函数/存储过程不会在 RDBMS 平台之间转换。您需要删除所有 CREATE FUNCTION 语句并手动翻译算法。
    • 注意数据文件的编码。我是 Linux 人,所以我不知道如何在 Windows 中验证编码,但您需要确保 SQL Server 期望的内容与您从 PostgreSQL 导入的文件相同。 pg_dump 有一个选项 --encoding= 可以让您设置特定的编码。我似乎记得 Windows 倾向于对 Unicode 使用两字节的 UTF-16 编码,而 PostgreSQL 使用 UTF-8。由于 UTF-16 输出,我在从 SQL Server 到 PostgreSQL 的过程中遇到了一些问题,因此值得研究。
    • PostgreSQL 数据类型TEXT 只是一个没有最大长度的VARCHAR。在 SQL Server 中,TEXT 很复杂(并且已弃用)。原始架构中声明为 TEXT 的每个字段都需要针对适当的 SQL Server 数据类型进行审核。
    • SQL Server 为UNICODE 数据提供了额外的数据类型。我对它不够熟悉,无法提出建议。我只是指出这可能是个问题。

    【讨论】:

    • 很棒的信息。非常感谢。关于在没有商业产品的情况下转换模式的任何提示?我也被难住了。
    • 添加了更多细节。请注意,我还修复了 pg_dump 命令的数据版本以添加关键选项:--data-only。
    【解决方案3】:

    我找到了一种更快、更简单的方法来完成这项工作。

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

    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 是不稳定的。

    【讨论】:

      猜你喜欢
      • 2022-12-19
      • 2011-07-16
      • 2016-12-05
      • 2020-05-09
      • 2016-09-04
      • 2020-06-01
      • 2016-06-22
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多