我需要将数据库从远程服务器复制到本地服务器。我尝试使用 SQL Server Management Studio,但它只备份到远程服务器上的驱动器。
几点:
我无法以复制文件的方式访问远程服务器;
我无权设置我的服务器的 UNC 路径;
关于如何复制此数据库的任何想法?我必须使用 3rd 方工具吗?
Generate and Publish Scripts
选项生成了脚本。我得到了所有的表格和架构。但是我没有得到任何表格数据。我怎样才能解决这个问题。
在 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。但请注意,您需要对脚本中的数据库名称执行完整搜索并将其替换为新数据库,在这种情况下,您不必在运行脚本之前创建该数据库。这应该会创建更准确的副本,但有时由于权限限制而无法使用。
首先,使用所有人授予对您计算机上的本地路径(如下所示)的完全控制权限。 (或者 grant permissions specifically 到 SQL Server 代理帐户)。
其次,执行以下操作:
BACKUP DATABASE [dev] TO DISK = N'\\myMachine\c\dev.bak' WITH COPY_ONLY, INIT;
要仅复制数据和架构(不会复制存储过程、函数等),请使用 SQL Server 导入和导出向导,并在选择目标数据库时选择新建...。
右键单击数据库 > 任务 > 导入数据。
选择数据源
数据源:SQL Server Native Client
服务器名称:远程服务器
验证:
数据库:数据库名称
选择目的地
数据源:SQL Server Native Client
服务器名称:本地服务器
验证:
数据库:新...
其余的都是直截了当的。
您无法创建从远程服务器到本地磁盘的备份——没有办法做到这一点。据我所知,也没有第三方工具可以做到这一点。
您所能做的就是在远程服务器计算机上创建一个备份,然后让某人将其压缩并发送给您。
我知道这是迟到的答案,但我必须对大多数投票的答案发表评论,说要在 SSMS 中使用生成脚本选项。
问题在于此选项不一定会以正确的执行顺序生成脚本,因为它没有考虑依赖关系。
对于小型数据库,这不是问题,但对于较大的数据库,这肯定是因为它需要手动重新排序该脚本。在 500 个对象数据库上尝试;)
不幸的是,在这种情况下,唯一的解决方案是第三方工具。
我成功地将 ApexSQL 中的比较工具(Diff 和 Data Diff)用于类似任务,但这里已经提到的任何其他工具都不会出错,尤其是 Red Gate。
你可以试试SQLBackupAndFTP。它将创建脚本来创建数据库中的所有对象,并为表中的所有行创建 INSERT 语句。在任何数据库中,您都可以运行此脚本文件,整个数据库将被重新创建。
有 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 文件。
查看此博客以了解如何复制远程数据库:
Backup a SQL Server 2008 Database From a Shared Hosting Environment
我知道这是一篇较旧的帖子,但值得一提的是,我发现“最简单”的解决方案是右键单击数据库,然后选择“任务”->“导出数据层应用程序”。此选项可能仅因为服务器托管在 Azure 上而可用(从我记得过去使用 Azure 的情况来看,.bacpac 格式在那里很常见)。
完成后,您可以右键单击本地服务器的“数据库”列表,并使用“导入数据层应用程序”通过 .bacpac 文件将数据导入本地计算机。
请记住,出口可能需要很长时间。我花了大约两个小时完成导出。不过,导入部分要快得多。
您可以使用复制数据库...右键单击远程数据库...选择任务并使用复制数据库...它会询问您有关源服务器和目标服务器的信息。您的源是远程,目标是您的本地 sql server 实例。
就这么简单
上面的答案是不正确的。即使有数据的 SQL 脚本也不是备份。备份是一个 BAK 文件,其中包含当前结构中的完整数据库,包括 indizes。
当然,可以在本地系统上检索包含来自远程 SQL Server 数据库的所有数据和索引的完整备份的 BAK 文件。
这可以使用商业软件来完成,将备份的 BAK 文件直接保存到本地计算机,例如 This one 将直接从本地计算机上的远程 SQL 数据库创建备份。
AppHarbor 帮派一直在为此苦苦挣扎,并使用 SQL 服务器管理对象和 SqlBulkCopy 开发了一个临时解决方案。
查看their blog post,或前往straight to the code。
他们只使用 AppHarbor 对其进行了测试,但可能值得一试。
对于 2019 年,如果您想要实际的本地备份,我建议使用 mssql-scripter。是的,它是脚本,但您可以调整它以包含您想要的任何内容,其中可以包含所有数据。我编写了一个 bash 脚本来在 linux 机器上使用它来进行自动每日备份。检查我的要点:
https://gist.github.com/tjmoses/45ee6b3046be280c9daa23b0f610f407
正如 Martin Smith 所说,如果您无法访问机器或文件系统,则需要使用 Red Gate 或 Adept 等第三方工具对源系统和目标系统进行比较。 Red Gate 的工具将允许您复制对象和模式以及数据。
如果您在本地网络中,您可以在本地计算机上共享一个文件夹并将其用作备份的目标文件夹。
例子:
本地文件夹:C:\MySharedFolder -> URL:\\MyMachine\MySharedFolder
远程 SQL Server:选择您的数据库 -> 任务 -> 备份 -> 目标 -> 添加 -> 应用 '\\MyMachine\MySharedFolder\BACKUP_NAME.bak'
在 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
如果满足以下条件,您可以从远程 SQL Server 实例备份到本地驱动器的任何方法:
您的本地驱动器上有一个共享文件夹。可以从 SQL Server 框中访问共享文件夹。
现在在指定备份命令时,在指定磁盘选项时使用共享文件夹路径。
试试这个:
1)在您的计算机中共享具有完全权限的文件夹
2)在您的SQL服务器中:控制面板->管理工具->服务->右键单击所有SQL服务
登录选项卡应从您的域管理员开始
3) 在 sql server 的维护向导中放置备份位置和文件夹 (\yourcomputername\sharedfoldernam)
我在我们公司的sql server 2008的8台服务器上做了远程备份
令我惊讶的是,没有人提到 Ola Hallengren 提供的脚本备份解决方案,它绝对确实允许您将数据库从远程服务器免费备份到网络上的 UNC 路径(我'实际上我在键入时使用它从开发服务器备份数据库,除了通过 SSMS 到我的开发 PC 上的共享之外,我没有远程访问权限。这自 2008 年以来一直可用,并适用于 SQL Server 2005 至 2014。
您需要确保您设置的共享具有足够的访问权限:我倾向于在备份过程中允许对“每个人”AD 组进行完全读/写,因为我懒得想出更严格的限制,但那是个人选择。
它使用得很好,有据可查并且非常灵活。我倾向于将 procs 和日志记录表放在他们自己的小型实用程序数据库中,然后启动它。如果所有内容都在您的 AD 域中,而不是远程的,因为它位于同一位置的服务器或其他东西上,这非常有效。
很抱歉添加到一个非常旧的线程,但我在寻找其他内容时遇到了这个问题,并认为对于任何寻找这个主题的人来说这是一个值得的补充。
创建具有“每个人”读/写权限的本地共享文件夹
连接到目标数据库,开始备份并指向共享,如下所示
\mymachine\shared_folder\mybackup.bak
(在Windows域环境下试过)
我可以这样做一次...要做到这一点,您必须在远程服务器上打开一个共享。然后您可以直接将备份放在共享本身上,而不是默认位置...
通常管理员会进行备份并在某个共享文件夹中与我们共享。如果我将备份放在那里,我尝试过这是否可行。有效。
如果您使用 SSMS 下的 Generate Scripts,请单击 Advanced 按钮。在“为相关对象生成脚本”选项下,单击 True。通过单击每个对象的任何依赖项也将以正确的顺序编写脚本。