zoukankan      html  css  js  c++  java
  • 使用脚本发布订阅

    http://blog.csdn.net/kk185800961/article/details/44719685

    建使用本地分发服务器】

    1. /************************【使用本地分发服务器配置发布】***********************/    
    2. --  SqlServer 2008 R2    
    3. --  https://technet.microsoft.com/zh-cn/library/ms151860(v=sql.105).aspx    
    4. use master    
    5. go    
    6.     
    7. --  服务器上是否已安装分发服务器    
    8. --  https://msdn.microsoft.com/zh-cn/library/ms190339(v=sql.105).aspx    
    9. exec master.dbo.sp_get_distributor    
    10. go    
    11.     
    12. --  配置分发服务器    
    13. --  https://msdn.microsoft.com/zh-cn/library/ms176028(v=sql.105).aspx    
    14. exec master.dbo.sp_adddistributor     
    15.  @distributor = 'KK-PC'    --分发服务器名称    
    16. ,@heartbeat_interval = 10       --代理在不记录进度消息的情况下可以运行的最长分钟数    
    17. ,@password = N'123456'  --分发服务器密码    
    18. go    
    19.     
    20. --  配置分发数据库    
    21. --  https://msdn.microsoft.com/zh-cn/library/ms189755(v=sql.105).aspx    
    22. exec master.dbo.sp_adddistributiondb     
    23.  @database = N'distribution'    --要创建的分发数据库的名称    
    24. ,@data_folder = N'E:TempFileDistribution' --分发数据库数据文件的目录    
    25. ,@data_file = N'distribution'   --数据库文件的名称    
    26. ,@data_file_size = 5            --初始数据文件大小,以兆字节 (MB) 为单位    
    27. ,@log_folder = N'E:TempFileDistribution' ----分发数据库日志文件的目录    
    28. ,@log_file = N'distribution_log'     
    29. ,@log_file_size =  5            --初始日志文件大小,以兆字节 (MB) 为单位     
    30. ,@min_distretention = 0         --从分发数据库中删除事务前的最小保持期,以小时为单位    
    31. ,@max_distretention = 72        --删除事务前的最大保持期,以小时为单位     
    32. ,@history_retention = 48        --历史记录的保留时间,以小时为单位     
    33. ,@security_mode = 1             --同步时连接到分发服务器的安全模式。默认值为1:Windows验证,0: SQL验证     
    34. ,@login = N'KK-PCSqlReplicator'     
    35. ,@password = N'123456'     
    36. ,@createmode = 1                --1:创建或使用现有数据库(instdist.sql)     
    37. go    
    38.     
    39. --  配置发布服务器以使用指定的分发数据库    
    40. --  https://msdn.microsoft.com/zh-cn/library/ms173807(v=sql.105).aspx    
    41. exec master.dbo.sp_adddistpublisher     
    42.  @publisher = N'KK-PC'         --发布服务器的名称    
    43. ,@distribution_db = N'distribution' --分发数据库的名称     
    44. ,@security_mode = 1                 --安全模式,默认1:Windows验证,0: SQL验证     
    45. ,@login = N'KK-PCSqlReplicator'     
    46. ,@password = N'123456'     
    47. ,@working_directory = N'E:TempFileReplData'--默认快照文件夹的UNC共享目录    
    48. ,@thirdparty_flag  = 0              --发布服务器是否是SQLServer,默认0:是,1:否    
    49. ,@publisher_type  = N'MSSQLSERVER'  --发布服务器类型:MSSQLSERVER(默认)/ORACLE/ORACLE GATEWAY    
    50. go    
    51.     
    52. /*****配置完成!!*****/    


    1. /*****【查看分发属性】******/  
    2.   
    3. --  检查分发数据库目录  
    4. exec master.dbo.xp_subdirs N'E:TempFileDistribution'  
    5.   
    6. --  发布服务器的属性(在分发服务器任何数据库执行)  
    7. --  https://technet.microsoft.com/zh-cn/library/ms190323(v=sql.105).aspx  
    8. exec master.dbo.sp_helpdistpublisher N'KK-PC'  
    9.   
    10. --  分发数据库的属性(在分发服务器的分发数据库上执行)  
    11. --  https://msdn.microsoft.com/zh-cn/library/vstudio/aa238917.aspx  
    12. exec master.dbo.sp_helpdistributiondb N'distribution'  
    13.   
    14. --  列出有关分发服务器相关信息(在分发服务器任何数据库执行)  
    15. --  https://msdn.microsoft.com/zh-cn/library/ms177504(v=sql.105).aspx  
    16. exec master.dbo.sp_helpdistributor  



    1. /*****【删除分发】******/  
    2. --这里不必执行!  
    3.   
    4.   
    5. --  删除分发发布服务器(在分发服务器任何数据库执行)  
    6. --  https://technet.microsoft.com/zh-cn/library/ms188411(v=sql.105).aspx  
    7. exec master.dbo.sp_dropdistpublisher @publisher =  N'KK-PC',@no_checks = 0,@ignore_distributor = 0 --检查对象;连接分发;  
    8.   
    9. --  删除分发数据库(在分发服务器任何数据库执行)  
    10. --  https://msdn.microsoft.com/zh-cn/library/ms188355(v=sql.105).aspx  
    11. exec master.dbo.sp_dropdistributiondb N'distribution';  
    12.   
    13. --  卸载分发服务器(除分发数据库之外的任何数据库中执行)  
    14. --  https://technet.microsoft.com/zh-cn/library/ms173516(v=sql.105).aspx  
    15. exec master.dbo.sp_dropdistributor @no_checks = 0,@ignore_distributor = 0 --检查对象;连接分发;  






    【创建可更新订阅的事务发布】


    1. /*************************************【创建发布】**************************************/  
    2. /*【实例:可更新订阅】  
    3.   
    4. * A 为发布数据库,id为每个表的主键  
    5. * B,C 为订阅数据库  
    6. * A中符合条件 [id % 2 = 0] 的同步到B中  
    7. * A中符合条件 [id % 2 = 1] 的同步到C中  
    8. * 以下以 B 创建发布订阅  
    9.       
    10.   当前发布数据库:[mytest]  
    11.   当前订阅数据库:[mytestA]  
    12.     
    13.     
    14. */  
    15.   
    16.   
    17.   
    18. --  作为发布的数据库  
    19. use [mytest]  
    20.   
    21. --  设置指定数据库的复制数据库选项(发布服务器或订阅服务器执行)  
    22. --  http://msdn.microsoft.com/zh-cn/library/ms188769.aspx  
    23. exec sys.sp_replicationdboption @dbname = N'mytest', @optname = N'publish', @value = N'true'  
    24. go  
    25.   
    26.   
    27. --  为给定分发服务器添加队列读取器代理(在分发库或发布库执行)(每个实例默认只1个,已存在可不须再执行)  
    28. --  http://msdn.microsoft.com/ZH-CN/LIBRARY/ms189517  
    29. exec sys.sp_addqreader_agent @job_login = N'KK-PCSqlReplicator', @job_password = N'123456', @job_name = null, @frompublisher = 1  
    30. go  
    31.   
    32.   
    33. --  为给定数据库添加日志读取器代理(在发布数据库执行)(每个数据库默认只1个,已存在可不须再执行)  
    34. --  http://technet.microsoft.com/zh-cn/library/ms189516.aspx  
    35. exec sys.sp_helplogreader_agent @publisher = null --查看当前数据库存在的日志代理  
    36. exec sys.sp_addlogreader_agent @job_login = N'KK-PCSqlReplicator', @job_password = N'123456', @publisher_security_mode = 1, @job_name = null  
    37. go  
    38.   
    39.   
    40. /***************************【创建发布:以下用于1库多发布】******************************/  
    41.   
    42. --  添加(可更新订阅)事务发布(在发布数据库执行)  
    43. --  http://msdn.microsoft.com/zh-cn/library/ms188738(v=sql.100).aspx  
    44. exec sys.sp_addpublication   
    45. @publication = N'tran_repl',        --【指定发布名称】  
    46. @description = N'来自发布服务器“”的数据库“mytest”的具有可更新订阅的事务发布。',   
    47. @sync_method = N'concurrent',           --同步模式:本机模式大容量复制程序输出  
    48. @retention = 0,                         --订阅活动的保持期(小时):默认值为336小时;0:订阅永不过期  
    49. @allow_push = N'true',                  --推送订阅   
    50. @allow_pull = N'true',                  --允许创建请求订阅  
    51. @allow_anonymous = N'false',            --不可创建匿名订阅   
    52. @enabled_for_internet = N'false',       --非Internet发布  
    53. @snapshot_in_defaultfolder = N'false',  --不指定快照默认文件夹,须设置@alt_snapshot_folder  
    54. @alt_snapshot_folder = N'E:TempFileReplData', --指定快照的备用文件夹的位置  
    55. @compress_snapshot = N'false',          --不压缩快照  
    56. @ftp_port = 21,                         --默认分发服务器的FTP服务的端口号:21  
    57. @ftp_login = N'anonymous',              --默认用于连接到 FTP 服务的用户名:anonymous  
    58. @allow_subscription_copy = N'false',    --禁用复制订阅此发布的订阅数据库  
    59. @add_to_active_directory = N'false',    --(已不推荐使用)  
    60. @repl_freq = N'continuous',             --复制频率的类型:基于日志的事务的输出  
    61. @status = N'active',                    --发布数据可立即用于订阅服务器  
    62. @independent_agent = N'true',           --【独立分发代理】  
    63. @immediate_sync = N'false',             --每次运行快照代理时不为发布创建同步文件  
    64. @allow_sync_tran = N'true',             --允许使用【立即更新订阅】  
    65. @autogen_sync_procs = N'true',          --在发布服务器上生成更新订阅的【同步存储过程】  
    66. @allow_queued_tran = N'true',           --在订阅服务器中启用更改的队列  
    67. @allow_dts = N'false',                  --不允许数据转换  
    68. @conflict_policy = N'sub wins',         --排队更新订阅服务器选项时所遵从的冲突解决策略:【订阅入选】  
    69. @centralized_conflicts = N'true',       --在发布服务器上存储冲突记录  
    70. @conflict_retention = 14,               --冲突保持期(天)  
    71. @queue_type = N'sql',                   --使用的队列类型:默认SQL Server存储事务  
    72. @replicate_ddl = 1,                     --【支持架构复制】  
    73. @allow_initialize_from_backup = N'false', --不允许用备份初始化订阅  
    74. @enabled_for_p2p = N'false',            --非对等复制  
    75. @enabled_for_het_sub = N'false'         --只支持SQL Server订阅服务器  
    76. go  
    77.   
    78.   
    79. --  为指定的发布创建快照代理(在发布数据库执行)  
    80. --  http://msdn.microsoft.com/zh-cn/library/ms174958(v=sql.100)  
    81. exec sys.sp_addpublication_snapshot   
    82. @publication = N'tran_repl',  
    83. @frequency_type = 1,  
    84. @frequency_interval = 0,  
    85. @frequency_relative_interval = 0,  
    86. @frequency_recurrence_factor = 0,  
    87. @frequency_subday = 0,   
    88. @frequency_subday_interval = 0,   
    89. @active_start_time_of_day = 0,   
    90. @active_end_time_of_day = 235959,   
    91. @active_start_date = 0,   
    92. @active_end_date = 0,   
    93. @job_login = N'KK-PCSqlReplicator',   
    94. @job_password = N'123456',   
    95. @publisher_security_mode = 1  
    96. go  
    97.   
    98.   
    99. --  更改发布属性  
    100. --  https://msdn.microsoft.com/zh-cn/library/ms188413(v=sql.105).aspx  
    101. --  exec sys.sp_changepublication ……  



    1. --  创建项目并将其添加到发布中(在发布数据库执行)  
    2. --  http://msdn.microsoft.com/zh-cn/library/ms173857  
    3.   
    4. /*1. 添加可筛选的表(默认架构dbo)*/  
    5. declare @tableName          nvarchar(100)  
    6. declare @publName           nvarchar(100)  
    7. declare @mark               bit         -- 区分是否有sid的列,有则进行筛选  
    8. declare @filterNum          nvarchar(10)-- 一个数据库多个发布加编号区别  
    9. declare @filterClause       nvarchar(100)  
    10. declare @SQLaddarticle      nvarchar(max)  
    11. declare @SQLarticlefilter   nvarchar(max)  
    12. declare @SQLarticleview     nvarchar(max)  
    13. set @publName = N'tran_repl' -- 【指定发布名称】  
    14. set @filterClause = N'dbo.f_SIDTOInt(SID) % 2 = 0' --   【指定行筛选】  
    15. select @filterNum = CONVERT(NVARCHAR(10),count(*)) from distribution.dbo.MSpublications  
    16. declare cur_addTable cursor local fast_forward  
    17. for   
    18.     /*有主键 并且 有SID列(用于筛选)*/  
    19.     select name,1 mark from sys.tables t1(nolock) where is_ms_shipped = 0  
    20.     and exists(select 1 from sys.columns t2(nolock) where t1.object_id=t2.object_id and t2.name='SID')  
    21.     and name in(select table_name from information_schema.key_column_usage(nolock)   
    22.         where objectproperty(object_id(constraint_name),'isprimarykey')=1 )  
    23.     union all  
    24.     /*有主键 并且 无SID列(不可筛选)*/  
    25.     select name,0 mark from sys.tables t1(nolock) where is_ms_shipped = 0  
    26.     and not exists(select 1 from sys.columns t2(nolock) where t1.object_id=t2.object_id and t2.name='SID')  
    27.     and name in(select table_name from information_schema.key_column_usage (nolock)  
    28.         where objectproperty(object_id(constraint_name),'isprimarykey')=1 )  
    29. open cur_addTable  
    30. fetch next from cur_addTable into @tableName,@mark  
    31. while @@fetch_status = 0  
    32. begin  
    33.     if ( @mark = 1 ) /*可筛选的表对象*/  
    34.     begin  
    35.         set @SQLaddarticle = N'  
    36.         exec sp_addarticle   
    37.         @publication = N'''+@publName+''',   
    38.         @article = N'''+@tableName+''',   
    39.         @source_owner = N''dbo'',   
    40.         @source_object = N'''+@tableName+''',   
    41.         @type = N''logbased'',   
    42.         @description = null,   
    43.         @creation_script = null,   
    44.         @pre_creation_cmd = N''drop'',   
    45.         @schema_option = 0x0000000008035CDF,   
    46.         @identityrangemanagementoption = N''none'',   
    47.         @destination_table = N'''+@tableName+''',   
    48.         @destination_owner = N''dbo'',   
    49.         @status = 24,  
    50.         @vertical_partition = N''false'''  
    51.         exec(@SQLaddarticle)  
    52.         /*添加项目筛选器*/  
    53.         set @SQLarticlefilter = N'   
    54.         exec sp_articlefilter   
    55.         @publication = N'''+@publName+''',   
    56.         @article = N'''+@tableName+''',   
    57.         @filter_name = N''FLTR_'+@tableName+'_'+@filterNum+'__'+rtrim(ltrim(str(@@spid)))+''',   
    58.         @filter_clause = N'''+@filterClause+''',   
    59.         @force_invalidate_snapshot = 1,   
    60.         @force_reinit_subscription = 1'  
    61.         exec(@SQLarticlefilter)  
    62.         /*添加项目同步对象*/  
    63.         set @SQLarticleview = N'  
    64.         exec sp_articleview   
    65.         @publication = N'''+@publName+''',   
    66.         @article = N'''+@tableName+''',   
    67.         @view_name = N''SYNC_'+@tableName+'_'+@filterNum+'__'+rtrim(ltrim(str(@@spid)))+''',   
    68.         @filter_clause = N'''+@filterClause+''',   
    69.         @force_invalidate_snapshot = 1,   
    70.         @force_reinit_subscription = 1'  
    71.         exec(@SQLarticleview)  
    72.         print '已筛选:'+@tableName  
    73.     end  
    74.     else if ( @mark = 0 )  
    75.     begin  
    76.         set @SQLaddarticle = N'  
    77.         exec sp_addarticle   
    78.         @publication = N'''+@publName+''',   
    79.         @article = N'''+@tableName+''',   
    80.         @source_owner = N''dbo'',   
    81.         @source_object = N'''+@tableName+''',   
    82.         @type = N''logbased'',   
    83.         @description = null,   
    84.         @creation_script = null,   
    85.         @pre_creation_cmd = N''drop'',   
    86.         @schema_option = 0x0000000008035CDF,   
    87.         @identityrangemanagementoption = N''none'',   
    88.         @destination_table = N'''+@tableName+''',   
    89.         @destination_owner = N''dbo'',   
    90.         @status = 24,  
    91.         @vertical_partition = N''false'''  
    92.         exec(@SQLaddarticle)  
    93.         print '无筛选:'+@tableName  
    94.     end  
    95.     fetch next from cur_addTable into @tableName,@mark  
    96. end  
    97. close cur_addTable  
    98. deallocate cur_addTable  




    1. /*2. 添加视图/存储过程/函数对象(默认架构dbo)*/  
    2. declare @publName       nvarchar(100)  
    3. declare @ObjectName     nvarchar(100)  
    4. declare @Type           nvarchar(30)  
    5. declare @ObjectType     nvarchar(30)  
    6. declare @SQLaddObject   nvarchar(max)  
    7. set @publName = N'tran_repl' -- 【指定发布名称】  
    8. declare cur_addObject cursor local fast_forward  
    9. for select name,type from mytest.sys.objects where type in(N'P') and is_ms_shipped = 0  
    10.     union all  
    11.     select name,type from mytest.sys.objects a where type in(N'V') and is_ms_shipped = 0  
    12.     and exists(select 1 from mytest.sys.sql_modules b where a.object_id=b.object_id and is_schema_bound = 0)  
    13.     union all  
    14.     select name,N'B' as type from mytest.sys.objects a where type in(N'V') and is_ms_shipped = 0   
    15.     and exists(select 1 from sys.sql_modules b where a.object_id=b.object_id and is_schema_bound = 1)/*架构绑定的索引视图*/  
    16.     union all  
    17.     select name,type from mytest.sys.objects where type in(N'TF',N'FN') and is_ms_shipped = 0  
    18.     order by type,name  
    19. open cur_addObject  
    20. fetch next from cur_addObject into @ObjectName,@ObjectType  
    21. while @@fetch_status = 0  
    22. begin  
    23.     SET @Type =   
    24.     (  
    25.         CASE   
    26.         WHEN @ObjectType = N'V' THEN N'view schema only'  
    27.         WHEN @ObjectType = N'B' THEN N'indexed view schema only'  
    28.         WHEN @ObjectType = N'P' THEN N'proc schema only'  
    29.         WHEN @ObjectType in(N'TF',N'FN') THEN N'func schema only'  
    30.         END  
    31.     )  
    32.     set @SQLaddObject = N'  
    33.     exec sp_addarticle   
    34.     @publication = N'''+@publName+''',   
    35.     @article = N'''+@ObjectName+''',   
    36.     @source_owner = N''dbo'',   
    37.     @source_object = N'''+@ObjectName+''',   
    38.     @type =  N'''+@Type+''',   
    39.     @description = null,   
    40.     @creation_script = null,   
    41.     @pre_creation_cmd = N''drop'',   
    42.     @schema_option = 0x0000000008000001,   
    43.     @status = 16,  
    44.     @destination_owner = N''dbo'',   
    45.     @destination_table = N'''+@ObjectName+''''  
    46.     exec(@SQLaddObject)  
    47.     print @ObjectType+ ':' + @ObjectName  
    48.     fetch next from cur_addObject into @ObjectName,@ObjectType  
    49. end  
    50. close cur_addObject  
    51. deallocate cur_addObject  



    【创建订阅】

    1.           
    2. /***********************************【创建订阅】***************************************/  
    3. /*【要在发布服务器上运行的脚本】*/  
    4.   
    5. use [mytest]  
    6.   
    7. --  将订阅添加到发布并设置订阅服务器的状态  
    8. --  (警告: distribution 代理作业隐式创建,并将在 SQL Server 代理服务帐户下运行)  
    9. --  http://technet.microsoft.com/zh-cn/library/ms181702(v=sql.100).aspx  
    10. exec sys.sp_addsubscription   
    11. @publication = N'tran_repl',    --指定发布名称  
    12. @subscriber = N'KK-PC',     --订阅服务器  
    13. @destination_db = N'mytestA',--订阅数据库  
    14. @subscription_type = N'Push',       --推送订阅  
    15. @sync_type = N'automatic',          --默认,已发布表的架构和初始数据将首先传输到订阅服务器  
    16. @article = N'all',                  --发布所订阅的项目  
    17. @update_mode = N'queued failover',  --将订阅启用为排队更新订阅,并允许更改为立即更新模式  
    18. @subscriber_type = 0                --订阅服务器的类型:SQL Server订阅服务器  
    19. go  
    20.   
    21. --  添加新的预定分发代理作业,以使推送订阅与事务发布同步  
    22. --  http://msdn.microsoft.com/zh-cn/library/ms175006(v=SQL.100)  
    23. exec sys.sp_addpushsubscription_agent   
    24. @publication = N'tran_repl',    --指定发布名称  
    25. @subscriber = N'KK-PC',         --订阅服务器  
    26. @subscriber_db = N'mytestA',    --订阅数据库  
    27. @job_login = N'KK-PCSqlReplicator',   
    28. @job_password = N'123456',   
    29. @subscriber_security_mode = 1,          --Windows 身份验证  
    30. @frequency_type = 64,                   --分发代理计划的频率:自动启动(默认)  
    31. @frequency_interval = 1,   
    32. @frequency_relative_interval = 1,   
    33. @frequency_recurrence_factor = 0,   
    34. @frequency_subday = 4,   
    35. @frequency_subday_interval = 5,   
    36. @active_start_time_of_day = 0,   
    37. @active_end_time_of_day = 235959,   
    38. @active_start_date = 0,   
    39. @active_end_date = 0,   
    40. @dts_package_location = N'Distributor'  
    41. go  



    1. /*【要在订阅服务器上运行的脚本】*/  
    2.   
    3. use mytestA  
    4.   
    5. --  设置在连接到发布服务器时立即更新订阅的同步触发器所使用的配置和安全信息  
    6. --  http://msdn.microsoft.com/zh-cn/library/ms174991(v=sql.100).aspx  
    7. exec sys.sp_link_publication   
    8. @publisher = N'KK-PC',   
    9. @publisher_db = N'mytest',   
    10. @publication = N'tran_repl',   
    11. @distributor = N'KK-PC',   
    12. @security_mode = 1,     --SQL Server 身份验证或 Windows 身份验证  
    13. @login = N'KK-PCSqlReplicator',   
    14. @password = N'123456'  
    15. go  




    【启动快照并初始化】

    1. /**********************************【启动快照并初始化】**************************************/  
    2. --  发布服务器发布数据  
    3. use [mytest]  
    4.   
    5. --  对其请求订阅中的新项目的订阅添加到发布中(在发布服务器的发布数据库中执行)  
    6. --  https://technet.microsoft.com/zh-cn/library/ms181680(v=sql.100).aspx  
    7. --  exec sys.sp_refreshsubscriptions @publication = N'tran_repl'  
    8.   
    9.   
    10. --  将订阅标记为要重新初始化  
    11. --  https://msdn.microsoft.com/zh-cn/library/ms189469(v=sql.100).aspx  
    12. exec sys.sp_reinitsubscription   
    13. @publication = N'tran_repl',   
    14. @subscriber = N'KK-PC',   
    15. @destination_db = N'mytestA',   
    16. @article = N'all'  
    17. go  
    18.   
    19. --  启动可为发布生成初始快照的快照代理作业(在发布服务器的发布数据库中执行)  
    20. --  http://msdn.microsoft.com/zh-cn/library/ms176026(v=sql.105).aspx  
    21. exec sys.sp_startpublication_snapshot @publication = N'tran_repl'  
    22. go  
    23.   
    24. --  为所有表项目编写自定义 sp_MSins、sp_MSupd 和 sp_MSdel 过程的脚本  
    25. --  https://msdn.microsoft.com/zh-cn/library/ms187946(SQL.100).aspx  
    26. --exec sys.sp_scriptpublicationcustomprocs 'tran_repl'  
    27. --go  
    28.   
    29.   
    30. --  至此,完成发布订阅!!!~ 初始化完成!!~  






    之前测试了N遍!!!~~今晚有空终于成功处理了!~

  • 相关阅读:
    LeetCode Combination Sum III
    LeetCode Contains Duplicate
    CSRF & CORS
    LeetCode Kth Largest Element in an Array
    Maven 使用 Nexus 内部库 代理
    可重定位目标文件
    过程(栈帧结构是干货)
    控制语句(if-else+循环+switch)汇编规则
    程序编码(机器级代码+汇编代码+C代码+反汇编)
    转移指令jmp和跳转指令call
  • 原文地址:https://www.cnblogs.com/ifreesoft/p/7930840.html
Copyright © 2011-2022 走看看