1. 程式人生 > >sqlserver 開啟快照

sqlserver 開啟快照

同事總結的 記錄之
(1).開啟快照:
在master資料庫執行如下:
ALTER DATABASE [dbname] SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE [dbname] SET READ_COMMITTED_SNAPSHOT ON;
在nc資料庫下執行如下:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

說明:以上三句指令碼可以確定開啟已提交讀隔離級別快照(即使人為修改為snapshot模式情況下)


(2).切換模式
--預設是read committed,所以以下不用修改;僅在被人為修改為snapshot時的情況下用
//切換成:已提交讀隔離快照(語句級)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
//切換成:快照事務級別
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

//檢視當前模式(是事務級快照還是已提交讀隔離級別快照)
DBCC Useroptions --預設是read committed

(3).檢視是否開啟
//檢視當前是否開始快照(事務快照和已提交讀隔離快照)
select name,user_access,user_access_desc,snapshot_isolation_state,snapshot_isolation_state_desc,is_read_committed_snapshot_on from sys.databases

附:遇到問題及解決方案
(4).如果(1)開啟快照指令碼執行時有其它資料庫連線,可以嘗試如下:
1問題解決. 停止NC服務,多個應用都要停止。
2. 重啟sql server資料庫
3. 殺掉當前資料庫所有session
declare @kid varchar(8000)
set @kid=''
select @

[email protected]+' kill '+cast(spid as varchar(8))
from master..sysprocesses
where dbid=db_id('ncdb')
exec(@kid)
4. 快照指令碼(慎用,有時候不容易切換回單使用者,優先檢查前面幾個步驟沒問題)
I.ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;
II. ---(1)中的三句開啟快照指令碼---
III.ALTER DATABASE [dbname] SET MULTI_USER;