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 / 139231
Accepted
Kahn
Kahn
Asked: 2016-05-23 23:10:38 +0800 CST2016-05-23 23:10:38 +0800 CST 2016-05-23 23:10:38 +0800 CST

CDC com Grupos de Disponibilidade AlwaysOn

  • 772

Recentemente, consegui habilitar o CDC em um AG sempre ativo. Embora muitas fontes afirmem que ativar o CDC no alwaysON AG é tão fácil quanto em qualquer servidor autônomo, na verdade não é. Como MS diz aqui :

Você deve criar os trabalhos de [captura e limpeza do CDC] em todos os possíveis destinos de failover antes do failover e marcá-los como desabilitados até que a réplica de disponibilidade em um host se torne a nova réplica primária. Os trabalhos do CDC em execução no antigo banco de dados primário também devem ser desabilitados quando o banco de dados local se tornar um banco de dados secundário. Para desabilitar e habilitar trabalhos, use a opção @enabled de sp_update_job (Transact-SQL). Para obter mais informações sobre como criar trabalhos de CDC, consulte sys.sp_cdc_add_job (Transact-SQL).

Acontece que depois que habilitamos o CDC na réplica primária, absolutamente nada aconteceu na secundária. Portanto, de acordo com o conselho do MS, fiz um failover manual e criei os trabalhos lá, depois fiz outro failover de volta ao primário original.

E, aparentemente, conforme sugerido na citação acima, tão totalmente compatível quanto o CDC deve ser com o alwaysOn AG, ele é totalmente incapaz de determinar se está sendo executado na réplica primária ou secundária.

Então, com o pano de fundo fora do caminho, vamos à minha pergunta : como você garante que os trabalhos do CDC estejam sempre habilitados na réplica primária atual? E sempre desativado (para não produzir erros) nos secundários?

Uma vez que, obviamente, um grande ponto do alwaysOn AG é que você não precisa estar lá manualmente no segundo em que o primário falha por qualquer motivo, porque um secundário vai pegar a folga e manter o sistema online, presumo que seja esperado apenas criar um trabalho em cada uma das réplicas, pesquisando constantemente seus status e alterando os estados dos trabalhos do CDC enquanto faz isso?

Se estiver correto, você tem algum conselho específico sobre como fazer isso, scripts ou guias específicos, etc.? Porque, para o que obviamente deveria ser um dilema bastante comum em todo o mundo, parece estranho que eu tenha que criar manualmente um novo trabalho TSQL em cada réplica apenas para executar o que é essencialmente a funcionalidade básica básica do CDC com alwaysOn AG .

Isso parece improvável, e é por isso que estou perguntando. Ou eu entendi errado alguma coisa? Obrigado!

sql-server availability-groups
  • 2 2 respostas
  • 6495 Views

2 respostas

  • Voted
  1. Best Answer
    Cody Konior
    2016-05-23T23:28:11+08:002016-05-23T23:28:11+08:00

    A maneira mais comum e aceita é que, assim que um trabalho chega a um servidor em um AG, você começa a editá-lo:

    • Adicione uma primeira etapa de trabalho que verifica se esta é a principal.
    • Saia com sucesso, se não for.
    • Caso contrário, continue na etapa de trabalho normal.

    Isso foi explorado em algumas outras questões SE (elas não se relacionam especificamente ao CDC, e é por isso que você não as encontrou):

    • Como executar o SQL Job apenas na réplica primária nos Grupos de Disponibilidade AlwaysOn?

    • Trabalhos do SQL Server Agent e grupos de disponibilidade

    A segunda maneira é criar um trabalho de vigilância usando métodos semelhantes que ativarão e desativarão os trabalhos. Isso provavelmente é mais aceitável, visto que você está mexendo nos trabalhos internos do SQL Server. Mas depende de você.

    Não fiquei muito satisfeito com as amostras acima de nomes de AG codificados e outros. Prefiro apenas que a etapa do trabalho opere dentro do banco de dados em questão, e assim pode funcionar por si mesmo se tiver um grupo e fizer parte dele (já que seus trabalhos devem continuar em execução mesmo se você removê-los temporariamente de um AG).

    Set Nocount On
    
    If  Exists (
        -- Database in an AG
        Select  Top 1 0
        From    sys.availability_databases_cluster adc
        Join    sys.availability_groups ag
        On      adc.group_id = ag.group_id
        Join    sys.dm_hadr_availability_group_states dhags
        On      ag.group_id = dhags.group_id
        Where   adc.database_name = Db_Name()
        )
    And Not Exists (
        -- Database in an AG which is Primary on this instance
        Select  Top 1 0
        From    sys.availability_databases_cluster adc
        Join    sys.availability_groups ag
        On      adc.group_id = ag.group_id
        Join    sys.dm_hadr_availability_group_states dhags
        On      ag.group_id = dhags.group_id
        Where   adc.database_name =  Db_Name()
        And     Upper(dhags.primary_replica) = Upper(@@Servername)
        )
    Begin
    Raiserror('This is not the primary replica.', 16, 1) With Nowait
    Return
    End
    
    -- Check if the database isn't accessible
    If  Not Exists (
        Select  Top 1 0
        From    sys.databases
        Where   databases.name = Db_Name()
        And     state_desc = 'ONLINE'
        )
    Begin
        Raiserror('The database doesn''t exist or isn''t ONLINE on this node.', 16, 1) With Nowait
        Return
    End
    

    Esse tipo de coisa também é útil para trabalhos SSIS e outros bits que surgem com o tempo.

    Indo um passo além, você provavelmente deseja criar um script do PowerShell que verificará seus servidores de tempos em tempos em busca de AGs que tenham trabalhos de CDC e que não tenham um watchdog, para que você seja notificado para criar um.

    • 3
  2. Krzysztof Gapski
    2018-12-12T03:01:09+08:002018-12-12T03:01:09+08:00

    Lembre-se de que o CDC usa o agente de leitura de log da replicação transacional que, por padrão, não processará registros de log que ainda não tenham sido protegidos em todas as réplicas secundárias do grupo de disponibilidade. Considere também manter a ativação do sinalizador de rastreamento 1448 para forçar a ação no modo de confirmação assíncrona.

    Dê uma olhada em alguns pensamentos adicionais sobre CDC com AlwaysON aqui .

    • 1

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