Alter database Set Single_User

对于任何DBA来说,恐怕都不陌生。在我们需要获取数据库独占访问权来做一些数据库紧急维护的时候,这可能是大多数DBA的首选,但它真的可以实现“独占访问权”吗?

这次我们聊聊Single_User是如何刷新我们认知的

=============================================华丽丽的分割线=============================================

实验目的:测试Single_User模式下是否可以拿到独占权并为所欲为。

照例交代一下我们的环境:Windows 10 + SQL Server 2019,实际上本次实验的结果基本上是覆盖SQL Server全部版本的

并发测试工具:SQLQueryStress(0.9.7.79)

我们先看一下在单用户模式下,持有锁的情况

从上图可以看到,在成功置为Single_User模式后,我们拥有了一个执行Session(id=60)上,DB级别的S锁

这时,我们开启SQLQueryStress,设置查询语句,并发线程数为2,迭代5000次

再次查询持有锁的情况

Session 71、72是我们压力测试工具设置2个线程产生的,可以看到,除了持有S锁外,他们各自还正在申请X锁,只是相互等待而形成了死锁

由上图可以看到,XEvents中存在大量死锁信息,且下图可以看到死锁的细节信息,由Session 71、72导致

此时,当我们再次准备从Session 60中执行语句,将数据库置为Multi_User时,错误发生了:

Session 60也被死锁牺牲了。由此看来,我们并没有真正的获取数据库的“独占访问权”

=============================================华丽丽的分割线=============================================

分析 & 结论:

1、将数据库置为单用户模式在我们长期的认知中,都是绝对的“独占访问权”。但实际上,在有并发+连续访问的情况下,我们仍有可能因外部访问的死锁而丢掉这个“独占访问权”

2、进一步分析,从将数据库置为单用户模式的时候,数据库系统没有直接将Session的锁级别提升至最高(个人理解,从Alter Database触发的动作,置为SCH-X都不为过),而是温和的放置了DB级的S锁,同时对其他访问相同数据库的请求则要求申请X锁,这就导致了,当外部请求访问数据库时,先放置DB级S锁(这里和Single User Session 的DB级S锁且兼容),而后因为要申请X锁,所以和其他访问同样数据库的请求达成了死锁条件。

3、如果在应急处置中仍需要将DB置为Single User模式,建议停掉外部访问(停账号,修改实例端口号,关闭TCP\IP,禁用外部访问网卡,或者修改数据库名称),以免无法置回Multi User模式。

迷之自信的Single_User Mode的更多相关文章

  1. 关于我的OI生涯(AFO){NOIP2016 后}

    这篇我就随意写啦~不用统一的“题解”形式.♪(^∀^●)ノ 也分好几次慢慢更吧~ 对于NOIP2016的总结,我本想善始善终back回,但是心情不足以支撑我,那就只能有始有终了......下面进入我的 ...

  2. 并查集(union-find set)与Kruskal算法

    并查集 并查集处理的是集合之间的关系,即‘union' , 'find' .在这种数据类型中,N个不同元素被分成若干个组,每组是一个集合,这种集合叫做分离集合.并查集支持查找一个元素所属的集合和两个元 ...

  3. Grapher--寂寞无名的神器

    承自上一篇中的函数图形,有人问,能不能别把画个图搞那么复杂,我说当然,只要你有一台mac. 话说出来很潇洒的样子,充斥着一股迷之自信. 可能这就是mac用户典型的特征,尽管也许并没有那么值得骄傲. 其 ...

  4. Struts hibernate Spring 框架原理

    转自:http://www.cnblogs.com/javaNewegg/archive/2011/08/28/2156521.html 原理:1.通过Configuration().configur ...

  5. 《剑指offer》面试题39 二叉树的深度(java)

    摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...

  6. Bzoj4763 雪辉

    Time Limit: 39 Sec  Memory Limit: 666 MBSubmit: 151  Solved: 80 Description 上次立下的NOIP退役Flag没有成功   这次 ...

  7. 九月回顾 这篇文章和ACM毫无关系= =

    其实不只是九月的回顾吧,我大概想把暑假到现在10.01发生的啥事儿都说下吧~ 嗯,我是一个比较沙茶的人,不过运气比较好吧. 高中啊,这个谈起来话就长了,在校什么风采之星大赛上,我认识了个妹子,当时感觉 ...

  8. COGS727 [网络流24题] 太空飞行计划

    [问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪 ...

  9. MongoDB的一些操作技巧

    去年三月底入职上海的一家互联网公司,由于项目使用的是MongoDB数据库所以有机会接触了MongoDB.在项目的开发过程中使用系统原有的一些方法查询MongoDB感觉很费力,用起来也不爽,所以私下里就 ...

随机推荐

  1. CSS的引入与选择器

    CSS的引入与选择器 CSS与HTML的关系 Cascading Style Sheet 即层叠样式表 在上一篇文中,已经介绍了一些非常常用的HTML标签,接下来将步入CSS的学习,如果将单纯HTML ...

  2. Linux 下载工具推荐: Motrix && qbittorrent

    Linux下载介绍 Linux下其实下载工具还是蛮多的, 命令行的wget,curl,aria2,甚至于apt 但是个人日常使用下还是有图形化界面比较方便易用.大多数教程里推荐的Uget,可能是我也不 ...

  3. 关于Pop!_OS 19.04有线网络始终正在连接

    一开始使用Pop!_OS时就遇到这个问题,开机进入系统后明明网络没问题,WiFi正常可用, 但是插入网线后有线网络始终显示正在连接,然后可能过一会儿还会弹出来网络激活失败. 但是有可能在使用很久之后再 ...

  4. 迎难而上ArrayList,源码分析走一波

    先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个长发飘飘却靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理 ...

  5. SQLite数据库多平台应用及常见错误分析

    SQLite是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的SQL数据库引擎.SQLite是世界上最广泛部署的数据库引擎之一.SQLite源代码开放,没有授权限制.正是因为其免费.轻巧. ...

  6. OSCP Learning Notes - Information Gathering

    Common Tools Google Exploit-DB/Google Hacking DB WHOIS Netcraft theharvester Example: Google search: ...

  7. Spring框架零基础学习(一):IOC|DI、AOP

    文章目录 一.IDEA创建Spring项目 二.Spring: IOC和DI 三.Spring: AOP 参考链接: HOW2J.CN:Spring idea创建一个spring项目 一.IDEA创建 ...

  8. 深入探究JVM之内存结构及字符串常量池

    前言 Java作为一种平台无关性的语言,其主要依靠于Java虚拟机--JVM,我们写好的代码会被编译成class文件,再由JVM进行加载.解析.执行,而JVM有统一的规范,所以我们不需要像C++那样需 ...

  9. php三元运算符?:和??

    1.(expr1) ? (expr2) : (expr3) 在 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3. $a = (expr1) ...

  10. 2020想学习JAVA的同学看过来,最基础的编程CRUD你会了没?

    一 JDBC简介 Java DataBase Connectivity Java语言连接数据库 官方(Sun公司)定义的一套操作所有关系型数据库的规则(接口) 各个数据库厂商去实现这套接口 提供数据库 ...