是否可以在没有SQL Server的情况下还原SQL Server .bak文件?


16

我有一些.bak来自SQL Server 2005转储的大文件。

是否可以在不使用SQL Server的情况下将它们还原到PostgreSQL,MySQL或平面文本文件?

开源解决方案将是最有用的。


1
“我宁愿不必仅为此任务就这样做。” 为什么不?这是您要做的事情的方式。
swasheck 2012年

还原到其他东西是否有意义?您要如何处理结果数据?
Philᵀᴹ

1
@Phil我想将结果数据移动到PostgreSQL数据库,甚至平面文本文件。
2012年

1
@swasheck我删除了引号行,因为它似乎使问题困扰了。但是要回答您的问题,因为我不知道如何使用它,并且我的服务器运行Linux。可用的Windows笔记本电脑没有足够的空间。
2012年

2
好吧,这是我们以前没有的信息:)。感谢您提供额外的信息-我有一个计划
swasheck 2012年

Answers:


19

这是我的建议:

  1. 构建一个运行Windows的虚拟机,该虚拟机具有足够的磁盘空间来容纳备份。将备份文件复制到那里。如果您还没有构建虚拟机的能力,则可以使用Oracle VirtualBox之类的免费产品来实现
  2. 下载并安装SQL Server评估版。确保同时包括数据库引擎和“管理工具-完整”。
  3. 如果虚拟机有足够的空间来保存备份,但又没有足够的空间来还原备份,则可以使用Red-Gate的同名产品试用版执行“虚拟还原” (这使您可以与备份文件,就好像它已还原一样)。否则,以正常方式还原数据库

  4. 一旦数据库可用(通过正常还原或虚拟还原),您可以通过以下方式为架构和数据生成脚本:

    • 打开Management Studio并连接到您的实例。
    • 打开对象资源管理器。
    • 右键单击新还原的数据库,选择“任务”>“生成脚本...”。
    • 单击下一步,单击下一步
    • 在“选择脚本选项”页面上,向下滚动并将“脚本数据”设置为True
    • 点击下一步
    • 检查所有相关对象,然后单击“下一步”。
    • 检查所需的表,然后单击下一步
    • 选择脚本编写文件。现在,您将拥有一个使用SQL Server插入语法包含所有对象和数据的文件,您将不得不处理输出以使其以适用于Postgres的格式进行输出(我不愿意在语法上有任何细微的差别)。

另外,您可以尝试使用bcp实用程序将数据提取到CSV文件或类似文件中,但是您必须逐表执行此操作或使用一些巧妙的脚本(PowerShell,T-SQL,C#/ SMO等)。 )为您生成所有bcp命令。进入CSV文件后,将数据批量加载到Postgres中应该很简单(但是您仍然需要做一些工作来生成表)。

作为最后的建议,如果.bak文件不是巨大的,并且数据不是机密的,我非常愿意尝试以所需的格式为您生成文件。我有很多带有空间的Windows VM,挑战在于将.BAK文件放到可以检索它的地方-尤其是如果它大于大多数文件共享服务支持的位置。


+1我一到电脑就打算建议使用bcp方法。一些陷阱是表定界符,IDENTITY(序列,以pg为单位),nvarchar,仅举几例。否则,这就是我在编辑部分中所建议的(没有Red-Gate)。
swasheck 2012年

共有8个20GB的.bak文件,如果您可以提供帮助,那就太好了,但是请参阅有关gis.se,gis.stackexchange.com / q / 28281/3218gis.stackexchange.com/q/28257的相关问题/ 3218,有关USDA土壤数据库(SSURGO)。当前,很难以自动化方式使用这些数据进行仿真建模。使这些数据具有更有用的结构对科学将是一个很大的好处。您可以从我的服务器下载它。数据不是机密信息,任何人都可以从扩展代理那里以$ 50 / CD或$ 100 / DVD或更低的价格获得。
2012年

您似乎对如何在GIS.SE上获取数据有答案。我已经去看了那些站点,但是看不到它们指定该文件是SQL Server备份的位置。您如何/从哪里获得这些文件的?
swasheck 2012年

7

不幸的是,如果不深入了解文件本身的内部结构,就无法获得对.bak文件内容的访问。我可以想到这里的某个人可能不知道此信息,但我无法说出该人是否会告诉您如何去做

因此,您将需要安装一个SQL Server实例。您还需要确保该实例可以与Postgres服务器通信(使用pg_hba.conf进行清理)。一旦到达该位置,您就有几个不错的路径来迁移数据。

第一条路径是安装Postgres Windows ODBC驱动程序并建立与pg服务器的连接。然后,您可以使用SSIS编写数据迁移脚本。如果要采用这种方式,建议您在安装数据库服务器时安装SSIS。

另一个选项也涉及ODBC驱动程序连接,但是您可以在SQL Server中创建链接服务器,并通过SQL Server在pg实例上运行插入。我之前在这里已经回答了这个确切的问题,因此不难发现。

编辑

为了纳入Aaron的评论,一旦启动并运行SQL Server,您还可以通过多种不同方式将数据导出到平面文件中。如果您选择此路径,请告诉我,我将发布一些方法

编辑(2):

除非您要预先创建结构,否则链接服务器进程可能不是最佳方法。这是我的首选方法,但是通常我已经在两侧都设置了结构。

剩下的就是亚伦·伯特兰(Aaron Bertrand)的答案。请注意,除了数据类型(IDENTITYvs.之外SEQUENCENVARCHAR由于您在数据库本身上设置了编码,postgres一无所知)。Postgres一无所知CREATE CLUSTERED INDEXCLUSTER可能对您有用)。最后,由于我在注释中看到您将要使用空间数据,因此postgresql对CREATE SPATIAL INDEX语法一无所知。您需要安装postgis并使用INDEXTYPE关键字来创建空间索引。最后,请确保您正确处理架构。

长话短说:

  1. 使用Aaron Bertrand的方法生成脚本和数据(我可能会坚持使用表级)
  2. 记下索引DDL(如果它仍然有效),但不要包括它
  3. 一旦结构和数据到位,就在postgres上创建索引

3
我认为您不需要配置SQL Server与Postgres进行对话。我确定一旦安装了SQL Server,您就可以将数据提取为Postgres可以理解的多种格式。
亚伦·伯特兰

道歉。我的意思是,您需要将Postgres配置为接受外部连接(在这种情况下为SQL Server)
swasheck

不要道歉 :-)我只是澄清,你不需要有SQL Server的讨论是直接到Postgres的,反之亦然..
阿龙贝特朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.