在数据库恢复之前,需要关闭我正在处理的系统。如果客户不这样做,他可能会遇到严重的问题,因为应用服务器的内存状态与数据库不匹配。损坏的数据库导致错误并且系统停止工作并且数据库无法使用可能需要一些时间。
所以我尝试检测这种情况并避免问题。
- 应用程序服务器不一定保持连接活动,因此单用户模式和类似的东西很可能不会有帮助。
- 我不在乎还原是否会失败或服务器是否会关闭或其他任何事情。它只是不应该忽视它。
- 数据库可以通过任何机器上的任何 sql server 工具恢复。我不能依赖我自己的工具。
有人已经解决了这样的问题吗?
我正在使用 SQL Server 2005 及更高版本、.NET (C#)、SMO。
编辑:
由于对应用程序设计的一些误解和讨论,我需要解释一下问题出在哪里。
Hi-Lo 生成器:该应用程序使用 NHibernate,它具有Hi-Lo id 生成器的 Hi-Values 缓存。Hi-Values 从数据库中读取并允许应用程序生成特定数量的主键,直到它需要返回数据库并获取另一个数字范围。存储在数据库中的 Hi-Values 只会增加,而不会减少(除非恢复旧版本的数据库)。这是 Hi-Lo 发生器的概念,不是我自己发明的,也不是我自己实现的。
缓存:在缓存中,主键用于标识数据库中的记录。在正常使用数据库时,主键永远不会改变。在还原的情况下,主键不再标识相同的记录,并且缓存完全错误。它甚至无法检测到这一点。例如,它可能会导致在新记录中设置错误的外键。
无法将数据库还原与数据库的任何其他正常使用进行比较。还原破坏了所有数据处理规则。
我想许多应用程序在运行时保持连接打开,因此无法恢复。大多数其他应用程序可能会在数据库恢复时崩溃,然后它会尝试访问数据库。就我而言,它可能会继续运行一段时间,这是一个问题。
我猜大多数人甚至不会在应用程序运行时尝试恢复数据库。
理论上,在我的案例中证明,当应用程序仍在内存中时恢复数据库时出现完全错误的风险。我不想被告知这根本不是问题,只是因为大多数应用程序不处理它。