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模式。
SDUT 迷之好奇
include include int top struct node st 5001000 int creat void insertt int root,char s st root flag root st root next t int cmp char s,int root root st...
貪心之迷瘴
迷瘴 time limit 1000 ms memory limit 65536 kib submit statistic discuss problem description 通過懸崖的yifenfei,又面臨著幽谷的考驗 幽谷周圍瘴氣瀰漫,靜的可怕,隱約可見地上堆滿了骷髏。由於此處長年不見天日...
迷之階梯 ladder
問題描述 在經過地球防衛小隊的數學家連續多日的工作之後,外星人發的密碼終於得以破解。它 告訴我們在地球某一處的古老遺跡中,存在有對抗這次災難的秘密道具。防衛小隊立刻派出 了乙個 小分隊,迅速感到了這處遺跡。要進入遺跡,需要通過一段迷之階梯。登上階 梯必須要按照它要求的方法,否則就無法登上階梯。它要求...