ChatGPT解决这个技术问题 Extra ChatGPT

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

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

几点:

我无法以复制文件的方式访问远程服务器;

我无权设置我的服务器的 UNC 路径;

关于如何复制此数据库的任何想法?我必须使用 3rd 方工具吗?

我认为,如果您根本无法访问目录结构,那么您将面临挑战。
您只是想复制数据库而不是专门备份它?如果是这样,您可以使用复制数据库向导或(在 SQL Server 2008 中)使用“生成脚本”选项为架构和数据编写脚本。 Redgate SQL 比较和数据比较在这里也很有用。
@MartinSmith 根据您的建议,我使用 Generate and Publish Scripts 选项生成了脚本。我得到了所有的表格和架构。但是我没有得到任何表格数据。我怎样才能解决这个问题。

M
Michal Hosala

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

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

选择您要备份的数据库并点击下一步,

在它呈现给您的选项中:2010 年:在表/视图选项下,将“脚本数据”和“脚本索引”更改为 True,然后点击下一步,2012 年:在“常规”下,将“数据类型更改为脚本”从 'Schema only' 到 'Schema and data' 2014 年:脚本数据的选项现在在“设置脚本选项”步骤中“隐藏”,您必须单击“高级”并设置“脚本的数据类型”到“架构和数据”值

2010 年:在表/视图选项下,将“脚本数据”和“脚本索引”更改为 True,然后点击下一步,

2012 年:在“General”下,将“Types of data to script”从“Schema only”更改为“Schema and data”

2014 年:脚本数据的选项现在在“设置脚本选项”步骤中“隐藏”,您必须单击“高级”并将“脚本的数据类型”设置为“架构和数据”值

在接下来的四个窗口中,点击“全选”,然后点击下一步,

选择脚本到一个新的查询窗口

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

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


在 SQL Server Management Studio 2012 中没有“脚本数据”这样的选项,因此在较新的版本中,对步骤 2 执行以下操作:在“常规”下,将“数据类型到脚本”从“仅架构”更改为“架构”和数据”。
我在 SQL Server 2008 R2 上检查了它,它的工作原理很迷人。将其用于备份策略需要我自己做一些额外的工作,但我认为比使用 RedGate 等第三方工具要好。也许我有偏执狂,但我认为大多数第三方工具都有额外的代码,并且会得到我的控制和减少脚本的简单性和澄清。非常感谢。
@ShaunLuttin 如果您确保在第二步(2012 年)中将“脚本的数据类型”从“仅模式”更改为“模式和数据”,则应显示 INSERT 语句。
在SSMS 2014中,在选择用于保存脚本的位置时,从架构更改为模式和数据的选项现在隐藏在“高级”后面。
当我尝试使用此方法运行脚本时,我从 SQL Server 管理工作室收到关于“内存不足,无法继续执行程序。(mscorelib)”的错误
C
Community

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

其次,执行以下操作:

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

这假设远程机器可以访问您的本地机器文件,这不是一般情况。
即使在共享本地文件夹之后。错误:操作系统错误 53(未找到网络路径。)。
BACKUP DATABASE [Your_DB] TO DISK = N'G:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\backup_custom.trn' WITH COPY_ONLY, NOFORMAT, NOINIT, NAME = N'MyDB-Full Database Backup', SKIP, NOREWIND , 未加载, 统计 = 10 GO
s
sebastian_oe

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

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

选择数据源

数据源:SQL Server Native Client

服务器名称:远程服务器

验证:

数据库:数据库名称

选择目的地

数据源:SQL Server Native Client

服务器名称:本地服务器

验证:

数据库:新...

其余的都是直截了当的。


