備份和還原資料庫
與任何實際執行的資料庫相同,涉入同步處理的資料庫應該要定期備份。如果您必須從備份還原資料庫,就有兩大主要考量:
還原之後在資料庫中所進行的變更,可能未傳播到用戶端或其他對等,這是因為從資料庫選取變更時所使用的 timestamp 值。
例如,在用戶端與伺服器同步處理期間,Sync Framework 會從伺服器資料庫擷取新錨定值,並儲存於用戶端資料庫中。這個值是用來做為目前正在進行同步處理的變更集上限 (Upper Bound)。如需詳細資訊,請參閱 追蹤伺服器資料庫中的變更。還原伺服器資料庫之後,儲存於用戶端資料庫中的值在邏輯上可能會在由伺服器資料庫所傳回的值之前。
在上傳和雙向同步處理案例中,用戶端或其他對等可能會包含新近還原之資料庫所沒有的變更。
本主題中的範例將以用戶端與伺服器同步處理為例。相同的原則適用於點對點同步處理,並且將描述點對點考量事項。伺服器資料庫是遠端對等。用戶端資料庫是本機對等。如需備份和還原使用 SqlSyncProvider 所同步處理之 SQL Server 資料庫的詳細資訊,請參閱 HOW TO:備份和還原資料庫 (SQL Server)。
伺服器資料庫
若要了解邏輯上用戶端資料庫如何能夠在伺服器資料庫之前,請考慮在 Sync Framework 範例資料庫中的 Sales.Customer 資料表追蹤更新的方式。UpdateTimestamp 資料行儲存 timestamp 值,而新的錨定 (Anchor) 命令會從 SQL Server MIN_ACTIVE_ROWVERSION 函式傳回值。為求清楚明瞭,範例中使用了整數而不使用十六進位值:
在還原資料庫之前,MIN_ACTIVE_ROWVERSION 傳回值 31。這個值是儲存於用戶端資料庫做為最後接到的錨定。
在還原資料庫之後,MIN_ACTIVE_ROWVERSION 傳回值 19。
此時會進行更新,讓 UpdateTimestamp 資料行中的 timestamp 值達到 32。
同步處理發生後,MIN_ACTIVE_ROWVERSION 傳回值 32。Sales.Customer 的最後更新會下載,因為 32 大於最後接到的描定值 31。19 與 31 之間的更新不會識別為變更。
使用邏輯時鐘 (如時間戳記) 的任何追蹤結構描述可能會受此無法辨識的變更問題影響。使用日期和時間架構資料型別的結構描述則不受影響,因為「掛鐘」(Wall Clock) 會繼續向前走而與資料庫狀態無關。在對等同步處理中,變更追蹤需要時間戳記。
若要處理因時間戳記產生的問題,請執行下列其中一個方法:
將伺服器時間戳記往上帶到還原作業之前的情形。在先前的範例中,您可以在其他資料表上執行虛擬更新,直到 MIN_ACTIVE_ROWVERSION 傳回 31 為止。
這是建議用於對等同步處理的做法。
儲存伺服器上每個用戶端的錨定。在先前的範例中,從備份接到的最後錨定是 19。因此,後續更新將可進行識別,並會下載 19 與 32 之間的所有變更,Sync Framework 不提供這種內建支援,但是您可以下列方式在伺服器上建立系統:
在每個用戶端有一個資料列的伺服器資料庫中建立資料表。資料表會包含附 Sync Framework 為每個用戶端所產生識別碼的資料行,以及附該用戶端錨定的資料行。在同步處理期間,應用程式會以新的錨定值更新此資料行。
變更同步處理命令,為進行同步處理的用戶端選取最低錨定值。此值可以是儲存於用戶端資料庫中的值,或是儲存於伺服器資料庫中的值。在資料庫還原作業之後,伺服器資料庫中的值應該會較低。如果將值寫入伺服器資料表之後,但在變更套用至用戶端之前,發生失敗,則用戶端資料庫中的值應該較低。如果同步處理如預期發生,值應該相等。插入命令可以如下寫入:
SELECT CustomerId, CustomerName, SalesPerson, CustomerType FROM Sales.Customer WHERE (InsertTimestamp > (SELECT AnchorValue from ServerAnchorTable WHERE ClientId = @sync_client_id) OR InsertTimestamp > @sync_last_received_anchor) AND InsertTimestamp <= @sync_new_received_anchor AND InsertId <> @sync_client_id
用戶端資料庫
在伺服器資料庫還原到與同步處理中繼資料相關時的當前狀況之後,資料庫可能仍然缺少自伺服器備份以來在用戶端上所做的變更。用戶端若要適當回應,該用戶端必須知道伺服器資料庫已還原。您可以使用伺服器端追蹤資料表,指出自上次特定用戶端同步處理以來,是否已發生還原。在每個同步處理工作階段期間,用戶端應用程式會先檢查此資料表,判斷它能否正常同步處理,或者應該執行特殊程式碼,以使用還原的資料庫。
用戶端應用程式識別出伺服器資料庫已還原之後,該應用程式就可以讓用戶端和伺服器資料庫進行聚合。有多種方式可以完成這項作業,其中包括下列做法:
透過卸除所有資料表,然後與伺服器同步處理,重新初始化用戶端資料庫。這是最簡單的做法,但是任何用戶端變更都會失去。
建議在對等同步處理中使用重新初始化的做法。如需初始化對等資料庫的詳細資訊,請參閱 HOW TO:設定及執行共同作業同步處理 (非 SQL Server)中的<初始化伺服器資料庫>。
在您建立用戶端資料表複本之後,重新初始化用戶端資料庫。應用程式可以使用如下步驟:
識別伺服器資料庫已還原。
製作用戶端資料庫中所有資料表的複本,然後卸除原始資料表。
與伺服器同步處理,下載新的結構描述和資料。
比較新資料表中的資料列與所製作的複本。
識別兩組資料表之間的任何差異,並將所需要的任何變更套用至新資料表。
再次同步處理,上傳套用至新資料表的變更。