(https://msdn.microsoft.com/zh-cn/library/ms173857(v=sql.120).aspx)
(https://msdn.microsoft.com/zh-cn/library/ms184385.aspx)
(https://msdn.microsoft.com/zh-cn/library/ms175158.aspx) --- 与replication无关?? 只是创建快照
sp_startpublication_snapshot
sp_addarticle / sp_addsubscription / sp_dropsubscription / sp_droparticle
==============================================================================================================
// 创建项目添加到发布中。 名字是ACTRep
exec sp_addarticle @publication = 'ACTRep', @article = 'PFAcctYYY', @source_owner = 'dbo', @source_object = 'PFAcctXXX',
// 检索系统中,通过发布名称来检索信息, 得到 pubid.
select * from dbo.syspublications p where p.name='ACTRep'
syspublications (Transact-SQL)
数据库内定义的每个发布在表中对应一行。 该表存储在发布数据库中。
列名 | 数据类型 | 说明 | ||
---|---|---|---|---|
说明 | nvarchar(255) | 发布的说明项。 | ||
name | sysname | 与发布关联的唯一名称。 | ||
pubid | int | 为发布提供唯一 ID 的标识列。 | ||
repl_freq | tinyint | 复制频率: 0 = 基于事务。 1 = 计划表刷新。 | ||
status | tinyint | 状态: 0 = 不活动。 1 = 活动。 | ||
sync_method | tinyint | 同步方法包括: 0 = 本机模式大容量复制程序实用工具 (BCP)。 1 = 字符模式 BCP。 3 = 并发,表示在快照期间使用本机模式 BCP,但不锁定表。 4 = Concurrent_c,表示在快照期间使用字符模式 BCP,但不锁定表。 | ||
snapshot_jobid | binary(16) | 预定任务 ID。 | ||
independent_agent | bit | 指定是否有用于该发布的独立分发代理。 0 = 该发布使用共享的分发代理,每对发布服务器数据库/订阅服务器数据库都有一个单独的共享代理。 1 = 此发布有独立的分发代理。 | ||
immediate_sync | bit | 指示每次快照代理运行时是否创建或重新创建同步文件,1 表示每次代理运行时都创建同步文件。 | ||
enabled_for_internet | bit | 指示发布的同步文件是否通过文件传输协议 (FTP) 和其他服务向 Internet 公开,1 表示可以从 Internet 访问发布的同步文件。 | ||
allow_push | bit | 指示对于该发布是否允许推送订阅,1 表示允许。 | ||
allow_pull | bit | 指示对于该发布是否允许请求订阅,1 表示允许。 | ||
allow_anonymous | bit | 指示对于该发布是否允许匿名订阅,1 表示允许。 | ||
immediate_sync_ready | bit | 指示快照代理是否已生成快照且该快照是否准备好用于新的订阅。 仅对于立即更新发布才有意义。 1 表示快照已准备好。 | ||
allow_sync_tran | bit | 指定是否允许对发布使用立即更新订阅。 1 表示允许即时更新订阅。 | ||
autogen_sync_procs | bit | 指定是否在发布服务器中为立即更新订阅生成同步存储过程。 1 表示在发布服务器上生成同步存储过程。 | ||
retention | int | 为给定发布保存的更改数量(小时)。 | ||
allowed_queued_tran | bit | 指定是否启用在订阅服务器上对更改进行排队,直到更改可以在发布服务器上应用为止。 如果为 1,则在订阅服务器上对更改进行排队。 | ||
snapshot_in_defaultfolder | bit | 指定是否在默认文件夹中存储快照文件。 0 = 快照文件已存储在 alternate_snapshot_folder 所指定的备用位置。 1 = 快照文件存储在默认文件夹中。 | ||
alt_snapshot_folder | nvarchar(255) | 指定快照的备用文件夹的位置。 | ||
pre_snapshot_script | nvarchar(255) | 指定指向 .sql 文件位置的指针。 在订阅服务器上应用快照时,分发代理将在运行任何复制的对象脚本之前运行快照前脚本。 | ||
post_snapshot_script | nvarchar(255) | 指定指向 .sql 文件位置的指针。 在初始同步过程中,分发代理将在应用所有其他复制的对象脚本和数据之后运行快照后脚本。 | ||
compress_snapshot | bit | 指定将写入 alt_snapshot_folder 位置的快照将被压缩为 Microsoft CAB 格式。1 表示将压缩快照。 | ||
ftp_address | sysname | 分发服务器的 FTP 服务的网络地址。 指定发布快照文件所在的位置以供分发代理拾取。 | ||
ftp_port | int | 分发服务器的 FTP 服务的端口号。 指定发布快照文件所在的位置以供分发代理拾取。 | ||
ftp_subdirectory | nvarchar(255) | 指定当发布支持使用 FTP 传播快照时的快照文件的位置以供分发代理获取。 | ||
ftp_login | sysname | 用于连接到 FTP 服务的用户名。 | ||
ftp_password | nvarchar(524) | 用于连接到 FTP 服务的用户密码。 | ||
allow_dts | bit | 指定发布是否允许数据转换。 1 指定允许 DTS 转换。 | ||
allow_subscription_copy | bit | 指定是否已启用复制订阅该发布的订阅数据库的功能。 1 表示允许复制。 | ||
centralized_conflicts | bit | 指定冲突记录是否存储在发布服务器上: 0 = 在导致冲突的发布服务器和订阅服务器上均存储冲突记录。 1 = 在发布服务器上存储冲突记录。 | ||
conflict_retention | int | 指定冲突保持期(天)。 | ||
conflict_policy | int | 指定使用排队更新订阅服务器选项时遵循的冲突解决策略。 可以是下列值之一: 1 = 发布服务器入选冲突。 2 = 订阅服务器入选冲突。 3 = 重新初始化订阅。 | ||
queue_type | int | 指定所使用的队列类型。 可以是下列值之一: 1 = msmq,使用 Microsoft 消息队列来存储事务。 2 = sql,它使用 SQL Server 来存储事务。
| ||
ad_guidname | sysname | 指定是否在 Microsoft Active Directory 中发布该发布。 有效的全局唯一标识符 (GUID) 指定在 Active Directory 中进行发布,且 GUID 是相应的 Active Directory 发布对象 objectGUID。 如果为 NULL,则将不在 Active Directory 中发布该发布。 | ||
backward_comp_level | int | 数据库兼容级别,可以为下列值之一: 90 = SQL Server 2005. 100 = SQL Server 2008. 110 = SQL Server 2012. 120 = SQL Server 2014. | ||
allow_initialize_from_backup | bit | 指示订阅服务器是否能够从备份而不是从初始快照来初始化对此发布的订阅。 1 表示订阅可以从备份进行初始化,0 表示不能。 有关详细信息,请参阅初始化事务订阅(不使用快照)。 | ||
min_autonosync_lsn | binary | 标识为仅供参考。不提供支持。不保证以后的兼容性。 | ||
replicate_ddl | int | 指示发布是否支持架构复制。 1 表示已复制在发布服务器上执行的数据定义语言 (DDL) 语句,0 表示未复制 DDL 语句。 有关详细信息,请参阅对发布数据库进行架构更改。 | ||
options | int | 指定其他发布选项的位图,其中的位选项值如下所示: 0x1 - 为对等复制启用。 0x2 - 仅为对等复制发布本地更改。 0x4 - 为非 SQL Server 订阅服务器启用。 0x8 - 为对等冲突检测启用。 | ||
originator_id | smallint | 为进行冲突检测标识对等复制拓扑中的每个节点。 有关详细信息,请参阅对等复制中的冲突检测。 |
select * from dbo.sysarticles a where a.pubid=?
//根据artid,去系统表里查,可以得到被谁订阅了?
select * from dbo.syssubscriptions s where s.artid=?
///检索出来 replication error
select b.* from ODS_Distributor..MSrepl_errors a inner join ODS_Distributor..MSdistribution_history b on b.error_id=a.id order by a.time
// 系统表中,查询出有哪些表被订阅 (article,订阅的项目名。)
如何得到publication_id, 这个问题我还不清楚。。。。
可以用一个已知的destination_object, 或者source_object , 或者article, 来取得这个publication_id。
select * from ODS_Distributor..MSarticles where publication_id = XX
MSarticles (Transact-SQL)
发布服务器复制的每个项目在 MSarticles 表中各占一行。 该表存储在分发数据库中。
列名 | 数据类型 | 说明 |
---|---|---|
publisher_id | smallint | 发布服务器的 ID。 |
publisher_db | sysname | 发布服务器数据库的名称。 |
publication_id | int | 发布的 ID。 |
article | sysname | 项目的名称。 |
article_id | int | 项目的 ID。 |
destination_object | sysname | 在订阅服务器上创建的表的名称。 |
source_owner | sysname | 发布服务器上源表的架构的名称。 |
source_object | sysname | 添加项目时所在的源对象的名称。 |
description | nvarchar(255) | 项目的说明。 |
destination_owner | sysname | 在订阅服务器上创建的表的架构的名称。 |
============================================================
使用sp_dropsubscription, sp_droparticle或者sp_addarticle命令, 都是往ODS_Distributor..MSarticles 这个表中插入或者删除数据。不用DBA关闭同步(replication off), 也可以做到修改表结构不出错。否则,修改了oltp的表结构,olap的表结构不会被同步过去,导致同步出错。因为出错,以后都会同步失败。因为取消了在这个发布上的订阅,这样修改oltp的表结构,则订阅它的olap也不会出错(因为订阅被取消了)
例子:
DECLARE @pubname AS sysname, @oltp2 AS sysname, @olap AS sysname, @prd_oltp2 AS sysname, @prd_olap AS sysname, @dest_db AS sysname
SET @pubname = 'ACTRep'
SET @dest_db = 'XXXXXX' --DB name
IF @@servername = 'XXXXXXX' --UAT oltp1的name
BEGIN
SET @oltp2= 'XXXXX,port'
SET @olap= 'XXXX, port'
END
ELSE IF @@servername = 'XXXXX' --PRO oltp1的name
BEGIN
SET @oltp2= 'XXXXXX'
SET @olap= 'XXXXXXX'
END
exec sp_dropsubscription @publication = @pubname, @article = 'PFAcctAuthorizedMarkets', @subscriber = @oltp2,@destination_db = @dest_db
exec sp_dropsubscription @publication = @pubname, @article = 'PFAcctAuthorizedMarkets', @subscriber = @olap,@destination_db = @dest_db
EXEC sp_droparticle @publication = @pubname, @article = 'PFAcctAuthorizedMarkets', @force_invalidate_snapshot = 1
DECLARE @pubname AS sysname
SET @pubname = 'ACTRep'
IF @@servername = XXXXX' (--oltp1的name) OR @@servername = 'XXXXX'(--oltp2的name)
exec sp_addarticle @publication = @pubname, @article = 'PFAcctHierarchy', @source_owner = 'dbo', @source_object = 'PFAcctHierarchy',
@pre_creation_cmd = 'truncate', @identityrangemanagementoption = 'manual',@force_invalidate_snapshot = 1,@status = 24