SQL Server 2005 复制:用 SQL 语句快速查看发布(publication)都有哪些订阅(subscription),以及发布包含了哪些表

本文提供了一个简单的SQL脚本,用于快速查看SQL Server 2005中数据库复制的基本信息,包括发布、订阅及文章详情等,有效提高查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司的数据库服务器上建立了 N 多个复制(replication),大大小小的发布(publication)都有上百个。 每当数据库复制同步出现问题的时候,最头痛了,因为要查看这个发布包含了 哪些表,特别是当查找某个表都包含在哪些发布中,以及被哪些数据库服务器订阅(subscription), 在 SQL Server 2005 的复制监视器(replication monitor)中去找到需要花费很多时间。于是我写了个 SQL 脚本,可以方便的查看数据库复制中的发布、订阅、出版物(article)等基本信息。利用这个 SQL 脚本,可以查看:

1. 当前数据库中都有哪些发布。
2. 一个发布中包含了哪些表。
3. 发布都是被哪些数据库服务器订阅。
--------------------------------------------------------------------------------
-- author : p.c.w.l
-- source : www.sqlstudy.com
-- create : 2008-01-01
-- descr  : a simple sql script to view base-info of publication, subscription
--------------------------------------------------------------------------------

select publication       = p.name
      ,pub_status        = case p.status when 0 then 'inactive' when 1 then 'active' end
      ,sysn_method       = case p.sync_method
                                when 0 then 'native bcp'
                                when 1 then 'character bcp'
                                when 3 then 'native bcp (nolock table)'
                                when 4 then 'character bcp (nolock table)'
                           end
      ,article           = a.name
      ,art_local_table   = object_name(a.objid)
      ,art_remote_table  = a.dest_owner + '.' + a.dest_table
      ,art_type          = case a.type
                              when 1   then '1 = log-based article'
                              when 3   then '3 = log-based article with manual filter'
                              when 5   then '5 = log-based article with manual view'
                              when 7   then '7 = log-based article with manual filter and manual view'
                              when 8   then '8 = stored procedure execution'
                              when 24  then '24 = serializable stored procedure execution'
                              when 32  then '32 = stored procedure (schema only)'
                              when 64  then '64 = view (schema only)'
                              when 128 then '128 = function (schema only)'
                           end
      ,art_status        = case when a.status & 1 = 1 then 'active' else 'inactive' end
      ,subserver         = s.srvname
      ,subdb             = s.dest_db
  from dbo.syspublications p 
          inner join dbo.sysarticles a
    on p.pubid = a.pubid 
          inner join dbo.syssubscriptions s
    on a.artid = s.artid and s.srvid > 0
 where 1 = 1
-- and p.name               = ''    -- publication name
-- and a.name               = ''    -- article name (note:article name always same with table name)
-- and object_name(a.objid) = ''    -- table name
--order by s.srvname, a.name
order by p.name



 



                
### 配置SQL Server以连接至Azure云服务 为了实现从本地SQL Server到Azure云服务的连接,特别是针对事务复制的需求,可以遵循一系列特定的操作流程。这不仅涉及到了具体的配置步骤,还涵盖了确保迁移过程中数据一致性的方法。 #### 准备工作 在开始之前,确认已准备好必要的资源和工具。对于想要使用事务复制SQL Server数据库迁移到Azure SQL数据库的情况,建议先下载并准备使用的Adventureworks2016示例数据库[^1]。此操作有助于熟悉整个迁移过程而不影响生产环境的数据。 #### 设置发布(Publisher) 要在现有的SQL Server实例上启用事务日志记录以便于后续向Azure SQL Database发送更改通知,需执行如下T-SQL命令: ```sql USE master; GO EXEC sp_replicationdboption @dbname = N'AdventureWorks', @optname = N'publish', @value = N'true'; GO ``` 上述脚本启用了指定数据库上的出版选项,使其成为事务复制中的发布者。 #### 创建分发(Distributor) 接着,需要为发布的变更创建一个分布点。如果计划在同一台机器上设置发行器,则可以直接运行下面的语句;否则应考虑远程服务器作为分销商的位置。 ```sql -- 如果是在同一台服务器上配置Distributor exec sp_adddistributor @distrib_db='distribution' go exec sp_adddistributiondb @database='distribution', @directory=N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\ReplData\distribution', @min_distretention=0, @max_distretention=72, @history_retention=48 go ``` 这段代码片段设置了分发数据库及其存储路径,并指定了保留期限参数来管理历史记录和分布式交易的信息保存时间长度。 #### 添加订阅(Subscriber) 最后一步是添加Azure SQL Database作为一个新的订阅者。在此之前,请确保已经在Azure Portal中创建好了相应的Azure SQL Database实例,并获取其完整的连接字符串信息。 ```powershell # PowerShell Script to Add Subscriber using Azure AD Authentication $SubscriptionDatabaseName="YourTargetDB" $PublisherServerName="LocalSqlServerInstance" $PublicationName="YourPubicationName" Add-Type -AssemblyName "Microsoft.SqlServer.Rmo, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" $rmoConnection = New-Object Microsoft.SqlServer.Replication.ServerConnection($PublisherServerName) $rmoConnection.LoginSecure=$false $rmoConnection.Login="yourLogin" $rmoConnection.Password="yourPassword" $rmoConnection.Connect() $publicationDb = new-object ("Microsoft.SqlServer.Replication.Publication") $rmoConnection,$SubscriptionDatabaseName,"Transaction" $subscription = $publicationDb.CreatePullSubscription("$(EndpointURL)","$(AdminUserName)", "$(AdminUserPassword)") $subscription.DatabaseName = "$SubscriptionDatabaseName" $subscription.SubscriptionType=[Microsoft.SqlServer.Replication.TransSubType]::Push $subscription.AgentSchedule.FrequencyInterval=1 $subscription.AgentSchedule.FrequencyRecurrenceFactor=0 $subscription.AgentSchedule.FrequencyRelativeInterval=1 $subscription.AgentSchedule.FrequencySubDay=1 $subscription.AgentSchedule.FrequencySubDayInterval=5 $subscription.SynchronizationAgentParameters="/Continuous /XJOBID:" + [System.Guid]::NewGuid().ToString() $subscription.Create() ``` 以上PowerShell脚本展示了如何利用Azure Active Directory身份验证方式把Azure SQL Database加入为拉取型(subscriber)订阅者的一部分。注意替换变量值以匹配实际场景下的具体细节。 通过这些步骤,成功建立了从本地SQL Server到Azure SQL Database之间的事务复制通道,实现了高效且可靠的数据同步机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值