代码之家  ›  专栏  ›  技术社区  ›  David-W-Fenton

将SQL Server Express数据库复制到其他计算机

  •  8
  • David-W-Fenton  · 技术社区  · 14 年前

    我明天将升级客户端访问应用程序的后端,需要为这个客户端的特定问题准备一个计划。老板需要能够定期(通常每月)将数据文件从SQL Server所在的办公室中取出,并对数据进行统计分析。

    我看过 Easiest way to copy an entire SQL server Database from a server to local SQL Express 在这种情况下,解决方案不起作用,因为:

    1. 无法使用一次性解决方案(数据库发布向导),因为这需要可编写脚本。

    2. 不能使用任何依赖于正在联网的两台计算机的方法,因为这不是一个选项——数据必须通过USB拇指驱动器传输(因此,没有复制)。

    3. 不能使用任何依赖于从服务器控制台或工作站运行SQL Server管理工具进行备份的方法。

    4. 无法直接连接到SQL Server数据库进行分析,因为数据必须可移植到其他位置。

    我想我需要的是某种方法来调用创建备份文件的脚本,然后将结果复制到USB驱动器。然后,我需要第二个脚本来从USB驱动器复制备份文件,并将其还原到另一个SQL服务器上。

    正在传输的数据是只读的(或者,所做的任何更改都不需要返回到主服务器),并且不会在第二个位置更新数据。它目前是用一个普通的老批处理文件编写脚本来复制后端MDB文件的,我需要一些对用户来说非常简单的东西。

    它不能对PowerShell(SQL Server Management Studio)有任何依赖关系,因为我不希望它必须安装在用户运行脚本的计算机上(需要从六个工作站运行脚本,而且我不希望在所有工作站上都安装某些东西)。

    我将设置备份代理每晚创建一个备份,这样我就可以复制该文件,而不必在复制之前启动备份。因此,我可能只需要在目标计算机上编写还原脚本。

    想法,建议,指点?

    4 回复  |  直到 14 年前
        1
  •  13
  •   marc_s Anurag    14 年前

    你一定能创造出这样的东西。

    一部分是T-SQL CREATE BACKUP 脚本作为 .sql 编写脚本,并从标准Windows批处理中执行该脚本( *.bat 或命令 *.cmd )文件使用 sqlcmd 命令行工具。

    就像这样:

    备份SQL

    BACKUP DATABASE YourDatabase
    TO DISK = 'Z:\Backup\YourDatabase.bak'
    WITH FORMAT;
    

    第二部分是带有T-SQL的.sql文件 RESTORE 脚本,基本上是从磁盘上的给定位置读取数据并将其还原到该位置的SQL Server实例。

    恢复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
    

    当然,您需要根据自己的实际需求调整这些名称和路径,但这只会给您一个提示,告诉您如何开始这项工作。

    要执行其中一个.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
    

    资源:

        2
  •  2
  •   pghcpa    14 年前

    我在生产(服务器)和测试开发(在另一个位置的本地)之间传输数据库时遇到了同样的问题,并且还将完成的数据库传输到托管服务器。

    事实证明,我可以自己传输.mdf。

    1. 确保目标数据库没有附加该数据库,请先在SSMS中删除它。
    2. 单独移动.mdf(不带日志文件)。
    3. 在目标位置,默认的C:\Program Files…SQL..\Data确保移动或删除MDF和LDF的所有先前实例--如果它在那里看到.ldf,则会混淆。
    4. 在SSMS中,选择附加。按“添加”,选择.mdf。
    5. 此时,在下面的框中,它将显示附加了MDF和LDF,并且缺少LDF。单击LDF并按“删除”按钮。
    6. 现在将附加MDF,并添加新的/空的LDF。

    我一直这样做;工作完美——省去了运送大型自卫队的麻烦。(我经常使用dropbox.com而不是thumb驱动器,并首先使用pkzip/securezip加密文件。)

    我不确定如果在服务器启动的情况下复制MDF会发生什么,尽管在复制之前我不会停止它。我不知道如何使这个脚本化——附件可以被脚本化,但我不确定在继续之前删除.ldf。

    您可以编写服务器脚本以创建数据库的快照副本,然后在知道该MDF未被更新的情况下传输该MDF。

    另一个想法是编写一个程序,将所有记录插入到一个SQL Server Compact Edition文件中并传输它?我没试过,但读过。

        3
  •  1
  •   Kevin Ross    14 年前

    只是一个想法,但如果他现在离开了一个mdb文件的副本,所有的数据都是为了他自己,那么为什么不继续这样做呢?您可以在Access中对每个表都进行查询。

    如果您设置您的__reporting__mdb,其中表链接并称为__tblfoo_157,本地表名为__tblfoo__,那么您可以运行一点vba代码,该代码将在所有表中循环并执行类似的操作

    INSERT INTO tblFoo SELECT * FROM tblFoo_LINKED
    

    SQL Server备份还原仍然是我希望的选项,但只是提供了一个不同的自旋,可以满足您的需要。

        4
  •  0
  •   Steve    14 年前

    为什么不继续复制整个数据库文件?这就像一个足够小的操作,可以暂时暂停:您可以收缩数据库、分离并直接复制文件。在目标系统上,你可以 attach the SQLExpress DB by file name 在连接字符串中。