将 SQL Server Express 数据库复制到另一台计算机
Posted
技术标签:
【中文标题】将 SQL Server Express 数据库复制到另一台计算机【英文标题】:Copy SQL Server Express Database to Another Computer 【发布时间】:2010-08-31 18:44:22 【问题描述】:我明天要升级客户的 Access 应用程序的后端,需要为该客户的特定问题制定计划。老板需要能够定期(通常是每月)将数据文件从 SQL Server 所在的办公室带走,并对数据进行统计分析。
我查看了Easiest way to copy an entire SQL server Database from a server to local SQL Express,那里的解决方案在这种情况下不起作用,因为:
不能使用一次性解决方案(数据库发布向导),因为它需要可编写脚本。
不能使用任何依赖于联网的两台计算机的方法,因为这不是一个选项——数据必须通过 USB 拇指驱动器传输(因此,不能复制)。
不能使用任何依赖于从服务器控制台或工作站运行 SQL Server 管理工具的方法进行备份。
无法直接连接到 SQL Server 数据库进行分析,因为数据必须可移植到其他位置。
我认为我需要的是某种方式来调用创建备份文件的脚本,然后将结果复制到 USB 驱动器。然后我需要第二个脚本来从 USB 驱动器复制备份文件并将其恢复到另一个 SQL Server。
正在传输的数据是只读的(或者,所做的任何更改都不需要返回到主服务器),并且不会在第二个位置更新数据。它目前使用一个普通的旧批处理文件编写脚本来复制后端 MDB 文件,我需要一些对用户来说同样简单的东西。
它不能有任何依赖,比如说,Powershell(SQL Server Management Studio),因为我不希望它必须安装在用户运行脚本的计算机上(有一半脚本需要在十几个工作站上运行,我不想在所有这些工作站上都安装一些东西。
我将设置备份代理以每晚创建备份,因此我可以复制该文件而无需在复制前启动备份。因此,我可能只需要在目标计算机上编写还原脚本。
想法、建议、指点?
【问题讨论】:
【参考方案1】:你绝对应该能够创造出这样的东西。
其中一部分是 T-SQL CREATE BACKUP
脚本作为 .sql
脚本,并使用 sqlcmd
命令行从标准 Windows 批处理 (*.bat
) 或命令 (*.cmd
) 文件执行该脚本工具。
应该是这样的:
backup.sql
BACKUP DATABASE YourDatabase
TO DISK = 'Z:\Backup\YourDatabase.bak'
WITH FORMAT;
第二部分是一个带有 T-SQL RESTORE
脚本的 .sql 文件,主要是从磁盘上的给定位置读取数据并将其还原到那里的 SQL Server 实例。
restore.sql
RESTORE DATABASE YourDatabase
FROM AdventureWorks2008R2Backups
WITH
MOVE 'YourDatabase_Data' TO 'C:\MSSQL\Data\YourDatabase.mdf',
MOVE 'YourDatabase_Log' TO 'C:\MSSQL\Data\YourDatabase_Log.ldf';
GO
当然,您需要根据自己的实际需求调整这些名称和路径 - 但这应该只是提示您如何开始这项工作。
要使用sqlcmd
执行其中一个 .sql 脚本,您需要以下内容:
sqlcmd -S (name of server) -U (login) -P (password) -I (name of script file)
例如
sqlcmd -S (local) -U someuser -P top$secret -I backup.sql
资源:
How to create a full database backup T-SQL RESTORE command sqlcmd utility【讨论】:
如何从没有安装 SQL Server 的工作站运行 SQLCMD?有没有办法从工作站执行这些 SQL 脚本,而不是从服务器控制台,或从安装了 SQL Server 管理工具的工作站?这些不会安装在用户将用于将数据复制到 USB 驱动器的工作站上(这正是我不想介绍的外部依赖项)。 好的,我看到我必须为 SQLCMD 实用程序单独安装命令行实用程序。由于我必须安装SQL Server Native Client,我想同时安装它们也不是没有道理的。不幸的是,下载文档 (microsoft.com/downloads/…) 说它需要 Windows Installer 4.5,这是另一个重量级安装(需要重新启动 WinXP 工作站)。这在源端看起来非常笨拙(尽管在目标端可以,它将安装 SQL Server Express)。 R2 下载地址为microsoft.com/downloads/… 即使这个答案不符合我的具体情况的所有限制(我不想在工作站上安装命令行实用程序),我认为这可能是对问题的最佳答案它是最一般的形式,即没有我的具体限制,所以我接受它作为答案。 我可以发誓我接受了这个答案。我不知道那里发生了什么!【参考方案2】:我在生产(服务器)和测试开发(本地在另一个位置)之间传输数据库以及将完成的数据库传输到托管服务器时遇到了同样的问题。
事实证明,我可以自己传输 .MDF。
-
确保目标数据库没有附加该数据库,首先在 SSMS 中将其删除。
自行移动 .MDF(不带日志文件)。
在目标位置默认 c:\program files...sql..\DATA 确保所有先前的 MDF 和 LDF 实例都已移动或删除 - 如果它在那里看到 .ldf,它会感到困惑。
在 SSMS 中,选择附加。按添加,选择 .mdf。
此时,在右下方的框中,将显示 MDF 和 LDF 已连接,并且 LDF 缺失。点击 LDF 并按 REMOVE 按钮。
现在将附加 MDF,并添加一个新的/空 LDF。
我一直这样做;完美运行 - 省去了传输大型 .ldf 的麻烦。 (我经常使用 dropbox.com 而不是 U 盘,并首先使用 PKZIP/SecureZip 加密文件。)
我不确定如果在服务器启动的情况下复制 MDF 会发生什么,但我不会在复制之前停止它。我不确定如何使此脚本可编写 - 附件可以编写脚本,但我不确定在继续之前删除 .LDF。
您可以编写服务器脚本来制作数据库的快照副本,然后在知道它没有被更新的情况下传输该 MDF。
另一个想法 - 编写一个程序将所有记录插入 SQL-Server 压缩版文件并传输?我没有尝试过,但请阅读它。
【讨论】:
虽然在这里有这个答案可能有利于完整性,但它不符合我的问题中的限制。它的效率不亚于备份文件。我为之执行此操作的数据库有一个 64MB 的 MDF 文件,而备份文件是 63MB!因此,仅获取 MDF 文件并没有真正节省,如果同时获取两个文件,您将复制更多数据。此外,备份转储只需几秒钟即可运行,而停止和启动服务器则需要相当长的时间。最后,这必须在工作日完成,并且服务器不能真正停止。 我又重读了两次,没有看到你想要一个“更小”的文件——所以无论如何……备份应该包含 MDF/LDF 组合——单独的 MDF 应该更小。我不确定您是否必须停止服务器才能获取它。它可能会拉下来。但是,如果您认为 SQL/Server Compact 版本不起作用,这里还有一些想法: 1. 使用 SQL/Server 发布者/订阅者复制来“更新”数据库——只有更改才会发生,所以应该很快。如果没有像你说的那样联网,那么托管一个“集线器”——我使用 serverintellect.com——速度如此之快,几乎就像是在本地 或者 2. 尝试同步服务:msdn.microsoft.com/en-us/sync/default.aspx——它说它将与 SQL/Server 精简版同步。如果要求永远没有网络,永远没有互联网(仅像希捷这样的小型便携式 USB 供电驱动器),那么除非您复制自上次更新以来刚刚更改的记录,否则不确定如何避免复制完整的数据库。希望对您有所帮助。 我没有要求较小的文件,但您通过建议跳过 LDF 文件提出了较小文件的问题。我只关心这个过程需要多长时间,复制更多数据需要更长的时间。但对我来说,停止/启动服务器所需的时间是更大的问题,尤其是因为它无法在正常工作时间完成。 使用 SQL Server CE 需要将其安装在目标工作站上,或者将其设置为那里的链接服务器。我看不出这样做的价值。到目前为止,我已经完全放弃了复制 SQL Server 数据库的想法,而是将数据导入 Access 数据库并使用它。这要简单得多,因为在那种情况下,目标工作站根本不需要安装 SQL Server。【参考方案3】:只是一个想法,但如果他现在带着一份包含所有数据的 MDB 文件的副本离开,那么为什么不继续这样做。您可以通过对每个表的查询来完成所有操作。
如果您使用链接并称为“tblFoo_LINKED”的表和一个名为“tblFoo”的本地表设置“报告”MDB,那么您只需运行一些 VBA 代码,该代码将遍历所有表并执行类似
INSERT INTO tblFoo SELECT * FROM tblFoo_LINKED
SQL Server 备份恢复仍然是我会选择的选项,但只是提供可能适合您需求的不同内容
【讨论】:
不起作用,因为远程用户还必须使用现有的应用程序。我不想维护两个版本的前端,一个用于 Jet,一个用于 SQL Server。目前,该应用程序还没有发生足够的变化,但一旦我开始在服务器端移动以提高性能,它就不再起作用了。另一方面,将在服务器端移动的大部分内容将是诸如插入(使用 SPROC)之类的内容,而用户不会这样做。唔。值得考虑。 我开始考虑这个问题,因为我认为我对主要应用程序工作的担忧并不那么重要。我使用 DoCmd.TransferDatabase 让它工作(应该比 MakeTable 更有效并获得更准确的数据类型),但它没有导入索引。唔。得做更多的探索...... 我不接受这个作为答案,即使它最接近我最终选择的解决方案。我的理由是,我认为最好接受与我提出的问题更直接匹配的答案(仅限 SQL Server)。但我赞成它,因为它让我思考并测试了这种方法。我将使用以下两种方法之一(我尚未测试性能):A. 将数据插入已定义索引的空模板 MDB,或 B. 使用 TransferDatabase 导入并使用 DAO 添加索引。 这很公平,感谢您的支持。至于你的两个计划,它已经接近了,但我认为我的钱将用于导入然后构建索引,但只是而已。听到最终结果会很有趣 我对构建索引的担忧只是因为它是繁琐的代码。如果我可以从现有数据库中编写脚本,我将更有可能使用它。我确实相信导入会比 INSERT 更快。在我昨晚入睡之前,我确实想到 TransferText 可以导入到现有表中,所以也许 TransferText 也可以?我必须检查一下,因为如果可以,那么这是迄今为止最简单的方法(导入到现有空 shell 数据库中的表中)。【参考方案4】:为什么不继续复制整个数据库文件呢?这听起来像是一个足够小的操作,可以暂时停止:您可以直接收缩数据库、分离和复制文件。在目标系统上,您可以在连接字符串中使用attach the SQLExpress DB by file name。
【讨论】:
脚本化?可由非管理员运行?可以从工作站而不是从服务器控制台运行吗? 我正在考虑关于使用夜间备份副本的最后一条语句,这表明它被复制到共享中,并且只需要一个恢复脚本。如果备份计划包含复制 db 的任务(例如:通过维护计划中的 T-SQL 任务),并且连接字符串以 db 文件名为目标,则不需要恢复脚本。跨度> 好吧,我还没有制定备份计划,因为我还没有完成升迁——那就是明天!但是,是的,我想我会共享备份脚本的目的地,并且复制它会很容易,但这不需要你建议的关于停止数据库服务器等的任何事情。在任何情况下,停止服务器并复制实际文件是完全不可能的,因此引用的 URL 并没有真正的帮助。以上是关于将 SQL Server Express 数据库复制到另一台计算机的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C# 代码将 SQL Server CE 迁移到 SQL Server 2012 Express
将数据库项目部署到 SQL Server 2008 Express
将 SQL Server CE 4 数据库转换为没有 Visual Studio Pro 版本的 SQL Server 2008 Express
尝试将 SQL Server 2012 Express 还原到 2014