如何修改数据库的快照隔离级别
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服务,并改为手动;
![](http://images.kisdee.com/club/attachments/forum/201603/07/093314xt448m4q8mrqgrmh.png)
2016-3-7 09:33 上传
下载附件 (171.1
KB)
4. 重启数据库服务器;
5. 到Windows服务列表,停止SQL
Server相关的多个服务。直接停止即可,无需改为手动;
![](http://images.kisdee.com/club/attachments/forum/201603/07/093312g7vi48uv56hh5yl7.png)
6. 打开数据库活动与监视器:
![](http://images.kisdee.com/club/attachments/forum/201603/07/093313timziuuu6mmk6kum.png)
7. 找到目标数据库(数据中心实体库),结束进程。
![](http://images.kisdee.com/club/attachments/forum/201603/07/093314xut4ka5luz14uh7z.png)
如上截图,仅用于演示如何结束数据库,请不要按照此图所示,结束master数据库。
应该结束的是数据中心实体库AISxxxxx。
8. 执行SQL语句:
use master;
alter database AIS20160127100532 set
read_committed_snapshot on;
9. 重启数据库服务器,重启应用服务器,并回复被停止的Window服务。
本地按照上述步骤成功切换数据库隔离界别,SQL语句执行非常快。
正常情况下,这语句很快就可以执行完毕。如果很长时间没有反应,还是有连接没有停掉。
经常接到现场反馈,执行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服务,并改为手动;
![](http://images.kisdee.com/club/attachments/forum/201603/07/093314xt448m4q8mrqgrmh.png)
2016-3-7 09:33 上传
下载附件 (171.1
KB)
4. 重启数据库服务器;
5. 到Windows服务列表,停止SQL
Server相关的多个服务。直接停止即可,无需改为手动;
![](http://images.kisdee.com/club/attachments/forum/201603/07/093312g7vi48uv56hh5yl7.png)
6. 打开数据库活动与监视器:
![](http://images.kisdee.com/club/attachments/forum/201603/07/093313timziuuu6mmk6kum.png)
7. 找到目标数据库(数据中心实体库),结束进程。
![](http://images.kisdee.com/club/attachments/forum/201603/07/093314xut4ka5luz14uh7z.png)
如上截图,仅用于演示如何结束数据库,请不要按照此图所示,结束master数据库。
应该结束的是数据中心实体库AISxxxxx。
8. 执行SQL语句:
use master;
alter database AIS20160127100532 set
read_committed_snapshot on;
9. 重启数据库服务器,重启应用服务器,并回复被停止的Window服务。
本地按照上述步骤成功切换数据库隔离界别,SQL语句执行非常快。
正常情况下,这语句很快就可以执行完毕。如果很长时间没有反应,还是有连接没有停掉。
相关文章推荐
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
- mariadb10.1.13GTID实现主从复制
- [置顶] NoSql之深入浅出redis
- 构建高性能web之路------mysql读写分离实战
- Amoeba for MySQL读写分离配置
- mysql 主从策略
- Redis的常用方法总结
- SQLITE中文编码转换问题
- CentOS 6 使用 yum 安装MongoDB及服务器端配置
- mysql不同版本varchar长度的不同含义
- sql之left join、right join、inner join的区别
- IIS中发布后出现Could not load file or assembly'System.Data.SQLite.dll' or one of its depedencies
- MySQL常用解决方案
- mysql if函数 concat 函数 和substring 函数
- mysql深入——数据库函数
- 在VS2008下编译出sqlite3.dll和sqlite3.lib
- 应对 Memcached 缓存失效,导致高并发查询 DB 的几种思路
- SQL基本操作
- 直接领券TPS低-sql优化过程分析
- Excel批量数据导入Oracle