如何在不使用完整备份的情况下使用生产数据刷新SQL Server的测试实例

时间:2009-08-28 22:11:41

标签: sql sql-server database

我有两台MS SQL 2005服务器,一台用于生产,一台用于测试,两台服务器的恢复模型均为Full。我将生产数据库的备份还原到测试服务器,然后让用户进行更改。

我希望能够:

  • 回滚对测试SQL Server所做的所有更改
  • 应用自生成SQL服务器上发生的所有事务,因为最初还原了测试服务器,以便两台服务器具有相同的数据

我不想从备份文件进行完整的数据库恢复,因为这对我们的+ 200GB数据库来说需要太长时间,特别是当所有更改的数据都小于1GB时。

修改

根据以下建议,我尝试使用NoRecovery恢复数据库,但无法创建处于该状态的数据库的快照。

我还尝试将其恢复到Standby Read only模式,该模式可以工作,然后我可以获取数据库的快照,然后仍将事务日志应用于原始数据库,但只要存在快照,我就无法再次使数据库可写它。

运行:

restore database TestDB with recovery

导致以下错误:

Msg 5094, Level 16, State 2, Line 1 The operation cannot be performed on a database with database snapshots or active DBCC replicas

6 个答案:

答案 0 :(得分:4)

首先,一旦您恢复了备份并将数据库设置为“已恢复”,就是这样 - 您将永远能够将其他事务日志备份应用于它。

但是,有数据库快照。我从未使用它们,但我相信你可以将它们用于此目的。我认为你需要恢复数据库,让它处于“未恢复”模式 - 绝对不是待机模式 - 然后根据它生成快照。 (或者那是镜像?几年前我读过这些东西,但从来没有理由使用它。)

然后,当您想要更新数据库时,删除快照,恢复“下一组”事务日志备份,并创建一个新的快照。

但是,我认为这不会很好。除了执行此操作的管理和维护开销之外,如果测试人员/开发人员进行了大量修改,您的数据库快照可能会变得非常大,甚至比原始数据库更大 - 而且除了“原始的“数据库。对于不经常修改的数据库,这可能有效,但对于大型OLTP系统,我有严重的疑虑。

答案 1 :(得分:2)

所以你真正想要的是在Test中制作的Production副本。首先,你必须有一个当前的生产备份??通常在数据库上,这个大小的完整备份在周日晚上进行,然后在一周中每晚进行差异备份。

获取Sunday备份副本并将其恢复为服务器上的其他数据库名称,例如TestRestore。你应该能够在下午5点开始,这应该需要大约10个小时。如果需要更长时间,请参阅Optimizing Backup and Restore Performance in SQL Server.

当你早上进入时恢复前一晚的最后差异备份时,这应该不会花很长时间。

然后将用户从Test数据库中踢出并将Test重命名为TestOld(某人需要一些东西),然后将TestRestore数据库重命名为Test数据库。见How to rename a SQL Server Database.

远程解决方案是从Production到TestRestore进行日志传送。请稍后注意,您可以重命名并拥有一个新的测试数据库。

答案 2 :(得分:1)

对于回滚,最简单的方法可能是使用虚拟机,而不是在关闭时保存更改。 要将生产中的更改复制到测试,是否可以将差异备份或事务日志备份从生产还原到测试数据库?

答案 3 :(得分:0)

在尝试了这里提供的所有建议后,我没有找到任何方法来通过SQL完成我在问题中概述的内容。如果有人可以找到方法并发布或有其他建议,我会很乐意尝试别的东西但是在这一点上似乎没有办法实现这一点。

答案 4 :(得分:0)

存储供应商(作为netapp)提供了可写快照的功能。 它使您能够在生产中的几秒钟内创建快照,执行测试以及删除/重新创建快照。 这是一个长期的解决方案,但......它的工作原理

答案 5 :(得分:0)

在Server1上,存在压缩最新完整备份的作业 在Server2上,有一个作业执行以下步骤: 将压缩文件复制到本地驱动器 解压缩文件以使完整备份可用 杀死即将恢复的数据库的所有会话 恢复数据库 将恢复模型设置为“简单” 向开发人员授予db_owner权限

价:http://weblogs.sqlteam.com/tarad/archive/2009/02/25/How-to-refresh-a-SQL-Server-database-automatically.aspx