(eg:用A、B代表两台服务器,前提两台服务器之间没有配置任何关于订阅分发的事项)
环境配置:在A和B之间配置别名对应的IP地址,参考文章:https://www.cnblogs.com/DBArtist/p/5803271.html。
配置完成后,需要在订阅服务器上创建指定的数据库用于接收发布的数据
实现效果:在A、B之间根据指定的【表】和 【表中的列】实现事务发布
具体代码:按照脚本执行即可,将看到的带有注释的参数,填入实际的值,执行即可
----------------1.设置分发服务器
USE master ;
EXEC sp_adddistributor @distributor = N'', --分发服务器实例名称
@password = N'' ;
GO
----------------2.创建分发数据库
EXEC sp_adddistributiondb @database = N'', --分发数据库名称
@data_folder = N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.DEVELOP\MSSQL\Data',
@log_folder = N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.DEVELOP\MSSQL\Data',
@log_file_size = 2,
@min_distretention = 0,
@max_distretention = 72,
@history_retention = 48,
@security_mode = 1 ;
GO
----------------3.配置分发数据库
USE [distribution] ; --分发数据库的名称
IF ( NOT EXISTS ( SELECT * FROM sysobjects WHERE name = 'UIProperties' AND type = 'U ' ))
CREATE TABLE UIProperties ( id INT ) ;
IF ( EXISTS (
SELECT *
FROM ::fn_listextendedproperty('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', NULL, NULL)
)
)
EXEC sp_updateextendedproperty N'SnapshotFolder',
N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.DEVELOP\MSSQL\ReplData',
'user',
dbo,
'table',
'UIProperties' ;
ELSE
EXEC sp_addextendedproperty N'SnapshotFolder',
N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.DEVELOP\MSSQL\ReplData',
'user',
dbo,
'table',
'UIProperties' ;
GO
----------------4.将配置好的分发数据库与分发服务器绑定
EXEC sp_adddistpublisher @publisher = N'', --分发服务器实例名称
@distribution_db = N'', --分发数据库
@security_mode = 0,
@login = N'', --登录名
@password = N'', --密码
@working_directory = N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.DEVELOP\MSSQL\ReplData',
@trusted = N'false',
@thirdparty_flag = 0,
@publisher_type = N'MSSQLSERVER' ;
GO
----------------5.添加发布数据库
USE [NewVIP] ; --要发布的数据库名称
EXEC sp_replicationdboption @dbname = N'NewVIP', @optname = N'publish', @value = N'true' ;
GO
----------------6.为数据库添加事务发布/快照发布
USE [NewVIP] ; --要发布的数据库名称
EXEC sp_addpublication @publication = N'', --创建的发布的名称
@description = N'', --名称描述
@sync_method = N'concurrent',
@retention = 0,
@allow_push = N'true',
@allow_pull = N'true',
@allow_anonymous = N'true',
@enabled_for_internet = N'false',
@snapshot_in_defaultfolder = N'true',
@compress_snapshot = N'false',
@ftp_port = 21,
@ftp_login = N'anonymous',
@allow_subscription_copy = N'false',
@add_to_active_directory = N'false',
@repl_freq = N'continuous',
@status = N'active',
@independent_agent = N'true',
@immediate_sync = N'true',
@allow_sync_tran = N'false',
@autogen_sync_procs = N'false',
@allow_queued_tran = N'false',
@allow_dts = N'false',
@replicate_ddl = 1,
@allow_initialize_from_backup = N'false',
@enabled_for_p2p = N'false',
@enabled_for_het_sub = N'false' ;
GO
----------------7.为数据库添加快照代理,并配置发布的表,列
EXEC sp_addpublication_snapshot @publication = N'', --创建的发布的名称
@frequency_type = 1,
@frequency_interval = 0,
@frequency_relative_interval = 0,
@frequency_recurrence_factor = 0,
@frequency_subday = 0,
@frequency_subday_interval = 0,
@active_start_time_of_day = 0,
@active_end_time_of_day = 235959,
@active_start_date = 0,
@active_end_date = 0,
@job_login = NULL,
@job_password = NULL,
@publisher_security_mode = 0,
@publisher_login = N'', --发布服务器登录名
@publisher_password = N'' ; --发布服务器登录密码
GO
USE [NewVIP] ;--要发布的数据库名称
--配置要发布的表
/*
注意下面的是否启用筛选列的选项,有多个表需要参与事务发布,则按照格式复制多份
*/
EXEC sp_addarticle @publication = N'', --发布名称
@article = N'', --表名
@source_owner = N'dbo',
@source_object = N'', --表名
@type = N'logbased',
@description = NULL,
@creation_script = NULL,
@pre_creation_cmd = N'drop',
@schema_option = 0x000000000803509F,
@identityrangemanagementoption = N'manual',
@destination_table = N'', --表名
@destination_owner = N'dbo',
@vertical_partition = N'true', --是否要启用筛选列,启用时,删除所有列,单独配置相关列(必须包含主键列),不启用时,自动添加所有列
@ins_cmd = N'CALL sp_MSins_dbo',
@del_cmd = N'CALL sp_MSdel_dbo',
@upd_cmd = N'SCALL sp_MSupd_dbo' ;
--配置要发布表中的列
/*
有配置筛选列属性为True时,需要通过该系统Sp对指定表增加需要的列名
*/
EXEC sp_articlecolumn @publication = N'', --发布名称
@article = N'', --表名
@column = N'', --列名
@operation = N'add',
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1 ;
-- 添加项目同步对象
/*
有配置筛选列属性为True时的表,必须通过该系统Sp配置筛选视图
*/
EXEC sp_articleview @publication = N'', --发布名称
@article = N'', --表名
@view_name = N'', --自定义视图名
@filter_clause = NULL,
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1 ;
GO
----------------8.在发布服务器上配置需要订阅的服务器和数据库
USE [NewVIP] ; --要发布的数据库名称
EXEC sp_addsubscription @publication = N'', --发布名称
@subscriber = N'', --订阅服务器实例名
@destination_db = N'', --订阅服务器订阅数据库
@subscription_type = N'Push',
@sync_type = N'automatic',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0 ;
EXEC sp_addpushsubscription_agent @publication = N'', --发布名称
@subscriber = N'', --订阅服务器实例名
@subscriber_db = N'', --订阅服务器数据库
@job_login = NULL,
@job_password = NULL,
@subscriber_security_mode = 0,
@subscriber_login = N'jimei', --订阅服务器登录名
@subscriber_password = '', --订阅服务器登录账号
@frequency_type = 4,
@frequency_interval = 1,
@frequency_relative_interval = 1,
@frequency_recurrence_factor = 1,
@frequency_subday = 4,
@frequency_subday_interval = 1,
@active_start_time_of_day = 0,
@active_end_time_of_day = 235959,
@active_start_date = 20190717,
@active_end_date = 99991231,
@enabled_for_syncmgr = N'False',
@dts_package_location = N'Distributor' ;
GO
----------------9.在发布服务器上启动快照并初始化
EXEC sys.sp_reinitsubscription @publication = N'', --发布名称
@subscriber = N'', --订阅服务器实例名
@destination_db = N'', --订阅服务器数据库
@article = N'all' ;
GO
--启动可为发布生成初始快照的快照代理作业
EXEC sys.sp_startpublication_snapshot @publication = N'' ; --发布名称
GO