上周做了一个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失败的更多相关文章

  1. SQL Server AlwaysOn添加监听器失败

    标签:MSSQL/ 一.错误描述 1.群集服务未能使群集服务或应用程序“Alwayson22”完全联机或脱机.一个或多个资源可能处于失败状态.这可能会影响群集服务或应用程序的可用性 2.群集服务中的群 ...

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

    我在使用VS2010添加类的时候,会弹出一个错误框,提示 CodeModel操作失败,可以无法访问标记数据库 英文版是 CodeModel operation failed,Possibly cann ...

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

    两个if循环能进来,创建的两个cookie也能通过控制台输出.  但是却添加失败. 原因是:request.getRequestDispatcher("/MainFrame").f ...

  4. 【VMware vSphere】vCenter添加主机失败:无法访问指定主机

    背景 前一段时间,给一台服务器安装ESXi系统,安装成功之后,通过vCenter在上面安装了一台VDP系统.结果前几天发现服务器掉线,重新连接时出现问题.问题描述如下: 其中错误堆栈具体内容为:在 v ...

  5. ubuntu 的 apt-get update 出现404错误时,或者添加ppa失败时,ubuntu 版本也 end of life 了的解决方案

    xmodulo.com/how-to-fix-apt-get-update-error-on-ubuntu.html 如果是依赖没找到,可以用 sudo apt-get install -f 先补齐依 ...

  6. matlab添加toolbox失败的解决办法

    matlab添加toolbox有三种方法: 1.在网上下载对应的文件,再复制到matlab安装路径中的toolbox文件夹里. 结果:失败.仍然显示不能用该模块. 2.由于笔者的学校有买正版,所以可以 ...

  7. 使用postman添加cookie失败和cookie消失问题

    例如 groupId=2; path=/; domain=.www.baidu.com; HttpOnly; Expires=Tue, 16 Jul 2019 03:42:12 GMT; 添加失败和c ...

  8. nhibernate操作sql2008数据库(添加数据失败)

    今天遇到一错误困了我一天,如此痛恨,遂记录于此: nhibernate框架+MVC模式搭的项目,添加数据时报错: "could not insert: [KXRMallManage.Mode ...

  9. discuz 添加板块失败解决办法

    最近把服务器环境升了下级,发现discuz后台添加栏目添加不了了,数据库没变,源代码没变,就突然添加不了了.刚开始添加1个板块成功了,再添加就怎么也添不进去了.只是页面刷新了一下,啥提示没有. 经过一 ...

随机推荐

  1. iOS 学习 - 10下载(3) NSURLSession 音乐 篇

    使用 NSURLSession 下载,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中 // // ViewController.m // Web ...

  2. 转:SVN常见问题与解决方法

    今天发现一个SVN很奇葩的问题.原来SVN提交的时候也是识别提交路径的大小写的... 发现网上有篇博客总结的挺好的.转载下来,转载出路:http://blog.csdn.net/shinn613/ar ...

  3. 《AngularJS高级程序设计》学习笔记

      一.AngularJS应用剖析 AngularJS存在一些最主要的构件,如模型,视图和控制器.但AngularJS中也有许多其他可供灵活使用的部件,包括模块,指令,过滤器,工厂和服务. 一 . 1 ...

  4. BitTorrent Sync - 神奇的文件同步软件,无需服务器让多台电脑互相同步!

    176,487 微博 腾讯 空间 微信 141 49 如今人们对文件备份和同步的需求已经越来越强烈了.像 Dropbox 一样的云存储网盘有很多,但它们都有一个局限性,就是所有的文件都得经过它们的服务 ...

  5. PHP 取前一天或后一天、一个月时间

    //获得当前时间     //date()格式化时间返回String类型.     date("Y-m-d H:i:s") $current_date = date(’Y-m-d’ ...

  6. proxool 连接池警告分析:appears to have started a thread named [HouseKeeper] but has failed to stop it

    1. 问题:日志中出现下面的警告: 警告: The web application [ROOT] appears to have started a thread named [HouseKeeper ...

  7. DataTable操作

    一 复制DataTable中符合条件的DataRow到新的DataTable中 One: DataTable TableTemp = new DataTable();//临时table DataTab ...

  8. 烂泥:【转】rsync命令参数详解

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. rsync安装完毕后,我们可以通过rsync –help查看rysnc命令的使用.如下: 有关rsync的命令格式,在此我们就不多介绍了.如果有想了解的 ...

  9. my_strlen()

    int my_strlen(const char* S){ int i=0; while('\0'!=*(S+i)){ i++; } return i; }

  10. google-analytics.com

    最近有朋友问,为什么我的网站打开时在执行google analytics有较长的停顿时间.要如果解决?这个问题其实很早就有,最好的解决办法是将网站所有页面的传统追踪代码统一替换为最新的异步追踪代码.不 ...