如何检测SQ​​L Server数据库已恢复

时间:2013-02-02 10:14:01

标签: sql-server database backup restore

SQL Server数据库实例是否有任何独特之处,可以检测到它已被恢复。如果客户端正在使用数据库并决定在另一台服务器上恢复并运行同一数据库的另一个副本 - 有没有办法用t-sql查询来区分这两个数据库?

2 个答案:

答案 0 :(得分:5)

有几种方法可以将数据库标识为另一个数据库的还原/副本:

  • service_broker_guid通常是最简单的方法。它是在创建数据库时生成的,并在还原/附加操作期间保留。它可以使用ALTER DATABASE ... SET NEW_BROKER;显式更改,因此不同的GUID不一定意味着不同的DB。但是相同的GUID意味着数据库的共同起源。
  • dbi_familyGUID是一个未记录的引导页面字段,在恢复时保留。
  • 恢复路径和recovery fork LSNs已记录在案,可用于识别共同的起源,但它们快速分歧,即使最近恢复的数据库很快就会通过简单地使用另一个数据库丢失共同起源的痕迹fork LSNs。
  • 加密数据库(TDE可以通过页面随机数(未记录的方法,需要专业知识)轻松识别,只要加密密钥没有改变(即没有强制重新加密,没有全部丢失)随机数)。
  • 应用程序层方法可以使用代码签名:生成密钥对,签署虚拟模块,删除私钥。由于永远不会重新生成签名(永久删除私钥),因此数据库的副本无法隐藏其原点而不删除签名,这显然是tamper evident

如您所见,有几种方法,所需的专业水平和他们提供的篡改证据的程度各不相同。它归结为您的要求和实际用例。最后,请记住SQL Server 是DRM产品。如果您有一些您认为非常有价值并且必须受到保护的代码/设计,那么您应该将该应用程序作为托管服务提供,以便这种感知到的IP永远不会离开您的物理控制环境。

答案 1 :(得分:0)

数据库开发人员和管理员经常使用GUID作为数据库表的主键,以确保数据库之间的唯一性。这篇材料涉及比较GUID:http://msdn.microsoft.com/en-us/library/ms254976.aspx