快照代理準備已釋出表的架構和初始資料檔案以及其他對象、存儲快照檔案并記錄分發資料庫中的同步資訊。 快照代理在分發伺服器上運作;SQLServer2016版本對快照代理做了一些比較好的優化,接下來詳細了解一下快照的執行過程。
在執行快照作業是會在指定的快照目錄生成4種類型的檔案。
BCP檔案:釋出對象的資料檔案。
IDX檔案:索引建立腳本檔案
PRE檔案:複制快照腳本檔案。
SCH檔案:架建構立腳本檔案

-BcpBachSize:每一次執行bcp操作copy的最大記錄行數,預設是10萬行。
-HistoryVerboseLevel:指定在快照操作過程中記錄的曆史記錄大小。
-LoginTimeout:登入逾時前等待的秒數。 預設值為 15 秒。
-QueryTimeOut:查詢逾時前等待的秒數。預設值為 1800 秒
備注:通過右鍵快照代理-快照代理配置檔案;可以配置快照代理。
接下來測試對比2億的記錄表生成快照
2008R2
2016SP1
這裡重點說一下BCP檔案,因為應用快照到訂閱伺服器是以BCP檔案為基本機關,也就是說不管你的BCP檔案有多大都是一次性bulk到訂閱伺服器,是以BCP檔案越大每次應用的時間就會越長。如果一個BCP檔案太大可能會導緻插入到訂閱端失敗。
從上圖可以看到同樣是2億的記錄,2008R2總共有8個BCP檔案,而且最大的BCP檔案大小将近1G其它的都才幾兆;2016有16個BCP檔案,并且前15個都是50M左右資料比較均勻。接下來看下圖的每個BCP檔案的記錄對比。
2008r2
從生成的BCP檔案記錄對比來看:
2008R2:前7個檔案每個檔案記錄數大概70萬左右,最後一個檔案記錄1.1億。
2016:前15個檔案每個檔案記錄700萬左右,最後一個檔案78萬。
說明:
2008R2前7個檔案每個檔案大概存儲的記錄量是70萬剩下的記錄都會存儲到最後一個檔案,是以2008R2比較适合的表記錄數是600萬左右。
2016前15個檔案每個檔案大概存儲的記錄量是700萬剩下的記錄都會存儲到最後一個檔案,2016适合的表記錄數1.2億左右。
共同缺點:表記錄超過“适合的複制表記錄數”後剩下資料會全部存儲到最後個bcp檔案中。
接下來看一下分發的詳細過程
從2008R2分發記錄過程中可以看到每次BULK都是以bcp檔案為機關,複制最後一個bcp檔案花費了大概22分鐘,而前面的每個檔案都是十幾秒;還是由于我目前的表隻有三個字段而且除了主鍵沒有索引否則的時間就更長了。
複制快照代理是一個可執行檔案,用于準備快照檔案(其中包含已釋出表和資料庫對象的架構及資料),然後将這些檔案存儲在快照檔案夾中,并在分發資料庫中記錄同步作業。
從上圖可以了解整個快照的生成過程。
參數
-?
輸出所有可用的參數。
-Publisher server_name[\instance_name]
釋出伺服器的名稱。 為該伺服器上的 Microsoft SQL Server 預設執行個體指定 server_name。 為該伺服器上的 server_name\instance_name instance_name SQL Server 預設執行個體指定 server_name。
-Publication 釋出
釋出的名稱。 隻有将釋出設定為總是使快照可用于新訂閱或重新初始化的訂閱時,此參數才有效。
-70Subscribers
如果有任何訂閱伺服器在運作 SQL Server 7.0 版,則必須使用此參數。
-BcpBatchSize bcp batch\ size
在一次大容量複制操作中發送的行數。 執行 bcp in 操作時,批的大小為要作為一個事務發送到伺服器的行數,并且也是分發代理記錄 bcp 進度消息之前必須發送的行數。 當執行 bcp out 操作時,将使用固定批大小 1000。 值為 0 表示不記錄任何消息。
-DefinitionFile def_path_and_file_name
代理定義檔案的路徑。 代理定義檔案中包含該代理的指令行參數。 檔案的内容被當作可執行檔案進行分析。 使用雙引号 (") 指定包含任意字元的參數值。
-Distributor server_name[\instance_name]
分發伺服器名稱。 為該伺服器上的 預設執行個體指定 server_name SQL Server 。 為該伺服器上的 server_name\instance_name instance_name SQL Server 預設執行個體指定 server_name。
-DistributorDeadlockPriority [-1|0|1]
死鎖發生時快照代理連接配接到分發伺服器的優先級。 指定此參數是為了解決快照生成期間在快照代理和使用者應用程式之間發生的死鎖問題。
DistributorDeadlockPriority 值
說明
-1
在分發伺服器上發生死鎖時,應用程式而非快照代理優先。
0 (預設值)
未配置設定優先級。
1
在分發伺服器上發生死鎖時,快照代理優先。
-DistributorLogin distributor_login
使用 SQL Server 身份驗證連接配接到分發伺服器時所用的登入名。
-DistributorPassword distributor_password
使用 SQL Server 身份驗證連接配接到分發伺服器時使用的密碼。 。
-DistributorSecurityMode [ 0| 1]
指定分發伺服器的安全模式。 值 0 訓示 SQL Server 身份驗證模式(預設設定),值 1 訓示 Windows 身份驗證模式。
-DynamicFilterHostName dynamic_filter_host_name
-DynamicFilterLogin dynamic_filter_login
-DynamicSnapshotLocation dynamic_snapshot_location
應生成動态快照的位置。
-EncryptionLevel [ 0 | 1 | 2 ]
建立連接配接時快照代理使用的安全套接字層 (SSL) 加密的等級。
EncryptionLevel 值
指定不使用 SSL。
指定使用 SSL,但是代理不驗證 SSL 伺服器證書是否已由可信的頒發者進行簽名。
2
指定使用 SSL,并驗證證書。
-FieldDelimiter field_delimiter
在 SQL Server 大容量複制資料檔案中用于标記字段末尾的字元或字元序列。 預設值為 \n<x$3>\n。
-HistoryVerboseLevel [ 1| 2| 3]
指定在快照操作過程中記錄的曆史記錄大小。 選擇 1可将曆史日志記錄對性能的影響減至最小。
HistoryVerboseLevel 值
進度消息将寫入控制台或輸出檔案。 不在分發資料庫中記錄曆史記錄。
總是更新具有相同狀态(啟動、進行中、成功等)的上一曆史記錄消息。 如果不存在狀态相同的上一記錄,将插入新記錄。
2 (預設值)
除非記錄為空閑消息或長時間運作的作業消息等資訊(此時将更新上一記錄),否則插入新的曆史記錄。
3
始終插入新記錄,除非它與空閑消息有關。
-HRBcpBlocks number_of_blocks
在編寫器線程和讀取器線程之間排隊的 bcp 資料塊的數量。 預設值為 50。 HRBcpBlocks 僅用于 Oracle 釋出。
備注
此參數用于通過 Oracle 釋出伺服器優化 bcp 的性能。
-HRBcpBlockSizeblock_size
每個 bcp 資料塊的大小(以 KB 為機關)。 預設值為 64 KB。 HRBcpBlocks 僅用于 Oracle 釋出。
-HRBcpDynamicBlocks
每個 bcp 資料塊的大小是否可以動态增長。 HRBcpBlocks 僅用于 Oracle 釋出。
-KeepAliveMessageInterval keep_alive_interval
-LoginTimeOut login_time_out_seconds
登入逾時前等待的秒數。 預設值為 15 秒。
-MaxBcpThreads number_of_threads
指定可以并行執行的大容量複制操作的數量。 同時存在的線程和 ODBC 連接配接的最大數量為 MaxBcpThreads 或顯示在分發資料庫中同步事務中的大容量複制請求數中較小的那一個。 MaxBcpThreads 的值必須大于 0 ,并且不存在任何寫死的上限。 預設值為 1。
- MaxNetworkOptimization [ 0| 1]
是否将無關删除操作發送到訂閱伺服器。 無關删除操作是針對不屬于訂閱伺服器分區的行發送到訂閱伺服器的 DELETE 指令。 無關删除操作不會影響資料的完整性或收斂,但它們會導緻不必要的網絡通信。 MaxNetworkOptimization 的預設值是 0。 将 MaxNetworkOptimization 設定為 1 可将不相關的删除操作發生的機會減至最小,進而減少網絡通信,并最大程度地優化網絡。如果存在多個級别的聯接篩選器和複雜子集篩選器,則将此參數設定為 1 還會增加中繼資料的存儲并導緻釋出伺服器性能下降。 您應仔細評估您的複制拓撲,僅當無關删除操作導緻的網絡通信高到無法接受時才應将 MaxNetworkOptimization 設定為 1 。
-Output output_path_and_file_name
代理輸出檔案的路徑。 如果未提供檔案名,則向控制台發送該輸出。 如果指定的檔案名已存在,會将輸出追加到該檔案。
-OutputVerboseLevel [ 0| 1| 2]
指定輸出是否應提供詳細内容。
OutputVerboseLevel 值
僅輸出錯誤消息。
1 (預設值)
輸出所有進度報告消息(預設值)。
輸出所有錯誤消息和進度報告消息,這對于調試很有用。
-PacketSize packet_size
快照代理連接配接到 SQL Server時使用的資料包大小(以位元組為機關)。 預設值為 8192 位元組。
除非您确信能夠提高性能,否則不要更改資料包的大小。 對于大多數應用程式而言,預設資料包大小為最佳數值。
-ProfileName profile_name
指定用于代理參數的代理配置檔案。 如果 ProfileName 為 NULL,則将禁用代理配置檔案。 如果未指定 ProfileName ,則使用該代理類型的預設配置檔案。
-PublisherDB publisher_database
釋出資料庫的名稱。 Oracle 釋出伺服器不支援該參數。
-PublisherDeadlockPriority [-1|0|1]
死鎖發生時快照代理連接配接到釋出伺服器的優先級。 指定此參數是為了解決快照生成期間在快照代理和使用者應用程式之間發生的死鎖問題。
PublisherDeadlockPriority 值
在釋出伺服器上發生死鎖時,應用程式而非快照代理優先。
在釋出伺服器上發生死鎖時,快照代理優先。
-PublisherFailoverPartner server_name[\instance_name]
指定參加與釋出資料庫進行的資料庫鏡像會話的 SQL Server 故障轉移夥伴執行個體。
-PublisherLogin publisher_login
使用 SQL Server 身份驗證連接配接到釋出伺服器時所用的登入名。
-PublisherPassword publisher_password
使用 SQL Server 身份驗證連接配接到釋出伺服器時使用的密碼。 。
-PublisherSecurityMode [ 0| 1]
指定釋出伺服器的安全模式。 值 0 訓示 SQL Server 身份驗證(預設值),值 1 訓示 Windows 身份驗證模式。
-QueryTimeOut query_time_out_seconds
查詢逾時前等待的秒數。預設值為 1800 秒。
-ReplicationType [ 1| 2]
指定複制的類型。 值 1 訓示事務複制,值 2 訓示合并複制。
-RowDelimiter row_delimiter
在 SQL Server 大容量複制資料檔案中用于标記行尾的字元或字元序列。 預設值為 \n<,@g>\n。
-StartQueueTimeout start_queue_timeout_seconds
- UsePerArticleContentsView use_per_article_contents_view
已不推薦使用此參數,支援它是為了能夠向後相容。
由于在生成快照需要擁有對象的架構鎖,是以在生成快照的過程中表對象是隻讀的。如果對大表生成快照千萬不要選擇在業務繁忙的時候否則有可能造成系統癱瘓,2016生成快照的時間比2008要快很多。通過對比可以發現2016的複制生成快照比2008性能提升了很多。但是從2014到2016BCP檔案從32個變成16個不知道是出于什麼原因。
本文轉自pursuer.chen(陳敏華)部落格園部落格,原文連結:http://www.cnblogs.com/chenmh/p/7895991.html,如需轉載請自行聯系原作者