如何将远程SQL Server数据库备份到本地驱动器?


241

我需要将数据库从远程服务器复制到本地服务器。我尝试使用SQL Server Management Studio,但它仅备份到远程服务器上的驱动器。

一些要点:

  • 我无法以可以复制文件的方式访问远程服务器;
  • 我无权设置服务器的UNC路径;

关于如何复制此数据库的任何想法?我需要使用第三方工具吗?


1
我认为,如果您根本无法访问目录结构,那么尝试这样做将面临挑战。
JNK

3
您只是在尝试复制数据库,而不是专门备份它?如果是这样,则可以使用“复制数据库向导”或(在SQL Server 2008中)使用“生成脚本”选项来编写架构和数据的脚本。Redgate SQL比较和数据比较在这里也很有用。
马丁·史密斯

1
@MartinSmith根据您的建议,我使用Generate and Publish Scriptsoption 生成了脚本。我得到了所有的表和模式。但是我没有得到表的任何数据。我怎样才能解决这个问题。
我们真正的朋友

Answers:


182

在Microsoft SQL Server Management Studio中,您可以右键单击要备份的数据库,然后单击任务->生成脚本。

这会弹出一个向导,您可以在其中设置以下内容,以便即使在远程服务器上也可以执行数据库的体面备份:

  • 选择您要备份的数据库,然后单击下一步,
  • 在为您提供的选项中:
    1. 2010年:在“表格/视图选项”下,将“脚本数据”和“脚本索引”更改为True,然后点击下一步,
    2. 2012年:在“常规”下,将“数据类型为脚本”从“仅模式”更改为“模式和数据”
    3. 在2014年:现在,在步骤“设置脚本选项”中“隐藏”脚本数据的选项,您必须单击“高级”并将“脚本的数据类型”设置为“架构和数据”值
  • 在接下来的四个窗口中,点击“全选”,然后点击下一步,
  • 选择脚本编写新的查询窗口

完成任务后,您将准备好一个备份脚本。创建一个新的本地(或远程)数据库,并在脚本中更改第一个“ USE”语句以使用您的新数据库。将脚本保存在安全的地方,然后继续对新的空数据库运行脚本。这将为您创建一个(几乎)重复的本地数据库,然后您可以根据需要进行备份。

如果您具有对远程数据库的完全访问权限,则可以选择在向导的第一个窗口中检查“脚本所有对象”,然后在下一个窗口中将“脚本数据库”选项更改为True。请注意,您需要对脚本中的数据库名称执行完整搜索并将其替换为新数据库,在这种情况下,您无需在运行脚本之前创建数据库。这样可以创建更准确的副本,但由于权限限制,有时无法使用。


9
在SQL Server Management Studio 2012中,没有“脚本数据”之类的选项,因此在较新版本中,对步骤2执行以下操作:在“常规”下,将“数据类型为脚本”从“仅模式”更改为“模式”和数据”。
berezovskyi 2014年

1
我在SQL Server 2008 R2上对其进行了检查,它的工作原理很吸引人。为了将其用于备份策略,我需要自己做一些额外的工作,但是我认为这比使用RedGate等第三方工具要好。也许我有点偏执,但是我认为大多数第三方工具都有额外的代码,我会控制并减少脚本的简洁性和清晰度。非常感谢。
QMaster 2014年

2
@ShaunLuttin如果在第二步(2012年)中确保将“仅脚本类型的数据类型”从“仅模式”更改为“模式和数据”,则应显示INSERT语句。
丹尼尔·吉尔

6
在SSMS 2014中,当选择保存脚本的位置时,从“仅模式”更改为“模式和数据”的选项现在隐藏在“高级”后面。
MushinNoShin 2015年

2
当我尝试使用这种方法来运行一个脚本,我得到约SQL Server Management Studio中的erroor“内存不足,无法继续执行程序(mscorelib)。”
罗布

51

首先,使用“所有人”将完全控制权限授予您计算机上的本地路径(如下所示)。(或另选地授予对SQL Server代理帐户的权限)。

其次,执行以下操作:

