添加Distributor失败

上周做了一个case,客户无法为SQL Server instance配置remote distributor。 下面分享一下排查问题的过程,希望对您排查类似的问题所有帮助。

客户的环境中的SQL Server均为sql server 2012 RTM.

Distributor server: SQL108W2K8R22

Publisher: SQL108W2K8R21

Subscriber: SQL108W2K8R23

SQL108W2K8R23为SQL108W2K8R21的订阅服务器,模式为push.

现在要为SQL108W2K8R23创建发布,将SQL108W2K8R22添加为分发服务器时出错。

配置时会出现下面的错误:

Error 21670只是一般性的登录错误:Connection to server [%s] failed.没什么价值

于是尝试手工添加:exec sp_adddistributor @distributor = N‘SQL108W2K8R22‘, @password = N‘StrongPassword‘

得到下面的错误:

Msg 18483, Level 14, State 1, Line 1

Could not connect to server ‘SQL108W2K8R22‘ because ‘distributor_admin‘ is not defined as a remote login at the server. Verify that you have specified the correct login name.

搜索了错误信息,得到下面这篇 KB

http://support.microsoft.com/kb/818334

按照KB上进行检查,发现这三台SQL SERVER的@@servername和hostname都是匹配的,这篇KB没有起到效果。

确认在添加前,distributor SQL108W2K8R22已经将SQL108W2K8R23添加为发布服务器。

在distributor里找到了名称为SQL108W2K8R23的linked server,也可以在sys.servers查看到相应的记录

在distributor中的sys.link_logins中也包含distributor_admin相应的记录。

虽然 SQL108W2K8R23添加remote distributor失败,但仍然创建名为出[repl_distributor]的linked server。

于是在distributor和SQL108W2K8R23上同时抓取trace,看看添加remote distributor(sp_adddistributor)时究竟发生了什么。

在SQL108W2K8R23的trace中,发现SQL108W2K8R23通过linked server repl_distributor向distributor 提交一个查询,用于比对distributor 上SQL 版本。

EXEC @retcode = repl_distributor.master.sys.sp_executesql N‘select @dist_ver = @@microsoftversion‘, N‘@dist_ver bigint output‘, @dist_ver output

这个语句是添加distributor操作中的最后一个语句。

查看distributor上的trace,发现distributor上没有接收到任何语句,只有之前提到的报错信息

看起来linked server可以工作,成功地将语句发送到了target server(distributor),可能是linked server有些信息没有传递给distributor或者是distributor缺失了一些metadata。但检查了linked server的属性,没有发现异常。但如果是metadata丢失的话,那么删掉重建应该是不错的选择:

于是尝试将SQL108W2K8R23从distributor的publisher list中删除,并再次添加. 但在删除的时候出现如下错误:

真是诸事不顺!打开profiler trace,发现UI操作实际上执行的是exec sp_dropdistpublisher @publisher = N‘SQL108W2K8R21‘,    @no_checks=1

于是手工执行了一把,得到了同样的错误:

Msg 20584, Level 16, State 1, Procedure sp_MSrepl_check_server, Line 67

Cannot drop server ‘SQL108W2K8R21‘ because it is used as a Subscriber to remote Publisher ‘SQL108W2K8R23‘ in replication.

在sp_dropdistpublisher内部,主要会调用两个存储过程:

sys.sp_dropremotelogin    @publisher,‘distributor_admin‘,‘distributor_admin‘

sys.sp_dropserver @publisher, ‘droplogins‘

sp_dropremotelogin的作用如下:

Removes a remote login mapped to a local login used to execute remote stored procedures against the local server running SQL Server

而sp_dropserver内部调用了sp_MSrepl_check_server,检查(distribution.dbo. MSsubscriber_info)将要删除的publisher是否同时也是一个订阅。如果是,就抛出异常,然后退出。

不幸的是,sp_dropremotelogin和sp_dropserver是单独执行的,并不在一个事务里。所以虽然最终执行失败,但sp_dropremotelogin造成的影响却没有回滚。

将distribution.dbo. MSsubscriber_info里的相关记录删除。

然后将publisher删除后重建,之后添加distributor的操作就成功了J

扩展:

1)

sp_dropremotelogin:Removes a remote login mapped to a local login used to execute remote stored procedures against the local server running SQL Server

sp_addremotelogin:Adds a new remote login ID on the local server. This enables remote servers to connect and execute remote procedure calls.

MSsubscriber_info :it contains one row for each Publisher/Subscriber pair that is being pushed subscriptions from the local Distributor. This table is stored in the distribution database.

这些存储过程和表都是sql server 2000时代的产物,用于linked server相关操作。在2005里就已经depreciated。

2)后来分析了内部的调用逻辑,实际上只需要在distributor执行sp_addremotelogin就可以解决这个问题,没有必要重建. 如果您以后遇到了下面这个错误,可以尝试在distributor中执行sp_addremotelogin。

Could not connect to server ‘SQL108W2K8R22‘ because ‘distributor_admin‘ is not defined as a remote login at the server. Verify that you have specified the correct login name.

3)如果在移除publisher时遇到下面的错误,可以将distribution.. MSsubscriber_info的相关记录删除,然后再次尝试。

Cannot
drop
server
‘server1‘
because
it
is
used
as
a
Subscriber
to
remote
Publisher
‘serve2‘
in
replication.

