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 / 204963
Accepted
SQL_Hacker
SQL_Hacker
Asked: 2018-04-26 12:19:10 +0800 CST2018-04-26 12:19:10 +0800 CST 2018-04-26 12:19:10 +0800 CST

Conexão Condicional no SSIS com base no status do Grupo de Disponibilidade

  • 772

Estou trabalhando em um pacote SSIS que atualizará os bancos de dados dev dos backups de produção. O pacote está em vigor há anos, mas estamos implantando grupos de disponibilidade na instância dev, portanto, as tarefas precisam ser alteradas para funcionar com as réplicas primárias e secundárias. Background: todas as instâncias são SQL Server 2014 SP2. Uma instância de produção (PD1), duas instâncias dev (DV3 e DV7) e uma instância de utilitário (DV1), onde o pacote SSIS é implantado no SSISDB e onde o trabalho do SQL Agent é executado. No pacote SSIS, depois que os backups completos são obtidos e colocados em um compartilhamento de rede da produção, o próximo conjunto de tarefas (em um pacote SSIS separado) precisa descobrir qual nó hospeda a réplica primária. Estou seguindo os passos listados aquipara fazer esse trabalho, e tudo funciona muito bem se for codificado (o que, é claro, não funcionará se/quando ocorrer um failover). A única maneira que consegui pensar em abordar isso é, em tempo de execução, avaliar qual instância é primária e prosseguir com as tarefas (que, a propósito, são todos objetos "Execute SQL Task" - exigindo sua própria definição de conexão ). Vi alguns exemplos de como usar expressões em ConnectionStrings e variáveis, mas não consigo descobrir como definir o valor retornado da consulta abaixo no SQL Server para retornar a instância correta para definir a string de conexão no pacote.

    select cs.replica_server_name
from sys.dm_hadr_availability_replica_states rs
join sys.dm_hadr_availability_replica_cluster_states cs
    on rs.replica_id = cs.replica_id
join sys.dm_hadr_name_id_map n
    on rs.group_id = n.ag_id
where rs.role = 2
and n.ag_name = 'DVAG001'

Idealmente, haveria dois desses gerenciadores de conexões, um para o primário e outro para o secundário, que eu poderia usar nos objetos "Execute SQL Task". Então tudo funcionaria perfeitamente. Pode muito bem haver outras maneiras de fazer isso, mas não tenho muita experiência em SSIS ou desenvolvimento fora do TSQL.

ATUALIZAÇÃO: O processo acima é feito todos os dias... e é por isso que estou usando um pacote SSIS e SQL Agent. Assim, todo o processo tem que ser automatizado e ter todos os valores necessários - principalmente a determinação dos estados das réplicas (primário e secundário) - dentro do pacote para que nenhuma intervenção manual seja necessária.

sql-server ssis
  • 2 2 respostas
  • 1346 Views