BACKUP DATABASE [dev] TO  DISK = N'\\myMachine\c\dev.bak' WITH COPY_ONLY, INIT;

14
这就是问题的答案。这将“将远程SQL Server数据库备份到本地驱动器”,而不是“脚本表和数据”。某人:请将此答案标记为已接受,并删除Daniel Gill
Henrik HolmgaardHøyer

虽然我认为这是更好的答案,但该问题询问“关于如何复制此数据库的任何想法?” 没有专门的备份。
奥利弗·汤申

11
这假定远程计算机可以访问您的本地计算机文件,这不是一般情况。
安德斯·林登(AndersLindén)

希望我能多次投票给您。这是一个完美的答案,也是我多年来一直想做的事情。如此简单...如此完美。它不能解决世界上的所有情况,但是它对于我远程进入机器的我来说是完美的,但是对于具有SQL Server的机器来说却不是。
韦德·哈特勒

这对我也有帮助。只需与所有人临时共享本地文件夹,执行备份,然后禁用共享即可。我也认为这应该是正确的答案。
Fred Rogers

51

若要仅复制数据和架构(不复制存储过程,函数等),请使用SQL Server导入和导出向导,然后在选择目标数据库时选择“ 新建...”

右键单击数据库>任务>导入数据。

选择数据源

  • 数据源:SQL Server本机客户端
  • 服务器名称:远程服务器
  • 认证方式
  • 数据库:数据库名称

选择目的地

  • 数据源:SQL Server本机客户端
  • 服务器名称:本地服务器
  • 认证方式
  • 数据库New...

其余的很简单。


2
这对我来说比接受的答案要好得多。更清晰地处理表之间的关系。
MushinNoShin 2015年

7
威尔 不幸的是,它没有设置身份和默认约束。:(
MushinNoShin 2015年

1
这比生成脚本好得多。脚本有时可能很大。个人喜好。
无罪

这是更简单的方法,这是我要解决的问题,但是如果出于某些原因,您需要sys.tables中的object_id,create_data等列,按IS IS修改日期,只需记住它们将在创建时进行修改。
犯罪记录'18

@MushinNoShin您可以先生成脚本,然后通过在映射步骤中启用身份插入来导入/导出数据。
HasanG

29

无法创建从远程服务器到本地磁盘的备份-只是无法执行此操作。据我所知,也没有第三方工具可以执行此操作。

您所能做的就是在远程服务器计算机上创建备份,然后请有人将其压缩并发送给您。


5
我不同意。在许多情况下,您可以使用MS SQL Server Management Studio的“生成脚本”命令来创建一个脚本,该脚本可以运行以生成本地数据库,然后您可以根据需要进行处理。请参阅下面的我的答案或马丁·史密斯对此问题的评论。
Daniel Gill 2012年

19
@Rafid:是的-但是这是不是一个真正的备份 -这是一个脚本/数据导出.....
marc_s

2
@marc_s与导出的副本不同的“真实备份”有什么用?日志?还要别的吗?
德隆兹2012年

31
@Dronz:是的!脚本导出将重现表中的结构,甚至可能重现表中的数据-但它不能包含事务日志和统计信息以及SQL Server数据库的其他重要部分。
marc_s 2012年

1
@ShaunLuttin,可以包含数据。
Erwin Rooijakkers 2015年

17

我知道这是较晚的答案,但我必须对大多数投票的答案作出评论,说要在SSMS中使用“生成脚本”选项。

问题在于此选项不一定按正确的执行顺序生成脚本,因为它没有考虑依赖关系。

对于小型数据库,这不是问题,但是对于大型数据库,这当然是因为它需要手动重新排序该脚本。在500对象数据库上尝试一下;)

不幸的是,在这种情况下,唯一的解决方案是第三方工具。

我成功地使用了ApexSQL的比较工具(Diff和Data Diff)来完成类似的任务,但是您在这里提到的其他任何工具都不会出错,尤其是Red Gate。


1
我不同意,对我来说sql总是正确地排序相关性,您是否有一个具体示例来重现您提到的行为?
2013年

