2011-02-17 129 views
1

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

我们在一台机器上使用单一许可证运行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 Server中,因为它是4.9GB - 所有这些都是必需的,没有规避这个怪物的大小。

所以我的问题是: - 有没有办法让SQL数据库的完整副本到另一台服务器,包括默认值? - 或者有没有办法导入.SQL文件而不复制并粘贴为新查询? P:请道歉,如果我的“微软”行话不完美,我是熟悉PostgreSQL和MySQL的Linux专家。

回答

1

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

在SQL Server 2008中,在导出不带表结构的DEFAULT值的数据库时,似乎存在一个错误。

这里是我的规避此解决方案:

  • 要备份的数据库上单击鼠标右键。
  • 如果出现“欢迎使用生成SQL Server脚本向导”对话框,请单击下一步。否则继续下一步。
  • 选择您想要传输的数据库。
  • 有关键的东西,以确保你选择正确如下:
    • 将脚本默认为true
    • 脚本中使用数据库,以假
    • 脚本数据为True
    • 脚本指数为True
    • 脚本主键为真
    • 脚本触发器为真
    • 脚本唯一键为真
  • 完成其他可选参数的设置后,请单击下一步>。
  • 检查存储过程,表格和视图(除非您想/需要检查用户),然后单击下一步>。
  • 单击全选选择所有存储过程,然后单击下一步>。
  • 单击全选选择所有表并单击下一步>。
  • 单击全选以选择所有视图,然后单击下一步>。
  • 在脚本模式下,选择脚本到文件。
  • 单击Browse ...按钮并选择您希望保存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的任何名称机器和[实例]是你的SQL实例的名称。对于SQLExpress,它是不带引号的“SQLEXPRESS”。
  • 按Enter键,你就在路上!

希望这可以帮助别人谁遇到了问题的maraud!

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 

,你需要移动服务器之间的备份文件,如果现在还没有结束访问网络...

+0

备份选项执行似乎没有工作,它给了我目标数据库不是源数据库的错误。 – 2011-02-18 16:34:04

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 
相关问题