韦尔普。不幸的是,它没有设置身份和默认约束。 :(
这更简单,也是我的选择,但如果由于某种原因您需要像 object_id、create_data、修改日期等列,请记住它们将在创建时被修改。
@MushinNoShin 您可以先生成脚本,然后通过在映射步骤中启用身份插入来导入/导出数据。
m
marc_s

您无法创建从远程服务器到本地磁盘的备份——没有办法做到这一点。据我所知,也没有第三方工具可以做到这一点。

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


我不同意。在许多情况下,您可以使用 MS SQL Server Management Studio 的“生成脚本”命令创建一个脚本,该脚本可以运行以生成本地数据库,然后您可以随意使用该数据库。请参阅下面的我的回答或 Martin Smith 对该问题的评论。
@Rafid:是的-但这不是真正的备份-它是脚本/数据导出.....
@marc_s 与导出副本不同的“真实备份”有什么不同?日志?还要别的吗?
@Dronz:是的!脚本导出将重现表中的结构,甚至可能是数据 - 但它不能包含事务日志和统计信息以及 SQL Server 数据库的其他重要部分等内容。
@ShaunLuttin,您可以包含数据。
P
Phill C

我知道这是迟到的答案,但我必须对大多数投票的答案发表评论,说要在 SSMS 中使用生成脚本选项。

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

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

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

我成功地将 ApexSQL 中的比较工具(Diff 和 Data Diff)用于类似任务,但这里已经提到的任何其他工具都不会出错,尤其是 Red Gate。


我不同意,对我来说 sql 总是正确地排序依赖项,你有一个具体的例子来说明如何重现你提到的行为吗?
此外,还有一个选项可以考虑这个问题
a
adinas

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


借调。不得不安装新版本的 sql server management studio 并且不能像以前那样编写脚本。即使没有对远程服务器的完全访问权限(appharbor sqlserver 插件),该工具也可以快速处理它并且没有问题
请注意,该软件大量使用资源。
除了有问题并且不完全确定这是否可以正常工作。可以通过PHP连接到远程服务器没有问题,但这不能吗?当我在服务器本身上有适当的设置时。所以你...继续前进。
o
okarpov

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

一般来说,它看起来像这样:

执行sql脚本生成bak文件

执行 sql 脚本以将每个 bak 文件插入到带有 varbinary 字段类型的临时表中并选择该行并下载数据

重复上一个。与 bak 文件一样多的步骤

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

就是这样,你的本地电脑上有你的 bak 文件。


M
Marcel Wolterbeek

查看此博客以了解如何复制远程数据库:

Backup a SQL Server 2008 Database From a Shared Hosting Environment


这种方法解释了如何编写数据库结构脚本,在本地创建它,然后使用 SQL 管理工具在本地和远程数据库之间复制数据。
您可以将“脚本数据”选项翻转为 True,以便一次性编写数据脚本。
复制和备份是两个不同的东西。
K
Kiran Ramaswamy

我知道这是一篇较旧的帖子,但值得一提的是,我发现“最简单”的解决方案是右键单击数据库,然后选择“任务”->“导出数据层应用程序”。此选项可能仅因为服务器托管在 Azure 上而可用(从我记得过去使用 Azure 的情况来看,.bacpac 格式在那里很常见)。

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

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


这正是我所需要的。谢谢!
P
Pouyan

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

就这么简单


复制数据库需要 SysAdmin 权限。这不是数据库普通用户的解决方案。
在我今天的问题中,我们的开发团队确实拥有系统管理员权限。所以我将使用 Pouyan 的方法。
但我需要每天都这样做,我需要脚本来完成这个
M
Matthias

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

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

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


您需要系统管理员权限才能执行此操作。
正确的。用于远程连接到 sql server 实例的帐户(windows 或 sql server)需要 sysadmin 权限才能检索备份垃圾并将它们存储到本地计算机上。来自 FIDA Software 的上述工具确实在检索备份垃圾时加密和压缩进出 sql server 的网络流量。在您的机器上拥有 bak 文件后,您可以将其恢复到您想要的位置。
D
Daniel Gill

AppHarbor 帮派一直在为此苦苦挣扎,并使用 SQL 服务器管理对象和 SqlBulkCopy 开发了一个临时解决方案。

查看their blog post,或前往straight to the code

他们只使用 AppHarbor 对其进行了测试,但可能值得一试。


T
Tim

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

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

V
Vinnie

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


T
Tonatio

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

例子:

本地文件夹:C:\MySharedFolder -> URL:\\MyMachine\MySharedFolder

远程 SQL Server:选择您的数据库 -> 任务 -> 备份 -> 目标 -> 添加 -> 应用 '\\MyMachine\MySharedFolder\BACKUP_NAME.bak'


这对我有用,谢谢!只需确保更新我的本地共享文件夹的共享设置,以授予每个人读/写权限
N
Nayana Adassuriya

在 SQL Server 2019 中使用存储过程

CREATE PROCEDURE [dbo].[BackupDB]
@backupPath nchar(200), 
@dbname nchar(50)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @backupDate as nchar(10) 
    SELECT @backupDate = CONVERT(VARCHAR(10),GETDATE(),112) 
    IF DB_ID(TRIM(@dbname)) IS NOT NULL
    BEGIN
        SET @backupPath = TRIM(@backupPath) + TRIM(@dbname) + '_' + TRIM(@backupDate) + '.BAK'
        BACKUP DATABASE @dbname TO DISK = @backupPath
    END 
END
GO

N
Naresh

如果满足以下条件,您可以从远程 SQL Server 实例备份到本地驱动器的任何方法:

您的本地驱动器上有一个共享文件夹。可以从 SQL Server 框中访问共享文件夹。

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


您的答案与@Vivek 的答案有何不同?
P
Parsaria

试试这个:

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

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

登录选项卡应从您的域管理员开始

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

我在我们公司的sql server 2008的8台服务器上做了远程备份


S
Steve Pettifer

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

您需要确保您设置的共享具有足够的访问权限:我倾向于在备份过程中允许对“每个人”AD 组进行完全读/写,因为我懒得想出更严格的限制,但那是个人选择。

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

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


R
Rajesh Thampi

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

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

\mymachine\shared_folder\mybackup.bak

(在Windows域环境下试过)


B
Brian Webster

我可以这样做一次...要做到这一点,您必须在远程服务器上打开一个共享。然后您可以直接将备份放在共享本身上,而不是默认位置...

通常管理员会进行备份并在某个共享文件夹中与我们共享。如果我将备份放在那里,我尝试过这是否可行。有效。


u
user2684

如果您使用 SSMS 下的 Generate Scripts,请单击 Advanced 按钮。在“为相关对象生成脚本”选项下,单击 True。通过单击每个对象的任何依赖项也将以正确的顺序编写脚本。


True 是 SSMS v17.8.1 中的默认值。
c
curandero

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


m
mehdi lotfi

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