您的位置:首页 > 数据库

如何修改数据库的快照隔离级别

2016-04-27 12:59 302 查看
背景说明:

经常接到现场反馈,执行K/3 Cloud某个功能时,系统卡死。

此时连接到SQL Server数据库,执行如下SQL语句搜索数据库的进程,发现有明显的阻塞

-- 检查死锁与阻塞
select * from Sys.SysProcesses where blocked <> 0
-- 说明:如果本语句能够搜索到结果,说明是有数据库阻塞

执行如下语句查看造成阻塞的SQL语句:

--查看进程的详情:造成阻塞的SQL
dbcc inputbuffer(1)

如果发现,造成阻塞的语句,是SELECT取数语句,那么很可能是数据库读快照隔离级别为0,导致读数据库也上了排它锁。

执行如下语句,可以确认是否如此:

select is_read_committed_snapshot_on, * from sys.databases
--如果当前账套对应的数据库  is_read_committed_snapshot_on = 0,那么会在读数据库时也上排他锁,非常容易发生死锁,造成数据库卡死。

解决方案:

把数据库  is_read_committed_snapshot_on 设置为1,可以有效解决这个问题。
本帖介绍,如何修改数据库这个选项。

如何设置  is_read_committed_snapshot_on  =
1?

可以通过如下语句达成目标:
use master;
alter database AIS20160127100532 set
read_committed_snapshot on;

但是,执行此语句时,必须关掉数据库的全部链接,否则语句执行时,会一直卡在那里。

请按照如下步骤,停掉全部数据库链接后,再执行此语句:

1. 如果应用服务器、管理服务器部署在其他机器上,则停掉应用服务器、K/3
Cloud管理服务器:关机;

2. 如果应用服务器、管理服务器,与数据库服务器,部署在一台机器上,则停掉K/3
Cloud两个后台服务:
K3CloudJobProcess, K3CloudManager,改为手动启动并停止服务;

3. 停止IIS
Admin Service服务,并改为手动;


 
2016-3-7 09:33 上传
下载附件 (171.1
KB) 

4. 重启数据库服务器;

5. 到Windows服务列表,停止SQL
Server相关的多个服务。直接停止即可,无需改为手动;


 

6. 打开数据库活动与监视器:


 

7. 找到目标数据库(数据中心实体库),结束进程。


 

如上截图,仅用于演示如何结束数据库,请不要按照此图所示,结束master数据库。
应该结束的是数据中心实体库AISxxxxx。

8. 执行SQL语句:

use master;
alter database AIS20160127100532 set
read_committed_snapshot on;

9. 重启数据库服务器,重启应用服务器,并回复被停止的Window服务。

本地按照上述步骤成功切换数据库隔离界别,SQL语句执行非常快。

正常情况下,这语句很快就可以执行完毕。如果很长时间没有反应,还是有连接没有停掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: