从Postgres迁移到SQL Server 2008

时间:2010-09-14 16:46:20

标签: sql-server postgresql ssis data-migration

我需要将数据库从Postgres 7迁移到SQL Server 2008.我熟悉SSIS导入和导出向导,但我对如何定义数据源或定义数据提供程序感到困惑。

将Postgres迁移到SQL Server的最佳方法是什么,如何为postgres定义数据源/驱动程序?

4 个答案:

答案 0 :(得分:10)

祝您使用SQL Server导入和导出向导尝试从PostgreSQL导入SQL Server,祝您好运。但是,我已经阅读了许多留言板线程,人们无法使其工作。例如:

以下是我在该主题中找到的最有用的主题:


帮助那些可能尝试实现与我类似目标的人。而不是在SQL Server导入和导出向导的数据源下拉菜单中选择“PostgreSQL OLE DB提供程序”,选择“.Net Framework Data Provider for Odbc”

然后你必须创建一个DSN并提供一个ConnectionString。以下ConnectionString为我工作

驱动器= {的PostgreSQL};服务器=本地主机;端口= 5432;数据库= TestMasterMap; UID = postgres的; PWD =;

要制作DSN,您必须进入管理工具→数据源(ODBC)并创建用户DSN。完成此操作后,您可以在SQL Server导入和导出向导的DSN文本框中提供DSN名称。


一位评论者声称它有效,但他在大桌子上出现“读取元组时内存不足”的错误。因此,对于行数超过300万的表,他必须将导入分为300万行。

此外,该帖子中还有一个link to the native .NET provider for PostgreSQL

就个人而言,如果这只是我必须做的一次,如果我理解架构和数据相当好,我会尝试:

  1. 将PostgreSQL中的数据导出为平面文件
  2. 在SQL Server中创建架构(没有PK或约束)
  3. 使用SSIS导入/导出向导导入平面文件
  4. 然后创建PK和必要的约束
  5. 除了乱用SSIS导入/导出向导和PostgreSQL几天之外,你可能需要花费更少的时间来完成上述操作(但如果这些工具有用的话会很好!)

答案 1 :(得分:4)

我在使用SQL Server 2008 R2中的导入向导从PostgreSQL导入表时遇到问题。我安装了PostgreSQL ODBC驱动程序,因此对于导入向导中的数据源,我为Odbc"选择了#Net; .Net Framework数据提供程序。并为我的PostgreSQL数据库提供了DSN名称。向导发现表格没问题,但是当我去执行导入时我得到了错误

  

无法检索源数据和目标数据的列信息。

     

“结算” - > [DBO] [帐单]:

     

- 找不到列-1。

我在Microsoft博文here中找到了该解决方案。显然问题是各种ODBC驱动程序在报告列元数据时使用不同的属性名称。为了使导入工作,我必须编辑" ProviderDescriptors.xml"文件,位于

C:\ Program Files \ Microsoft SQL Server \ 100 \ DTS \ ProviderDescriptors \ ProviderDescriptors.xml

在...中

  
<header id="header" class="header-transparent">
  <ul id="navbar">
    <li>home</li>
    <li>business</li>
    <li>technical</li>
    <li>about us</li>
    </ul>
  </header>

<!--<header id="header-colored">
  <ul id="navbar">
    <li>home</li>
    <li>business</li>
    <li>technical</li>
    <li>about us</li>
    </ul>
  </header>-->
<div>
  More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content More content
</div>

...元素我不得不改变......的属性

<dtm:ProviderDescriptor SourceType="System.Data.Odbc.OdbcConnection">

...到......

<dtm:ColumnSchemaAttributes
    NameColumnName = "COLUMN_NAME"
    OrdinalPositionColumnName="ORDINAL_POSITION"
    DataTypeColumnName = "TYPE_NAME"
    MaximumLengthColumnName = "COLUMN_SIZE"
    NumericPrecisionColumnName = "COLUMN_SIZE"
    NumericScaleColumnName = "DECIMAL_DIGITS"
    NullableColumnName="NULLABLE"
    NumberOfColumnRestrictions="4"
/>

也就是说,我必须将<dtm:ColumnSchemaAttributes NameColumnName = "COLUMN_NAME" OrdinalPositionColumnName="ORDINAL_POSITION" DataTypeColumnName = "TYPE_NAME" MaximumLengthColumnName = "LENGTH" NumericPrecisionColumnName = "PRECISION" NumericScaleColumnName = "SCALE" NullableColumnName="NULLABLE" NumberOfColumnRestrictions="4" /> MaximumLengthColumnNameNumericPrecisionColumnName属性值调整为NumericScaleColumnName"LENGTH""PRECISION"分别。

完成更改后,从PostgreSQL到SQL Server的导入成功运行。

答案 2 :(得分:1)

当我完成对上述答案的评论时,我想到了SQL WorkbenchJ;它有一个数据泵功能,对我来说非常好。我设法将数据从PostgreSQL数据库导出到SQL服务器实例。

那些希望以批处理模式(通过shell)运行此操作的人,请按照以下步骤操作:Google Groups Thread。讨论中提到的WbCopy命令并没有真正记录在我能找到的任何地方,但您可以通过数据泵接口生成一个,然后根据需要进行更改。

答案 3 :(得分:0)

给出一个更实际的例子,说明如何实现标记答案中描述的内容;您可以从PostgresQL导出到平面文件,然后使用bcp Utility导入SQL Server。 例如在.bat文件中,对于单个表(并且您已经在目标SQL DB中创建了该表):

@echo off

set DbName=YOUR_POSTGRES_DB_NAME
set csvpath=C:\PATH_TO_CSV\CSV_NAME.csv
set username=YOUR_POSTGRES_DB_USERNAME

:: Export to CSV, note we're using a ~ delimiter to avoid issues with commas in fields
psql -U %username% -d %DbName% -c "COPY (select * from SOURCE_TABLE_NAME) TO STDOUT (FORMAT CSV, HEADER TRUE, DELIMITER '~', ENCODING 'UTF8');" > %csvpath%

:: Import CSV to SQL Server
set logpath=C:\bcplog.txt
set errorlogpath=C:\bcperrors.txt
set sqlserver=YOUR_SQL_SERVER
set sqldb=YOUR_DB_NAME

:: page code 65001 = UTF-8
bcp DESTINATION_TABLE_NAME IN %csvpath% -t~ -F1 -c -C65001 -S %sqlserver% -d %sqldb% -T -o %logpath% -e %errorlogpath%