同样,也可以考虑将此问题考虑在内
Gaspa79,18年

13

您可以尝试SQLBackupAndFTP。它将创建脚本以创建数据库中的所有对象,并为表中的所有行创建INSERT语句。在任何数据库中,您都可以运行此脚本文件,然后将重新创建整个数据库。


4
第二。必须安装新版本的sql server management studio,并且无法像以前那样编写脚本。即使没有完全访问远程服务器的权限(appharbor sqlserver附加组件),该工具也可以快速解决问题,并且没有任何问题
Daniel Gill

1
请注意,该软件大量使用资源。
Dementic

除了是越野车之外,还不能完全确定这是否可以正常工作。可以通过PHP毫无问题地连接到远程服务器,但是不能吗?当我对服务器本身进行适当的设置时。如此...继续前进。
肖恩·雷贝洛

7

在此博客中获得有关如何复制远程数据库的描述:

从共享主机环境备份SQL Server 2008数据库


1
此方法说明了如何编写数据库结构的脚本,在本地创建数据库,然后使用SQL管理工具在本地数据库和远程数据库之间复制数据。
德鲁·诺阿克斯

1
您可以将“脚本数据”选项翻转为“真”,以便一次性编写数据脚本。
Daniel Gill 2012年

复制和备份是两件事。
安德斯·林登(AndersLindén)

这是完美的,因为我需要使用sql server 2012在2016年数据库上工作,而在2012年不能使用2016年备份
。– majjam

6

有99%的解决方案可将bak文件从远程sql服务器获取到您的本地pc。我在我的帖子http://www.ok.unsode.com/post/2015/06/27/remote-sql-backup-to-local-pc中描述了它

通常,它将如下所示:

  • 执行sql脚本以生成bak文件

  • 执行sql脚本以将每个bak文件插入具有varbinary字段类型的temp表中,并选择此行并下载数据

  • 重复上一个 处理bak文件的时间

  • 执行sql脚本以删除所有临时资源

就是这样,您在本地PC上有bak文件。


5

您可以使用复制数据库...右键单击远程数据库...选择任务并使用复制数据库...它将询问您有关源服务器和目标服务器的信息。您的源是远程的,目标是您的SQL Server的本地实例。

就这么简单


复制数据库需要SysAdmin特权。这不是数据库常规用户的解决方案。
Buggieboy

在我今天的文章中,我们的开发团队确实具有sysadmin特权。因此,我将使用Pouyan的方法。
Hammer的代码,2013年

但是我需要每天做一次,并且我需要脚本来完成此任务
澄清器


3

上面的答案是不正确的。即使有数据的SQL脚本也不是备份。备份是一个BAK文件,在其当前结构中包含完整数据库(包括indize)。

当然,可以在本地系统上检索包含所有数据的完整备份的BAK文件,以及来自远程SQL Server数据库的本地化文件。

可以使用商业软件完成此操作,以将备份BAK文件直接保存到本地计算机,例如,文件将直接从本地计算机上的远程SQL数据库创建备份。


您需要sysadmin权限才能执行此操作。
拉里·布德(LarryBud)2016年

对。用于远程连接到SQL Server实例的帐户(Windows或SQL Server)需要sysadmin权限才能检索备份垃圾并将其存储到本地计算机上。FIDA Software提到的工具在检索备份垃圾时,确实加密和压缩了往返SQL Server的网络流量。将bak文件保存在计算机上后,可以将其还原到所需位置。
马提亚斯(Matthias)

1

正如Martin Smith所说,如果您无权访问计算机或文件系统,则需要使用第三方工具(如Red Gate或Adept)在源系统和目标系统上进行比较。Red Gate的工具将允许您复制对象,模式和数据。


1

在满足以下条件的情况下,您可以采用一种从远程SQL Server实例向本地驱动器进行备份的方式:

  1. 您在本地驱动器上有一个共享文件夹。
  2. 可从“ SQL Server”框中访问共享文件夹。

现在,当指定备份命令时,在指定磁盘选项时使用共享文件夹路径。


您的答案与@Vivek的答案有何不同?
MartinSchröder13年

