--===============================================
對復制一直屬於一知半解渾渾噩噩的狀態,僅知道一些皮毛,對很多細節沒有深入學習過,
如果不對之處,請各位大神批評指正。
*以下討論的基於事務復制,不考慮同步存儲過程的情況
--===============================================
當發布數據庫上發生數據修改(增刪改)時,會將相關操作寫入日志,以保證數據一致性,而對發布表上聚集索引的修改的日志會被標記為‘REPLICATE’。
(PS:從上圖中不難看出,在checkpoint時會記錄復制相關的信息)
標記為‘REPLICATE’的日志會被日志讀取代理器讀取,轉換成復制事務和命令,然后寫入到分發庫中的表dbo.MSrepl_transactions和dbo.MSrepl_commands。
為保證訂閱服務器上的數據一致性,日志讀取代理默認情況下不會將發布數據庫中的事務拆分成多個事務存放到分發數據庫(可以修改日志讀取代理中的MaxCmdsInTran默認值來拆分大事務)
針對事務中修改的每一行數據生成一條或多條復制命令,尤其是對varchar(max)+xml+text等大字段操作(再次感謝肖磊)。
--===================================== --插入一條數據,生成16條復制命令 INSERT INTO [TestDemo].[dbo].[TB5](C1,C2) SELECT REPLICATE('AC',10000),1 --查看生成的復制事務和命令 SELECT * FROM dbo.MSrepl_transactions SELECT * FROM dbo.MSrepl_commands T WHERE T.xact_seqno=0x00000100000002BA0020
默認日志讀取代理配置中,日志讀取代理會以間隔5秒的頻率查詢發布庫日志(PollingInterval),每個處理周期從發布數據庫的事務日志中讀取至多500條事務。當發布服務器上運行大事務時,會導致單個處理周期讀取過多事務日志,因此應盡量避免對發布庫做大事務修改(PS:大事務對訂閱數據庫也會造成影響)
PS:設置代理參數ReadBatchThreshold來控制單個處理周期讀取最大的命令數(我沒在生產服務器上設置過,但發現一片關於這個設置的文章:http://connect.microsoft.com/SQLServer/feedback/details/478792/using-the-readbatchthreshold-parameter-in-logreader-agent-leads-to-slow-performance)
如果發布數據庫上事務變更比較頻繁時,可以修改PollingInterval參數的值來降低復制延遲(Paddy_張充在生產服務器上配置過)。過小的PollingInterval值會加重發布服務器負載。
當發布數據庫上的事務日志被日志讀取代理讀取后,日志便可以由checkpoint或日志備份截斷。
對於復制事務和復制命令,分發代理按照配置參數CommitBatchSize(默認100)和CommitBatchThreshold(默認1000)來將事務打包成一個bacth提交給訂閱服務器(肖磊如是說:同時指定CommitBatchSize和CommitBatchThreshold時,也會出現不到命令數和事務數就提交給訂閱服務器),分發代理作業按照指定的調度運行。
在分發服務器上,復制清理作業默認按照每10分鍾一次的頻率執行,查找移除那些無需保留的事務和命令。復制事務和復制命令會按照分發服務器屬性設置中指定“事務保持期”來存放,當超過最大事務保持期后,復制事務和復制命令會被清除,未同步的訂閱會被標記為“過期”。
如果創建發布時未選擇“立即初始化”(發布屬性immediate_sync為false)時,復制事務和復制命令已傳遞給所有訂閱,且存放時間超過最小“事務保持期”,復制事務和復制命令便可以被復制清理作業刪除。(PS:清理作業不會清楚最后一條事務事務及其相關命令)
--===================================================================
MSDN 快速通道
鏈接:http://msdn.microsoft.com/zh-cn/library/bb522755.aspx
=====================================================================
日志讀取器代理相關配置
MaxCmdsInTran:number_of_commands
默認值:0
指定在日志讀取器將命令寫入到分發數據庫時可分組到一個事務中的語句的最大數目。 如果使用此參數,在發布服務器上的大事務(包含許多命令)應用於訂閱服務器時,日志讀取器代理和分發代理可將這些大事務拆分為若干個較小的事務。 指定此參數可以減少分發服務器的爭用問題並縮短發布服務器與訂閱服務器之間的滯后時間。 由於初始事務是以較小的單元應用的,訂閱服務器可以在初始事務結束之前訪問一個較大的邏輯發布服務器事務的行,因而會破壞事務的原子性。 默認值為 0,這將保持發布服務器的事務邊界。
PollingInterval: polling_interval
默認配置值:5秒
對日志進行已復制事務查詢的頻率(以秒計)。
ReadBatchSize:number_of_transactions
默認值:500
每個處理周期從發布數據庫的事務日志中讀取的最大事務數目。代理不斷讀取批次中的事務,直到從該日志中讀取所有事務為止。 Oracle 發布服務器不支持該參數。
ReadBatchThreshold:number_of_commands
默認值:0
在復制命令由分發代理發送給訂閱服務器之前,從事務日志讀取的復制命令的數目。 如果未指定此參數,日志讀取器代理會一直讀取完此日志,或者讀取到 -ReadBatchSize 中指定的數字(事務數)為止。
==============================================================
分發復制代理相關配置
BcpBatchSize:bcp_batch_size
默認值:2147473647
在一次大容量復制操作中發送的行數。 執行 bcp in 操作時,批的大小為要作為一個事務發送到服務器的行數,並且也是分發代理記錄 bcp 進度消息之前必須發送的行數。 當執行 bcp out 操作時,將使用固定批大小 1000。
CommitBatchSize:commit_batch_size
默認值:100
發出 COMMIT 語句前要發給訂閱服務器的事務數。
CommitBatchThreshold:commit_batch_threshold
默認值:1000
發出 COMMIT 語句前要發給訂閱服務器的復制命令數。
MaxBcpThreads:number_of_threads
默認值:處理器數目的 2 倍,最大值為 8。
指定可以並行執行的大容量復制操作的數量。 同時存在的線程和 ODBC 連接的最大數量為 MaxBcpThreads 或顯示在分發數據庫中同步事務中的大容量復制請求數中較小的那一個。 MaxBcpThreads 的值必須大於 0,並且不存在任何硬編碼的上限。 應用於使用並發快照選項在發布服務器上生成的快照時,不管為 MaxBcpThreads 指定了什么數值,都將使用一個線程。
MaxDeliveredTransactions:number_of_transactions
默認值:0
一次同步期間應用於訂閱服務器的推送事務或請求事務的最大數量。 值為 0,表示最大值為無窮多個事務。 訂閱服務器可使用其他值縮短從發布服務器請求的同步的持續時間。
如果MaxDeliveredTransactions設置為非0,即使訂閱配置為連續運行,在傳遞指定數量的事務后,分發代理便會停止運行,需要重新手動啟動。
PollingInterval:polling_interval
默認值:5 秒。
對分發數據庫進行已復制事務查詢的頻率(以秒計)。
--=====================================================================
慣例依舊是妹子