AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 81505
Accepted
Kris Gruttemeyer
Kris Gruttemeyer
Asked: 2014-10-31 08:38:32 +0800 CST2014-10-31 08:38:32 +0800 CST 2014-10-31 08:38:32 +0800 CST

sp_testlinkedserver 输出详细

  • 772

我已经构建了一个脚本/代理作业,它每 10 分钟轮询一次我们的链接服务器,以确保它们在线。现在,当一个人离线时,它会生成一封电子邮件并通知我。见下文: 在此处输入图像描述

现在,现在它只使用通过/失败。我想做的是,当服务器之间的通信离线时,不仅要生成它离线,还要生成原因。类似于您在测试链接服务器并且它处于脱机状态时从 SSMS 获得的读数:

在此处输入图像描述

这可能吗?我已经搜索了可能帮助我完成此任务的任何其他详细参数,但找不到任何参数。这些信息是在 SSMS 中生成的,所以我相信有某种方法可以得到它,我只是不确定如何。

像往常一样感谢伙计们!

已更新 必须为此添加一些系统特定的功能以及我自己已经构建的 SQL,但错误报告是在线的。适用于我们的 SQL 服务器和 iSeries/400 环境。这是它现在吐出的内容:

在此处输入图像描述

再次感谢您对此提供的所有帮助。可能必须将其发布到 SSC,以便其他人可以使用它。

sql-server linked-server
  • 2 2 个回答
  • 4197 Views

2 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2014-10-31T10:40:26+08:002014-10-31T10:40:26+08:00

    与链接的答案一样,您应该可以使用TRY/CATCH; 另一个答案的问题(没有双关语)是,因为链接服务器的名称是在编译时验证的,如果测试失败,批处理不会执行。因此,您可以将链接服务器测试放在动态 SQL 中:

    DECLARE @srv SYSNAME = N'linked_server_name';
    
    BEGIN TRY
      EXEC master.sys.sp_executesql 
          N'EXEC master.sys.sp_testlinkedserver @srv;',
          N'@srv SYSNAME', @srv;
    END TRY
    BEGIN CATCH
      SELECT ERROR_NUMBER(), '|', ERROR_MESSAGE();
    END CATCH
    

    这应该允许您捕获各种错误,包括:

    • 如果@srv未填充:

      214 | 过程需要“sysname”类型的参数“@servername”。

    • 如果@srv不是定义的链接服务器:

      7202 | 在 sys.servers 中找不到服务器“随便”。验证是否指定了正确的服务器名称。如有必要,执行存储过程 sp_addlinkedserver 将服务器添加到 sys.servers。

    • 如果@srv在创建链接服务器时连接失败:

      7303 | 无法为链接服务器“whatever”初始化 OLE DB 提供程序“SQLNCLI11”的数据源对象。

    • 如果连接@srv1超时(例如服务器离线) - 这是使用本地链接服务器,因此使用命名管道或 TCP/IP 时文本可能会有所不同:

      2 | 共享内存提供程序:无法打开与 SQL Server [2] 的连接。

      (使用 TCP/IP,Kin 说错误消息是:

      TCP Provider:连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。

    • 如果@srv未配置数据访问:

      7411 | 没有为数据访问配置服务器“whatever”。

    • 如果链接服务器配置了错误的用户名/密码(或通过了当前凭据但失败):

      18456 | 用户 'foo' 登录失败。

    EXECUTE AS如果您尝试在特定凭据下测试链接服务器,也可以开始批处理。

    如果链接服务器的测试成功,您可以在TRY块内继续执行其他操作,例如OPENQUERY使用 4 部分名称的查询等,并且应该有大量其他错误可以捕获并详细报告。 ..

    • 5
  2. Kin Shah
    2014-10-31T10:57:19+08:002014-10-31T10:57:19+08:00

    亚伦完美地回答了你的问题。我只是添加了我为在我的环境中测试而编写的完整脚本。

    下面是脚本:

    /************************************************************************************
    Author      :   Kin Shah
    
    Purpose     :   Written for dba.stackexchange.com
                    http://dba.stackexchange.com/q/81505/8783
                    Find linked servers that are not able to connect with error message
    
    Date        :   10/30/2014              
    
    ************************************************************************************/
    
    if object_id ('tempdb..#LinkedServerTest') is not null
    begin
       drop table #LinkedServerTest 
    end;
    create table #LinkedServerTest (Server_name sysname,
                                    [STATUS] char(7),
                                    [Time_Server_Polled] datetime,
                                    [ERROR_NUMBER] int,
                                    [ERROR_MESSAGE] varchar(max)
                                    )
    if exists (
            select 1
            from master.sys.servers
            where is_linked = 1
            )
    begin
        declare @servername sysname
    
        select @servername = min(name)  from master.sys.servers where is_linked = 1
    
            while @servername is not null
            begin
    
            begin try
                declare @cmd nvarchar(max);
    
                set @cmd = 'SELECT * FROM OPENQUERY(' + quotename(@servername) + ', ''select 1 from tempdb..sysobjects'')'
    
                    --print @cmd
                    EXEC master.sys.sp_executesql @cmd
            end try
    
            begin catch
                insert into #LinkedServerTest
                select @servername as Server_name
                        ,'OFFLINE' as [STATUS]
                        , getdate() as [Time_Server_Polled]
                        ,ERROR_NUMBER() as [Error_Number]
                    ,ERROR_MESSAGE() as [ERROR_MESSAGE]
            end catch
            select @servername = min(name)  from master.sys.servers where is_linked = 1 and name>@servername
    
        end
    end
    else
        select 'There are no linked servers on this server instance !!'
    
    select * from #LinkedServerTest
    

    下面是输出:

    在此处输入图像描述

    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve