AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

saída sp_testlinkedserver detalhada

  • 772

Criei um trabalho de script/agente que pesquisa nossos servidores vinculados a cada 10 minutos para garantir que estejam online. Agora, quando alguém fica offline, gera um e-mail e me notifica. Veja abaixo: insira a descrição da imagem aqui

Agora, agora ele usa apenas um passa/falha. O que eu quero fazer é, quando a comunicação entre os servidores ficar offline, gerar não apenas que está offline, mas também o motivo. Semelhante à leitura que você obtém do SSMS quando testa um servidor vinculado e está offline:

insira a descrição da imagem aqui

Isso é possível? Procurei parâmetros detalhados adicionais que possam me ajudar a fazer isso, mas não consegui encontrar nenhum. As informações são geradas no SSMS, o que me leva a acreditar que existe alguma maneira de obtê-las, só não sei como.

Obrigado como sempre pessoal!

ATUALIZADO Tive que adicionar algumas funcionalidades específicas do sistema a isso, bem como meu próprio SQL que eu já havia construído, mas o relatório de erros está online. Funciona com nossos servidores SQL e nossos ambientes iSeries/400. Aqui está o que ele cospe agora:

insira a descrição da imagem aqui

Obrigado novamente por toda a ajuda neste. Pode ser necessário postar isso no SSC para que outros possam usá-lo.

sql-server linked-server
  • 2 2 respostas
  • 4197 Views

2 respostas

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

    Tal como acontece com a resposta vinculada , você deve ser capaz de fazer isso usando TRY/CATCH; o problema (sem trocadilhos) com a outra resposta é que, como o nome do servidor vinculado é validado em tempo de compilação, caso o teste falhe, o lote não é executado. Em vez disso, você pode colocar o teste do servidor vinculado dentro do SQL dinâmico:

    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
    

    Isso deve permitir que você capture uma variedade de erros, incluindo:

    • Se @srvnão for preenchido:

      214 | O procedimento espera o parâmetro '@servername' do tipo 'sysname'.

    • Se @srvnão for um servidor vinculado definido:

      7202 | Não foi possível encontrar o servidor 'whatever' em sys.servers. Verifique se o nome do servidor correto foi especificado. Se necessário, execute o procedimento armazenado sp_addlinkedserver para adicionar o servidor a sys.servers.

    • Se uma conexão @srvfalhou no momento da criação do servidor vinculado:

      7303 | Não é possível inicializar o objeto de fonte de dados do provedor OLE DB "SQLNCLI11" para o servidor vinculado "qualquer coisa".

    • Se uma conexão @srv1expirar (por exemplo, o servidor está offline) - isso estava usando um servidor vinculado local, portanto, o texto pode ser um pouco diferente ao usar pipes nomeados ou TCP/IP:

      2 | Provedor de memória compartilhada: não foi possível abrir uma conexão com o SQL Server [2].

      (Com TCP/IP, Kin diz que a mensagem de erro é:

      Provedor TCP: uma tentativa de conexão falhou porque a parte conectada não respondeu adequadamente após um período de tempo ou a conexão estabelecida falhou porque o host conectado não respondeu.

    • Se @srvnão estiver configurado para acesso a dados:

      7411 | O servidor 'whatever' não está configurado para DATA ACCESS.

    • Se o servidor vinculado foi configurado com o nome de usuário/senha errado (ou passa as credenciais atuais e elas falham):

      18456 | Falha de login para o usuário 'foo'.

    Você também pode iniciar o lote EXECUTE ASse estiver tentando testar o servidor vinculado com credenciais específicas.

    Se o teste do servidor vinculado for bem-sucedido, você poderá continuar dentro do TRYbloco para fazer outras coisas, como OPENQUERYconsultas usando nomes de 4 partes etc., e deve haver uma série de outros erros que você pode capturar e relatar detalhadamente. ..

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

    Aaron respondeu sua pergunta perfeitamente. Estou apenas adicionando o script completo que escrevi para testar em meu ambiente.

    Abaixo segue o roteiro:

    /************************************************************************************
    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
    

    Abaixo está a saída:

    insira a descrição da imagem aqui

    • 3

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve