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 / 233902
Accepted
Aaron Rheams
Aaron Rheams
Asked: 2019-04-04 19:58:20 +0800 CST2019-04-04 19:58:20 +0800 CST 2019-04-04 19:58:20 +0800 CST

Monitorando tarefas de manutenção em clusters AlwaysOn

  • 772

Eu tenho um ambiente com vários AGs em um único servidor e eles encontram uma situação de divisão em que alguns acabam em um nó e alguns acabam no outro nó (em um evento de failover, talvez). Quando as tarefas de manutenção (a gama básica de reindexação, atualização, etc.) são executadas nesses nós, elas apenas realizam operações efetivamente em bancos de dados que são read_write no lado primário de seus respectivos AGs. Isso faz com que o trabalho falhe, pois os bancos de dados são somente leitura nos secundários. Portanto, em uma situação de AG dividido, ambos os nós sempre mostrarão manutenção com falha no histórico de tarefas.

Escusado será dizer que é difícil monitorar esses clusters. Eu propus duas soluções possíveis para a gestão. Criamos scripts das tarefas de manutenção usando comandos DBCC para os bancos de dados individuais com base em suas propriedades de atualização ou simplesmente nos limitamos a um AG por servidor. Eles não gostam de nenhuma das duas soluções. Alguém sabe uma maneira de manter as tarefas internas de manutenção do SQL Server e direcioná-las apenas aos bancos de dados primários?

maintenance availability-groups
  • 2 2 respostas
  • 401 Views

2 respostas

  • Voted
  1. Best Answer
    HandyD
    2019-04-04T20:44:43+08:002019-04-04T20:44:43+08:00

    Os Planos de Manutenção do SQL Server não têm funcionalidade incorporada para detectar o estado da réplica AG para um determinado banco de dados e agir de acordo. Para fazer isso, você deve implementar a funcionalidade personalizada.

    Dependendo de como você está implementando suas tarefas de manutenção, existem algumas opções para isso.

    Opção 1:

    Se você estiver usando planos de manutenção do SQL, crie um conjunto de planos de manutenção por grupo de disponibilidade e direcione apenas os bancos de dados desse grupo. Remova os agendamentos desses planos e crie um trabalho do SQL Agent que seja executado no agendamento desejado. Faça com que o trabalho do Agente verifique sys.dm_hadr_availability_replica_states para confirmar que o AG em questão está no estado primário e, em caso afirmativo, execute os trabalhos do Agente apropriados para executar as tarefas do plano de manutenção.

    Opção 2:

    Se você estiver usando trabalhos do SQL Agent com scripts T-SQL para executar suas tarefas de manutenção, adicione alguma lógica aos scripts para verificar sys.dm_hadr_database_replica_states antes de executar para validar se o banco de dados em questão é realmente o principal.

    Opção nº 3:

    Redesenhe seus processos de manutenção para utilizar a excelente solução de manutenção da Ola Hallengren . Isso tem a lógica para lidar com Grupos de Disponibilidade já integrados, portanto, você economiza tempo ao projetar, testar e implantar uma solução por conta própria. Você simplesmente implanta um conjunto idêntico de trabalhos do Agente para executar os procedimentos armazenados em cada réplica. Todos eles serão executados, mas apenas aqueles que você deseja executar qualquer trabalho o farão.

    Notas:

    • Algumas tarefas na solução da Ola são executadas em todas as réplicas o tempo todo, como verificações de integridade e manutenção no nível do servidor (ciclo de log, etc.). Eles devem ser executados em todas as réplicas (sim, até mesmo verificações de integridade), então você não deve se preocupar com isso.
    • A solução da Ola verifica a réplica de backup preferencial usando sys.fn_hadr_backup_is_preferred_replica antes de fazer backup, portanto, certifique-se de que suas preferências de backup estejam definidas corretamente em seus AGs.
    • Os Planos de Manutenção , em geral, não são recomendados pela maioria dos DBAs devido à inflexibilidade que muitas vezes impõem. As soluções baseadas em T-SQL ou PowerShell geralmente são preferidas, pois são muito mais robustas.
    • As opções #2 e #3 são essencialmente as mesmas, mas a opção #3 significa que outra pessoa fez o trabalho duro por você. Além disso, o uso generalizado dessa solução significa que há muita ajuda e conselhos na comunidade SQL se você tiver problemas.

    Qualquer uma dessas opções deve ser implantada de forma que os mesmos trabalhos sejam implantados em todas as réplicas e executados ao mesmo tempo. As únicas diferenças são que algumas tarefas são executadas apenas na réplica primária, enquanto outras apenas executam o trabalho e saem silenciosamente sem realizar nenhum trabalho devido ao estado da réplica.

    Sua equipe de gerenciamento pode não gostar da ideia de refatorar os processos de manutenção atuais, mas a realidade é que eles precisam se quiserem automatizar isso para lidar com o failover, caso contrário, as tarefas de manutenção devem ser gerenciadas manualmente após o failover.

    • 3
  2. Aaron Rheams
    2019-04-05T11:13:43+08:002019-04-05T11:13:43+08:00

    Acabei fazendo isso para o CheckDB. As outras tarefas simplesmente usarão o mesmo modelo. Funciona. Espero não estar perdendo nada importante.

    Declare @DatabaseList Table (Name nvarchar(128))
    Declare @Database nvarchar(128)
    Declare @cmd nvarchar(max)
    
    Insert Into @DatabaseList
    Select Name From sys.databases
    Where database_id <> 2
    
    While Exists (Select 1 From @DatabaseList)
    Begin
    
        Set @Database = (Select Top 1 Name From @DatabaseList)
    
        If DATABASEPROPERTYEX(@Database, 'updateability') = 'READ_WRITE'
        Begin
    
            Set @cmd = 'DBCC CHECKDB(N'''+@Database+''') WITH NO_INFOMSGS'
    
            Exec (@cmd)
    
        End
    
        Delete From @DatabaseList Where Name = @Database
    
    End
    
    • 0

relate perguntas

  • Diferença entre bloqueio e consequências no nível da linha e no nível da página

  • Quais são as práticas recomendadas para excluir permanentemente um banco de dados com segurança?

  • No MS SQL, como descubro quais tabelas não são consultadas ou atualizadas há muito tempo?

  • Localização das informações de tarefas de banco de dados de backup do plano de manutenção (SQL Server 2005)

  • Quebrando e Restaurando um Espelho

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