如何修改資料庫的快照隔離級別
阿新 • • 發佈:2019-01-23
背景說明:
經常接到現場反饋,執行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語句執行非常快。
正常情況下,這語句很快就可以執行完畢。如果很長時間沒有反應,還是有連線沒有停掉。
經常接到現場反饋,執行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
但是,執行此語句時,必須關掉資料庫的全部連結,否則語句執行時,會一直卡在那裡。
請按照如下步驟,停掉全部資料庫連結後,再執行此語句:
1. 如果應用伺服器、管理伺服器部署在其他機器上,則停掉應用伺服器、K/3 Cloud管理伺服器:關機;
2. 如果應用伺服器、管理伺服器,與資料庫伺服器,部署在一臺機器上,則停掉K/3 Cloud兩個後臺服務:
K3CloudJobProcess, K3CloudManager,改為手動啟動並停止服務;
3. 停止IIS Admin Service服務,並改為手動;
2016-3-7 09:33 上傳
下載附件
4. 重啟資料庫伺服器;
5. 到Windows服務列表,停止SQL Server相關的多個服務。直接停止即可,無需改為手動;
6. 開啟資料庫活動與監視器:
7. 找到目標資料庫(資料中心實體庫),結束程序。
如上截圖,僅用於演示如何結束資料庫,請不要按照此圖所示,結束master資料庫。
應該結束的是資料中心實體庫AISxxxxx。
8. 執行SQL語句:
use master;
alter database AIS20160127100532 set read_committed_snapshot on;
9. 重啟資料庫伺服器,重啟應用伺服器,並回覆被停止的Window服務。
本地按照上述步驟成功切換資料庫隔離界別,SQL語句執行非常快。
正常情況下,這語句很快就可以執行完畢。如果很長時間沒有反應,還是有連線沒有停掉。