1

只需尝试以下一项:

1)在您的计算机中共享具有完全权限的文件夹

2)在您的SQL Server中:控制面板->管理工具->服务->右键单击所有SQL服务

在“登录”标签上时,应从您的域管理员开始

3)在sql server的维护向导中放置备份位置和文件夹(\ yourcomputername \ sharedfoldernam)

我在公司的sql server 2008的8服务器上进行了远程备份


1

我感到惊讶的是,没有人提到Ola Hallengren提供的脚本化备份解决方案,它绝对可以让您免费将数据库从远程服务器备份到网络上的UNC路径(我在键入时实际上正在使用它)从我没有远程访问权限的开发服务器(除了通过SSMS备份到我的开发PC上的共享)备份数据库)。自2008年以来一直可用,并且在SQL Server 2005到2014年之前均可使用。

您需要确保所设置的共享具有足够的访问权限:在备份过程中,我倾向于允许对“每个人” AD组进行完全读/写操作,因为我懒得找出任何限制性更高的内容,但这个人选择。

它被很好地使用,有据可查且非常灵活。我倾向于将proc和日志记录表放在他们自己的小实用程序数据库中,然后启动它。如果所有内容都位于您的AD域中,并且不是位于同一位置的服务器之类的东西上,那么它就不是远程的,这很好。

很抱歉添加到一个非常旧的线程,但是我在寻找其他内容时碰到了这一点,并认为这对于任何寻找此主题的人来说都是值得的。


1

对于2019年,如果您想要实际的本地备份,我建议使用mssql-scripter。是的,它是脚本,但是您可以对其进行调整以包括所需的任何内容,其中可以包含所有数据。我写了一个bash脚本来在Linux机器上使用它进行每日自动备份。查看我的要点:

https://gist.github.com/tjmoses/45ee6b3046be280c9daa23b0f610f407

0

我可以做一次...要执行此操作,您必须在远程服务器上打开一个共享。那么您可以将备份直接放在共享本身上,而不是默认位置上。

通常,管理员将备份并在一些共享文件夹中与我们共享。我试过将备份放在那儿是否行得通。有效。


0

如果在SSMS下使用“生成脚本”,请单击“高级”按钮。在“为从属对象生成脚本”选项下,单击“ True”。通过单击,每个对象的任何依存关系也将按照适当的顺序编写出来。


SSMS v17.8.1中的默认值为True。
克里斯·卡蒂尼亚尼

0

一些第三方备份程序允许设置具有特定网络权限的文件传输。当SQL Server服务在受限帐户下运行且没有足够的网络权限时,它非常有用。尝试使用EMS SQL Backup解决此任务。


0

为此,我使用Redgate Backup Pro 7工具。您可以在其他位置的创建磁贴中从备份文件创建镜像。并且可以在网络和主机存储上创建后自动复制备份文件。


0

创建具有“所有人”的读/写权限的本地共享文件夹

连接到目标数据库,开始备份并指向共享,如下所示

\ mymachine \ shared_folder \ mybackup.bak

(在Windows域环境中尝试)


0

我知道这是一篇较旧的文章,但是对于它的价值,我发现“最简单”的解决方案是仅右键单击数据库,然后选择“任务”->“导出数据层应用程序”。此选项可能仅因为服务器托管在Azure上才可用(从我以前记得使用Azure的情况来看,.bacpac格式在那很普遍)。

完成后,您可以右键单击本地服务器的“数据库”列表,然后使用“导入数据层应用程序”使用.bacpac文件将数据获取到本地计算机。

请记住,出口可能需要长时间。我大约花了两个小时才能完成出口。不过,导入零件要快得多。


-1

如果您在本地网络上,则可以共享本地计算机上的文件夹,并将其用作备份的目标文件夹。

例:

  • 本地文件夹:

    C:\MySharedFolder -> URL: \\MyMachine\MySharedFolder

  • 远程SQL Server:

    Select your database -> Tasks -> Back Up -> Destination -> Add -> Apply '\\MyMachine\MySharedFolder'

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.