我正在将两个数据库的备用/只读模式下的事务日志传送设置到多个实例。
在将事务日志备份并还原到其单独的实例(每个实例上每个数据库的一个副本)后,当我执行以下操作时,其中一个数据库没有问题:
ALTER DATABASE [dbname] SET SINGLE USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [dbname] SET MULTI_USER;
另一个抛出错误:
Failed to update database "other_dbname" because the database is read-only.
我看不出两者有什么区别。我检查了属性,所有选项都相同。在选项选项卡中,会引发错误的数据库将兼容性级别设置为 SQL Server 2012,而允许我更改的数据库将该值设置为 SQL Server 2014,但将它们都更改为 2014 并不能解决问题。
我完全不知道问题可能是什么,或者我可以研究什么会为我指明正确的方向。
编辑:上述命令在链接服务器上执行,如果这可能与它有关。用户相同,权限相同,我能够在第一个数据库上执行命令,无论它们是通过 SSMS 还是通过作业执行,它们总是在第二个数据库上失败。
微软在 2015 年披露了一个与 SQL Server 2012 和 2014 相关的问题,听起来与您的问题非常相似:
您可以阅读 FIX 中的完整问题和修复:如果数据库是只读的,则无法将 SQL Server 2012 或 2014 数据库设置为单用户模式。
您似乎正在运行应用了安全更新(自 08/2017 起)的 SQL Server 2014 SP1。引用的问题会影响该版本的 SQL Server,我相信修复是在 2014 SP1 CU 2
我正在运行 SQL Server 2017。在该版本中,我能够成功地将数据库放入单用户然后只读(案例 1)和只读然后单用户(案例 2):
我查看了 SQL Server 2014 的文档,看起来此功能与 2017 年的功能相同(至少没有明显的区别)。所以,我收回我之前的断言,即不能将只读数据库置于单用户模式。
STANDBY/read_only 允许在事务日志恢复之间启动数据库以进行只读访问,并且它可以用于热备用服务器情况或特殊恢复情况,在这些情况下检查日志恢复之间的数据库很有用。您不能
Alter
在备用数据库上应用命令。想想您在数据库上执行的命令的目的。当连接了多个会话并且您需要在数据库级别应用操作并让数据库放入单个用户(您的当前会话)并回滚所有正在进行/未决的事务时使用此命令。在您的情况下,数据库已经处于备用状态,其中包含已提交的事务,并且未提交的事务被添加到 TUF 文件中。