2 respostas

  • Voted
  1. Best Answer
    Evandro
    2018-05-05T03:54:32+08:002018-05-05T03:54:32+08:00

    Vamos supor que você tenha um grupo de disponibilidade com apenas uma réplica secundária (você pode expandir facilmente este exemplo para mais réplicas)

    1. Conexões

    Você precisará de 3 conexões:

    • Ouvinte AG (para executar a consulta que retornará qual servidor está mantendo o primário e o secundário)
    • Primário (a ser parametrizado com o servidor primário)
    • Secundário (a ser parametrizado com o servidor secundário)

    2. Variáveis

    Crie 2 variáveis ​​com tipo de dados String

    • Nome do servidor Primário
    • Nome do servidor Secundário

    insira a descrição da imagem aqui

    3. Consulta

    Para mapear um conjunto de resultados de consulta para uma variável usando Executar Tarefa SQL, sua consulta precisa retornar apenas uma linha. Você mapeará cada coluna para a variável que desejar. Sabendo disso, alterei sua consulta para o seguinte:

    WITH CTE_AGStatus as (
        select cs.replica_server_name, rs.role
        from sys.dm_hadr_availability_replica_states rs
        join sys.dm_hadr_availability_replica_cluster_states cs
            on rs.replica_id = cs.replica_id
        join sys.dm_hadr_name_id_map n
            on rs.group_id = n.ag_id
        where n.ag_name = 'DVAG001'
    )
    
    select  ServernamePrimary = MAX(case when role = 1 then replica_server_name end)
    ,       ServernameSecondary = MAX(case when role = 2 then replica_server_name end)
    from CTE_AGStatus
    

    (Sinta-se à vontade para alterá-lo como desejar, apenas lembre-se de retornar apenas uma linha)

    4. Mapeando o conjunto de resultados para variáveis

    No execute SQL Task Editor, cole a consulta acima, defina a conexão OLEDB 'AG listener' e altere o conjunto de resultados para 'Single row' Executar SQL Task Editor - guia Geral

    Em seguida, vá para a guia 'Conjunto de resultados' e mapeie as colunas para as variáveis Mapa do conjunto de resultados para variável

    5. Altere as cadeias de conexão

    Clique no gerenciador de conexões 'Primário' e vá até a aba 'Propriedades', depois clique em 'Expressões', selecione a propriedade 'Nome do Servidor' e adicione sua variável na Expressão.

    insira a descrição da imagem aqui

    Repita o processo para o gerenciador de conexões 'Secundário'

    6. Verifique o processo

    Para validar, você pode adicionar outras etapas e usar pontos de interrupção para verificar como suas variáveis ​​estão sendo executadas. Os próximos passos dependem de você. Agora você tem uma conexão apontando para cada servidor do seu AG. insira a descrição da imagem aqui

    • 8
  2. Sting
    2018-05-05T05:54:39+08:002018-05-05T05:54:39+08:00

    Como estratégia alternativa, posso considerar simplificar as coisas sem a necessidade de parâmetros SSIS usando a execução T-SQL (sem parâmetros necessários). SSIS, especialmente pacotes legados, sempre parecem tão propensos a erros e bugs que eu simplesmente não quero tocá-los se não for necessário:

    R Para começar, considere executar sua "Verificação de AG primário" nos próprios servidores de produção, em vez dos servidores de desenvolvimento.

    B. Em seguida, importe seus pacotes SSIS para produção se eles ainda não estiverem lá -- para serem executados lá. De qualquer forma, pode-se considerar as restaurações dev do prod mais como um processo de produção.

    C. E, finalmente, evite ao máximo alterar seus pacotes SSIS herdados executando o trabalho do Agente T-SQL que invoca a execução do pacote SSIS (restauração do banco de dados) de cada AG primário "potencial" usando o seguinte código - ou algo parecido - - conforme mostrado na Listagem A.

    Listagem A: Execute o pacote SSIS (restauração do banco de dados) somente quando o SQL Server for o principal -- por meio de um trabalho do SQL Agent.

    --If current server is the primary AG then run the legacy package
    
    if (select a.role_desc FROM sys.dm_hadr_availability_replica_states AS a JOIN sys.availability_replicas AS b  ON b.replica_id = a.replica_id WHERE b.replica_server_name like @@Servername) like 'Primary' 
    begin
                Declare @execution_id bigint  
                EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @execution_id=@execution_id OUTPUT, @folder_name=N'AlwaysOn', @project_name=N'MyTestPackage', @use32bitruntime=False, @reference_id=Null  
                    exec ssisdb.catalog.start_execution @execution_id 
    end
    

    Observação:

    Se estou entendendo bem, os servidores dev sempre terão o mesmo nome. São apenas os nomes dos servidores de produção que têm o potencial de mudar. Dado isso, acredito que o código mostrado na Listagem A permitirá que você realize o que precisa com um pouco menos de tempo e esforço. Você pode até pegar carona nessa execução no final de seus backups SQL para obter uma atualização mais imediata dos ambientes de desenvolvimento.

    • 0

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