搜尋本站文章

2010-05-11

在「資料庫鏡像」上,啟用「讀取認可快照(Read Committed Snapshot)」。遭遇錯誤:訊息 1468,層級 16,狀態 4,因為它牽涉到資料庫鏡像工作階段(because it is involved in a database mirroring session)。

若在「資料庫鏡像」組態上,直接對「主體資料庫」啟用「讀取認可快照(Read Committed Snapshot)」。
請參考以下的範例來啟用「讀取認可快照」:



--啟用資料列版本控制的讀取認可快照(READ_COMMITTED_SNAPSHOT)
USE master
GO
ALTER DATABASE <資料庫>
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO


可能會遭遇到以下的錯誤訊息與下圖所示:



訊息 1468,層級 16,狀態 4,行 1
無法在資料庫 "Northwind_DatabaseMirroring" 上執行作業,因為它牽涉到資料庫鏡像工作階段。
訊息 5069,層級 16,狀態 1,行 1
ALTER DATABASE 陳述式失敗。
--
訊息 1468,層級 16,狀態 4,行 1
The operation cannot be performed on database "Northwind_DatabaseMirroring" because it is involved in a database mirroring session.
訊息 5069,層級 16,狀態 1,行 1
ALTER DATABASE statement failed.













在設定 READ_COMMITTED_SNAPSHOT 資料庫選項設為 ON ,只允許使用執行 ALTER DATABASE 命令的連接。在 ALTER DATABASE 完成以前,資料庫中不可以有其他開啟的連接。資料庫不一定要處於單一使用者模式。

在「資料庫鏡像」機制上,「主體資料庫」與「鏡像資料庫」之間有「資料庫鏡像工作階段」的連線,所以,這應該可以預期會發生的情形。







若要在「資料庫鏡像」組態上,直接對「主體資料庫」啟用「讀取認可快照」功能。

請參考以下的流程:

  • 工作1:中斷「資料庫鏡像工作階段」。
  • 工作2:設定啟用「讀取認可快照」。
  • 工作3:重建「資料庫鏡像工作階段」。


工作1:中斷「資料庫鏡像工作階段」
可以使用兩種方式:
(1)使用 SSMS 管理工具,對「主體資料庫」,執行「移除鏡像」。請參考下圖所示:




(2)在「主體資料庫」上,執行以下的範例程式碼:
USE master
GO
ALTER DATABASE 
SET PARTNER OFF
GO


工作2:設定啟用「讀取認可快照」
對「主體資料庫」,執行以下的範例程式碼:

--啟用資料列版本控制的讀取認可快照(READ_COMMITTED_SNAPSHOT)
USE master
GO
ALTER DATABASE Northwind_DatabaseMirroring
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO

--查詢是否有啟用「讀取認可快照」
SELECT name N'資料庫', snapshot_isolation_state N'快照集隔離交易狀態',
snapshot_isolation_state_desc N'快照集隔離交易狀態的描述',
is_read_committed_snapshot_on N'啟用讀取認可快照'
FROM sys.databases
ORDER BY 4 DESC


請參考下圖所示:


工作3:重建「資料庫鏡像工作階段」
可以使用兩種方式:
(1)使用 SSMS 管理工具,執行「設定資料庫鏡像安全性精靈」來重新建立「資料庫鏡像工作階段」。
(2)使用以下的範例程式碼:
USE master
GO
ALTER DATABASE 
SET PARTNER = <....>
GO



由上,已經完成在「資料庫鏡像」上,啟用「讀取認可快照(Read Committed Snapshot)」組態的作業。




參考資料:
Database Engine 中的隔離等級
http://msdn.microsoft.com/zh-tw/library/ms189122.aspx

Database Engine 中資料列版本控制式的隔離等級
http://msdn.microsoft.com/zh-tw/library/ms179599.aspx

啟用資料列版本控制式的隔離等級
http://msdn.microsoft.com/zh-tw/library/ms175095.aspx

How to Enable RCSI for a Database with Database Mirroring
http://blogs.msdn.com/sqlcat/archive/2010/03/16/how-to-enable-rcsi-for-a-database-with-database-mirroring.aspx