问题描述
RDS SQL Server 如何设置为快照隔离级别 READ_COMMITTED_SNAPSHOT
前提条件
设置快照条件:
- 设置快照隔离有运行alter database 命令权限。
- 执行此命令时,不能有任何连接到此数据库的活动连接。
- 数据库不是必须设置单用户模式。
- 当数据库为脱机状态,无法执行此操作。
- 数据库为云盘版实例
场景1:RDS SQL Server 高可用版本
执行SQL:
ALTER DATABASE ""SET READ_COMMITTED_SNAPSHOT ON;
报错:
Msg 1468, Level 16, State 6, Line 19The operation cannot be performed on database "" because it is involved in a database mirroring session or an availability group. Some operations are not allowed on a database that is participating in a database mirroring session orin an availability group. Msg 5069, Level 16, State 1, Line 19ALTER DATABASE statement failed.
原因
由于 RDS SQL Server 实例是高可用版本,所以会一直有活动连接进行主备之间同步数据,导致不能设置成功。
解决方案
1. 关闭镜像
示例数据名称:db10,参考更改此名称。
ALTER DATABASE db10 SET PARTNER OFF;
2. 检查是否还有其它会话使用此数据库
select*from sys.sysprocesseswhere dbid = db_id('db10');
3.若存在会话,可以使用kill spid 直接杀掉
注:若存在大事务会话,要自行评估,是否需要等待会话执行完成。直接kill,事务需要回滚,回滚时长至少是事务已经执行的时长。
4. 执行配置快照设置
ALTER DATABASE db10 SET READ_COMMITTED_SNAPSHOT ON;
场景2: RDS SQL Server 基础版本和集群版本
问题:一直无法执行成功
原因
有其它会话阻塞此会话,设置快照隔离。
解决方案
- 检查是否还有活跃会话(脚本同场景1)
- kill 活跃会话(脚本同场景1)
- 执行配置快照隔离操作(脚本同场景1)
附:其它相关命令
查看指定数据库快照隔离是否开启
SELECT name,is_read_committed_snapshot_on FROM sys.databasesWHERE name ='db10';
查看数据库是否开启镜像同步
SELECT DB_NAME(database_id),mirroring_state,mirroring_state_desc,mirroring_role_desc FROM sys.database_mirroringWHERE DB_NAME(database_id)='db10';
适用于
云盘版:
RDS SQL Server 高可用版本、集群版本、基础版本。(直接检查活动连接即可)
注:本地盘为什么不支持
因产品侧限制,所以本地盘实例无法设置,如截图,会出现类似报错
Procedure TGR#ALTERDATABASE, ... Current user 用户名 have no permission
参考文档: