概述
快照代理准备已发布表的架构和初始数据文件以及其他对象、存储快照文件并记录分发数据库中的同步信息。 快照代理在分发服务器上运行;SQLServer2016版本对快照代理做了一些比较好的优化,接下来详细了解一下快照的执行过程。
一、快照代理文件
在执行快照作业是会在指定的快照目录生成4种类型的文件。
BCP文件:发布对象的数据文件。
IDX文件:索引创建脚本文件
PRE文件:复制快照脚本文件。
SCH文件:架构创建脚本文件
二、默认快照代理配置文件
-BcpBachSize:每一次执行bcp操作copy的最大记录行数,默认是10万行。
-HistoryVerboseLevel:指定在快照操作过程中记录的历史记录大小。
-LoginTimeout:登录超时前等待的秒数。 默认值为 15 秒。
-QueryTimeOut:查询超时前等待的秒数。默认值为 1800 秒
备注:通过右键快照代理-快照代理配置文件;可以配置快照代理。
三、对比不同版本快照代理
接下来测试对比2亿的记录表生成快照
1.bcp文件数量对比
2008R2
2016SP1
这里重点说一下BCP文件,因为应用快照到订阅服务器是以BCP文件为基本单位,也就是说不管你的BCP文件有多大都是一次性bulk到订阅服务器,所以BCP文件越大每次应用的时间就会越长。如果一个BCP文件太大可能会导致插入到订阅端失败。
从上图可以看到同样是2亿的记录,2008R2总共有8个BCP文件,而且最大的BCP文件大小将近1G其它的都才几兆;2016有16个BCP文件,并且前15个都是50M左右数据比较均匀。接下来看下图的每个BCP文件的记录对比。
2.快照生成详细过程对比
2008r2
2016SP1
从生成的BCP文件记录对比来看:
2008R2:前7个文件每个文件记录数大概70万左右,最后一个文件记录1.1亿。
2016:前15个文件每个文件记录700万左右,最后一个文件78万。
说明:
2008R2前7个文件每个文件大概存储的记录量是70万剩下的记录都会存储到最后一个文件,所以2008R2比较适合的表记录数是600万左右。
2016前15个文件每个文件大概存储的记录量是700万剩下的记录都会存储到最后一个文件,2016适合的表记录数1.2亿左右。
共同缺点:表记录超过“适合的复制表记录数”后剩下数据会全部存储到最后个bcp文件中。
3.分发对比
接下来看一下分发的详细过程
从2008R2分发记录过程中可以看到每次BULK都是以bcp文件为单位,复制最后一个bcp文件花费了大概22分钟,而前面的每个文件都是十几秒;还是由于我当前的表只有三个字段而且除了主键没有索引否则的时间就更长了。
四、快照生成过程
复制快照代理是一个可执行文件,用于准备快照文件(其中包含已发布表和数据库对象的架构及数据),然后将这些文件存储在快照文件夹中,并在分发数据库中记录同步作业。
从上图可以了解整个快照的生成过程。
五、语法
snapshot [ -?] -Publisher server_name[\instance_name] -Publication publication_name [-70Subscribers] [-BcpBatchSize bcp_batch_size] [-DefinitionFile def_path_and_file_name] [-Distributor server_name[\instance_name]] [-DistributorDeadlockPriority [-1|0|1] ] [-DistributorLogin distributor_login] [-DistributorPassword distributor_password] [-DistributorSecurityMode [0|1] ] [-DynamicFilterHostName dynamic_filter_host_name] [-DynamicFilterLogin dynamic_filter_login] [-DynamicSnapshotLocation dynamic_snapshot_location] [-EncryptionLevel [0|1|2]] [-FieldDelimiter field_delimiter] [-HistoryVerboseLevel [0|1|2|3] ] [-HRBcpBlocks number_of_blocks ] [-HRBcpBlockSize block_size ] [-HRBcpDynamicBlocks ] [-KeepAliveMessageInterval keep_alive_interval] [-LoginTimeOut login_time_out_seconds] [-MaxBcpThreads number_of_threads ] [-MaxNetworkOptimization [0|1]] [-Output output_path_and_file_name] [-OutputVerboseLevel [0|1|2] ] [-PacketSize packet_size] [-ProfileName profile_name] [-PublisherDB publisher_database] [-PublisherDeadlockPriority [-1|0|1] ] [-PublisherFailoverPartner server_name[\instance_name] ] [-PublisherLogin publisher_login] [-PublisherPassword publisher_password] [-PublisherSecurityMode [0|1] ] [-QueryTimeOut query_time_out_seconds] [-ReplicationType [1|2] ] [-RowDelimiter row_delimiter] [-StartQueueTimeout start_queue_timeout_seconds] [-UsePerArticleContentsView use_per_article_contents_view]
参数
-?
输出所有可用的参数。
-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
在创建动态快照时,用来为筛选中的 HOST_NAME (Transact-SQL) 设置值。 例如,如果为项目指定了子集筛选器子句 rep_id = HOST_NAME() ,并且在调用合并代理之前将 DynamicFilterHostName 属性设置为“FBJones”,则只会复制 rep_id 列中具有“FBJones”的行。
-DynamicFilterLogin dynamic_filter_login
在创建动态快照时,用来为筛选中的 SUSER_SNAME (Transact-SQL) 设置值。 例如,如果为项目指定了子集筛选器子句 user