本主題僅適用於使用完整或大容量日誌恢復模式的 SQL Server 資料庫。
當您對兩個或多個 資料庫進行相關更新時,可以使用交易標記將其復原到邏輯一致點。 不過,此復原會遺失在用作恢復點的標記之後認可的任何交易。 只有在測試相關資料庫或願意遺失最近認可的交易時,才適合標記交易。
定期標記每個相關資料庫中的相關交易,會在資料庫中建立一系列常見的恢復點。 交易標記會記錄在事務歷史記錄中,並包含在記錄備份中。 發生災害時,您可以將每個資料庫還原到相同的交易標記,以將它們復原到一致點。
備註
不同資料庫的記錄備份可以彼此獨立建立,而且不需要同時進行。
在下列案例中復原相關資料庫時,您必須已在每個相關資料庫中標示交易:
一或多個事務歷史記錄會終結。 您必須在上次記錄備份時,將資料庫集合還原為一致的狀態。
您必須將整個資料庫集合還原到一些稍早時間點的相互一致狀態。
這很重要
您只能將相關的資料庫復原到標示的交易,而不是復原到特定時間點。
如需有關如何建立標記交易的資訊,請參閱本主題中稍後的「建立標記交易」。
使用標示交易的一般案例
使用標示交易的一般案例包括下列步驟:
建立每個相關資料庫的完整或差異資料庫備份。
標記所有資料庫中的交易區塊。
備份所有資料庫的事務歷史記錄。
使用NORECOVERY還原資料庫備份。
使用STOPATMARK還原記錄。
使用標示交易的考慮
將具名標記插入事務歷史記錄之前,請考慮下列事項:
因為交易標示須耗用記錄空間,所以除非它們在資料庫復原策略中扮演重要的角色,否則不應使用交易標示。
標示的交易認可之後,會在 msdb 的 logmarkhistory資料表中插入一個資料列。
如果標示交易跨越同一資料庫伺服器或不同伺服器上的多個資料庫,則標示會記錄在所有受影響的資料庫之記錄中。
建立標示的交易
若要建立標示的交易,請使用 BEGIN TRANSACTION 語句和 WITH MARK [description] 子句。 選擇性 描述 是標記的文字描述。 交易需要一個標記名稱。 標記名稱可以重複使用。 事務歷史記錄會記錄標記名稱、描述、資料庫、使用者、日期時間資訊,以及記錄序號 (LSN)。 日期時間資訊會與標記名稱一起使用,以唯一識別標記。
若要在一組資料庫中建立標示的交易:
將 BEGIN TRAN 語句中的交易命名為 ,並使用 WITH MARK 子句
您可以在現有交易處理內嵌套語句 BEGIN TRAN new_mark_name WITH MARK。 new_mark_name的值是交易的標記名稱,即使該交易具有交易名稱也是如此。
備註
如果您發出第二個巢狀 BEGIN TRAN...WITH MARK 會略過該語句,但會產生警告訊息。
針對集合中的所有資料庫執行更新。
特定交易的標記只會插入至執行 BEGIN TRAN...WITH MARK 語句的伺服器實例上的交易紀錄檔中。 交易標記會放置於該伺服器實例上被標記的交易所更新之每個資料庫的交易日誌中。 如果資料庫位於不同的伺服器實例上,則必須在每個伺服器實例上建立相同的標記。
範例
下列範例會將事務歷史記錄還原至標示之交易中名為 ListPriceUpdate的標記。
USE AdventureWorks
GO
BEGIN TRANSACTION ListPriceUpdate
WITH MARK 'UPDATE Product list prices';
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
COMMIT TRANSACTION ListPriceUpdate;
GO
-- Time passes. Regular database
-- and log backups are taken.
-- An error occurs in the database.
USE master
GO
RESTORE DATABASE AdventureWorks
FROM AdventureWorksBackups
WITH FILE = 3, NORECOVERY;
GO
RESTORE LOG AdventureWorks
FROM AdventureWorksBackups
WITH FILE = 4,
RECOVERY,
STOPATMARK = 'ListPriceUpdate';
強制標記散佈至其他伺服器
交易標記名稱不會在交易分散到另一部伺服器時自動散發。 若要強制標記傳播至其他伺服器,必須寫入包含 BEGIN TRAN 名稱 WITH MARK 語句的預存程式。 然後,該預存程式必須在源伺服器中交易範圍下的遠端伺服器上執行。
例如,請考慮存在於多個 SQL Server 實例上的分割資料庫。 在每個實例上都有一個名為coyote的資料庫。 首先,在每個資料庫中,建立預存程式,例如 sp_SetMark。
CREATE PROCEDURE sp_SetMark
@name nvarchar (128)
AS
BEGIN TRANSACTION @name WITH MARK
UPDATE coyote.dbo.Marks SET one = 1
COMMIT TRANSACTION;
GO
接下來,建立名為 sp_MarkAll 的預存程式,其中包含將標記放置於每個資料庫的交易。
sp_MarkAll 可以從任何實例執行。
CREATE PROCEDURE sp_MarkAll
@name nvarchar (128)
AS
BEGIN TRANSACTION
EXEC instance0.coyote.dbo.sp_SetMark @name
EXEC instance1.coyote.dbo.sp_SetMark @name
EXEC instance2.coyote.dbo.sp_SetMark @name
COMMIT TRANSACTION;
GO
Two-Phase 提交
認可分散式交易會在兩個階段進行:準備和認可。 認可標示的交易時,標記交易中每一個資料庫的認可記錄檔記錄會放在記錄檔中,而記錄檔中沒有任何不確定的交易。 此時,保證沒有交易顯示為一個記錄中已認可,但不會在另一個記錄中認可。
下列步驟會在認可標示的交易期間完成此作業:
標示交易的準備階段會停止所有新的準備和認可。
只允許認可已備妥的交易繼續。
標示交易之後會等候所有備妥的交易清空(逾時)。
標示的交易已備妥並認可。
已移除新的準備和認可停滯。
由跨越多個資料庫之標示的交易所產生的停滯,可減少伺服器的事務處理效能。
我們建議您不要執行並行標示的交易。 罕見但有可能的是,分散式標記交易在提交時會與其他同時提交的分散式標記交易發生死結。 發生這種情況時,會選擇標記交易做為死結犧牲者,並回復。 發生此錯誤時,應用程式可以重試標示的交易。 當多個標示的交易嘗試同時認可時,死結的機率較高。
恢復至已標記的交易
如需如何將包含已標示交易的資料庫復原到特定標記之前,請參閱 復原包含標示交易的相關資料庫。
另請參閱
BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
系統資料庫的備份與還原 (SQL Server)
BEGIN TRANSACTION (Transact-SQL)
套用交易記錄備份 (SQL Server)
完整資料庫備份 (SQL Server)
RESTORE (Transact-SQL)
復原包含標示之交易的相關資料庫