4)您在SQL SERVER 2014版本的distributor中不会遇到第三个问题,这并因为不是sp_addDistributor或sp_dropdistpublisher在2014中有了逻辑上变更,而是在添加订阅的时候,不会在向distribution.. MSsubscriber_info插入记录。这样sp_MSrepl_check_server就不会抛出异常了。

添加Distributor失败

时间: 2024-09-30 16:51:41

添加Distributor失败的相关文章

添加服务器配置失败详解

最近刚换了一个新工作,哎,感觉一个字累.没有激情去开发了,很没劲儿. 刚接触项目是基于微信的开发项目.别的不多说了,先说一下问题吧,就是我觉得动软生成器很好用,不知道个人有木有用啊?然后就去网盘下载安装,但是在我配置服务器添加数据库服务与数据库连接时出现了一个让我头疼的问题,就是在配置过出现了一个这个问题.找了很多方法也没解决. 第二天继续找,因为喜爱(也可能是强迫症),还是得用这个工具,所以我按这个方法就解决了问题,从中我也得到了方案如果遇见这种问题有限先这样设置. 方案: 那我就以动软为例吧

WCF运行错误:添加服务失败。服务元数据可能无法访问。请确保服务正在运行并且正在公开元数据。

使用WCF写了一个小程序测试一下它的功能在运行时报错.“添加服务失败.服务元数据可能无法访问.请确保服务正在运行并且正在公开元数据.” 如下图所示: 查了下资料把它解决了,记录一下. 解决方法: 将web.config中的 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/> 修改为 <serviceHost

当字段不能为空时,添加字段失败

错误信息: 当给属性表或特征数据集合添加一个不能为空的字段时,会出现如下的错误:"添加字段失败.字段不能为空." 原因分析:一个数据集或表包含了至少一个的要素或行.不能为空的字段的添加只能发生在空的数据集或表中. 解决方法: 在现有的ArcGIS中,唯一的解决办法就是设置这个字段可以为空,来重新创新这个表或数据集.需要将数据从原始的表中重新加载一次. http://support.esrichina-bj.cn/2008/0505/821.html

response.addCookie(cookie)添加cookie失败.

两个if循环能进来,创建的两个cookie也能通过控制台输出.  但是却添加失败. 原因是:request.getRequestDispatcher("/MainFrame").forward(request, response);已经把请求转发了. 所以两个cookie虽然能创建并能读取.但请求已经转发到另一个页面了.response已经不具备向浏览器响应请求的能力了.所以不能添加cookie

VS2010添加类失败问题,弹出错误框,提示 CodeModel操作失败,无法访问标记数据库

我在使用VS2010添加类的时候,会弹出一个错误框,提示 CodeModel操作失败,可以无法访问标记数据库 英文版是 CodeModel operation failed,Possibly cannt access Tag database. 添加类很是麻烦.      后来到网上搜索了下,终于在 一个论坛找到了解决方法,记录在这里备忘. 解决方法: 1.删除解决方案所在文件中的*.sdf文件                      2.删除解决方案目录中Ipch下的文件         

gluster添加节点失败报错:No route to host

glusterfs 3.4.7和gluster3.6.4都会出现该问题. 服务器端执行添加peer命令报如下错误: Probe returned with unknown errno 107 对应日志错误信息如下: [2015-08-25 02:47:06.818281] I [glusterd-handler.c:1031:__glusterd_handle_cli_probe] 0-glusterd: Received CLI probe req node61 24007[2015-08-2

花生壳添加映射失败怎么办

http://blog.itpub.net/30237496/viewspace-1668431 花生壳映射失败需要根据使用的应用及本地网络环境进行排查解决. 1,检查本地hosts解析文件.看看是否有错误的内网IP地址解析到域名. 2,本地清除DNS缓存,或更换电信或阿里云公共DNS.可能是本地DNS解析未刷新原因引起. 3,本地安装目录删除本地生成配置文件PhMain.ini,然后重启应用.配置文件出错了,我也不知道这是为什么,官方就是这么说的,具体原因不详. 4,操作失误,重新做一次映射流

SQL2012群集添加资源失败解决

问题原因:群集是WIN2012R2+SQL2012Q企业版架构,遇到点问题要解决,不小心做了如下操作:点了"更多资源"à"SQLServer". 结果:杯具了,SQL server角色立马画X,启动失败(因未及时截图,所以示意一下画X的部位显示红X失败) 问题分析:是我不小心加了资源导致,查看系统日志果然有相关报错.于是执行命令看了一下: 果然多了一个失败的资源! 在这里要抱怨一下,误加了资源报了错,WIN2012R2群集管理器既看不到错误的资源,也无法删除!!!这

discuz 添加板块失败解决办法

最近把服务器环境升了下级,发现discuz后台添加栏目添加不了了,数据库没变,源代码没变,就突然添加不了了.刚开始添加1个板块成功了,再添加就怎么也添不进去了.只是页面刷新了一下,啥提示没有. 经过一路var_dump,发现提交的表单最后一个字段editsubmit没提交上来,遂百度得知原来PHP从5.3.9开始增加一个变量 max_input_vars 用来限制提交的表单数量,折腾了半天,原来php小版本升级引起的不兼容,php中默认post中的参数的个数是1000, 超过部分会被自动扔掉.