将数据库从一个SQL Server复制到另一个SQL Server

时间:2011-02-17 20:29:18

标签: sql-server-2008

问候。

我们在一台具有单一许可证的计算机上运行Microsoft SQL Server 2008。我们需要在此服务器上创建一个相同的数据库开发实例,包括表,触发器,默认值,数据,视图,键,约束和索引。

作为临时解决方案,我在单独的计算机上下载并安装了SQL Server 2008 Express R2和SQL Server 2008 Toolkit。然后我使用DTSWizard.exe并将其指向远程主机作为数据源,将本地计算机指向目标。

最初的数据传输似乎很好,因为创建了表格,索引等,但经过一点点的挖掘后,我意识到它并没有传输/设置任何字段的默认值!许多字段都有“NOT NULL”约束,我们正在与COM API(Response RCK)连接,它不允许我们手动编辑查询,因此我们不知道他们如何与数据库/插入条目进行交互(包括使用绕过NOT NULL约束的默认值。)

作为第二个选项,我们使用“生成脚本”选项并将所有表,约束,索引,默认值,数据等导出为.SQL文件,但现在我不确定如何将此SQL文件加载到SQL中服务器,因为它是4.9GB - 所有这些都是必需的,不会绕过这个怪物的大小。

所以我的问题是: - 有没有办法可以将SQL数据库的完整副本复制到另一台服务器,包括默认值? - 或者有没有办法导入.SQL文件而不将其复制并粘贴为新查询?

P.S:道歉,如果我的“微软”术语不完美,我是熟悉PostgreSQL和mySQL的Linux人员。

3 个答案:

答案 0 :(得分:2)

为什么不直接对数据库进行完整备份并将其还原到新服务器?这将包括一切,包括默认值?

以下是一些应该实现的SQL(编辑路径和逻辑文件名以满足您的需求):

-- On the source server run:
BACKUP DATABASE [TestDb] 
    TO DISK = N'C:\TEMP\TestDb.bak' 
    WITH 
        NOFORMAT, 
        NOINIT,  
        NAME = N'SourceDb-Full Database Backup', 
        SKIP, 
        NOREWIND, 
        NOUNLOAD,  
        STATS = 10
GO

-- On the other server run
RESTORE DATABASE [DestDb] 
    FROM DISK = N'C:\Temp\TestDb.bak' 
    WITH  
        FILE = 1,  
        MOVE N'TestDb' TO N'C:\TEMP\DestDb_data.mdf',  
        MOVE N'TestDb_log' TO N'C:\TEMP\DestDb_log.ldf',  
        NOUNLOAD,  STATS = 10
GO

如果无法通过网络访问,则需要在服务器之间移动备份文件...

答案 1 :(得分:1)

终于遇到了一个有效的解决方案。

在SQL Server 2008中,导出未使用表结构携带DEFAULT值的数据库时似乎存在错误。

这是我解决这个问题的解决方案:

  • 右键单击要备份的数据库。
  • 如果出现“欢迎使用生成SQL Server脚本向导”对话框,请单击“下一步”。否则继续下一步。
  • 选择您要传输的数据库。
  • 确保您正确选择的关键事项如下:
    • 将脚本默认值设置为True
    • 脚本使用数据库为假
    • 脚本数据为真
    • 脚本索引为True
    • 脚本主键为True
    • 脚本触发器为真
    • 真实的脚本唯一键
  • 完成其他可选参数设置后,请点击下一步>。
  • 检查存储过程,表格和视图(除非您需要/需要,否则不要检查用户。)并单击下一步>。
  • 单击全选以选择所有存储过程,然后单击下一步>。
  • 单击全选以选择所有表,然后单击下一步>。
  • 单击全选以选择所有视图,然后单击下一步>。
  • 在“脚本”模式下,选择“要存档的脚本”。
  • 单击“浏览...”按钮,然后选择要在其下保存SQL脚本的文件夹和文件名。在这个例子中,我们将使用my_script.sql。
  • 单击“完成”。

现在我们已经备份了整个数据库,包括表,视图,存储过程,索引,数据等,是时候将这些数据导入新数据库了。

在要将此信息恢复到的计算机上,执行以下步骤:

  • 点击开始 - >打开命令提示符。运行...或按键盘上的Windows(超级)+ R.
  • 在“运行”对话框中键入“cmd”,不带引号,然后单击“确定”。
  • 浏览到SQL文件所在的目录。就我而言,cd“C:\ Documents and Settings \ Administrator \ Desktop”
  • 键入“sqlcmd -s [server] [instance] -i my_script.sql”... [server]是Windows机器的名称,[instance]是SQL实例的名称。对于SQLExpress,它是“SQLEXPRESS”,没有引号。
  • 按Enter键即可开始使用!

希望这可以帮助遇到问题嫌疑人的其他人!

答案 2 :(得分:0)

可以从单个服务器运行两个查询

- 在源服务器上运行:

BACKUP DATABASE [TestDb] 
    TO DISK = N'C:\TEMP\TestDb.bak' 
    WITH 
        NOFORMAT, 
        NOINIT,  
        NAME = N'SourceDb-Full Database Backup', 
        SKIP, 
        NOREWIND, 
        NOUNLOAD,  
        STATS = 10 GO

- 在另一台服务器上运行

RESTORE DATABASE [DestDb] 
    FROM DISK = N'C:\Temp\TestDb.bak' 
    WITH  
        FILE = 1,  
        MOVE N'TestDb' TO N'C:\TEMP\DestDb_data.mdf',  
        MOVE N'TestDb_log' TO N'C:\TEMP\DestDb_log.ldf',  
        NOUNLOAD,  STATS = 10
GO