Blog

Mas que CU (Cumulative Update), hein?!

· Administração, AlwaysOn

Falaê, blz?!

Hoje venho aqui, pela primeira vez, compartilhar um pouco da experiência curiosa que tive ao atualizar uma CU no SQL Server. Dá uma olhada e deixa seu feedback pra mim! ;D

Agradeço aos meus parceiros Leandro Sampaio e Renato Siqueira da DataSide por estarem comigo nesse dia maluco.


O ambiente

  • Azure
  • 3 Servidores Windows 2016 Datacenter
  • 3 Instâncias SQL Server 2017 Enterprise CU18
  • 2 AlwaysON Availability Groups:
    • AG1: Nós 1, 2 e 3
    • AG2: Nós 2 e 3

O caso

As CUs (Cumulative Updates) do SQL Server são lançadas com certa frequência e somos sempre instruídos a manter as instâncias o mais atualizadas possível para corrermos menos riscos de segurança, bugs, performance ruim, etc. além de termos diversas melhorias frequentemente.

Baseado nisso, que é a própria Microsoft, fabricante do SGBD, quem recomenda, resolvemos aplicar a devida CU (24) no ambiente.

Vale ressaltar que desde o SQL Server 2017 a Microsoft não libera mais Service Pack, somente os pacotes de Cumulative Update.
NEVES, Tiago - Outubro de 2020

Seguindo o processo que sempre usei (Descrevo isso no próximo tópico) e que também é recomendado pela “Mãecrosoft” e alguns mestres da comunidade , fizemos a instalação da CU na réplica menos crítica do AG, usada somente para alguns reports pontuais e Disaster Recovery, com a ideia de em seguida aplicar nas demais instâncias. Ou seja, esse nó fica a maior parte do tempo em stand by e a réplica é assíncrona.


O processo

  • Análise e download da CU a ser instalada;
  • Instalação em um ambiente de testes;
  • Análise do dashboard para garantir que todo o ambiente está saudável antes da instalação;
  • Backup dos bancos de dados de sistema;
  • Backup dos bancos de dados do usuário;
  • Failover. Nesse caso não foi necessário por ser uma instância secundária;
  • Suspender a movimentação de dados para este node. Já vi gente fazer e já fiz sem isso e deu bom também. Fica a critério;
  • Instalação do patch;
  • Restart da instância;
  • Retomar a movimentação de dados.

O susto e o troubleshooting

Ao final da instalação, fomos checar o “healthly dashboard” dos grupos e…ué?! Cadê os AGs?

A partir daí, a conversa foi mais ou menos assim:

Leandro: Calma! Dá uma olhada nos bds, Douglas.

Douglas: Uuumm…a grande maioria em “Restoring” e alguns em “Suspect”.

Aaa…talvez esteja só demorando pra voltar. Obs.: A negação no desespero é demais…

1 minuto depois:

Eita! Demorou muito.

Chamamos o Renato:

Renato: Vamos reiniciar a instância. Nada!

Reinicia a máquina então?! Mesma coisa!

Douglas: Vou checar o WSFC e o Cluster Events. Com exceção do node 3 down, tudo normal e nada esclarecedor no log.

Ai ai ai…

Renato: Perae! Dá um “SELECT @@SERVERNAME”.

BINGO!

Depois da instalação da CU, o SQL Server, misteriosamente, assumiu o nome do host que estava na azure e não o “nome de rede” do servidor.

Imagina assim: O recurso na azure tem o nome de VM-SQL-03 mas no AD foi registrado como AZR-SQL-03. Entendeu agora?

Quando isso aconteceu, o node deixou de ser participante do AlwaysOn porquê o nome que ele conhecia não existia mais.

A partir disso, fizemos o seguinte:

  • Imediatamente, paramos os backups de log nos nós primários a tempo para evitar uma dessincronização maior;

  • Removemos o server, registrado na sys.servers, com o nome incorreto:

    EXEC sp_dropserver 'VM-SQL-03'
  • Adicionamos novamente com o nome correto:

    EXEC sp_addserver 'AZR-SQL-03'
  • Removemos o node dos AGs;

  • Incluímos novamente com a opção de join only. E BOA! Praticamente todos os bds que estavam em restoring voltaram a vida. Deletamos os que se negaram e fizemos o automatic seeding. AEEE…tá quase!;

  • E os que estavam em suspect? Restauramos eles com a ajuda da magnífica dba-tools e aqui fica um ponto fantástico do backup no SQL Server + Azure. Nosso job de backup aponta diretamente para a Azure por meio de uma url. Assim, para baixá-los ou fazer o restore direto da nuvem, precisamos recuperar a url de cada um deles. Dá uma olhada nisso, que legal (Funciona também se não for cloud):

    $MeuBackup =
        Get-DbaDbBackupHistory `
            -SqlInstance 'AZR-SQL-03' `
            -Database 'MeuDB' `
            -Last
    
    $MeuBackup.FullName
    
    <#
    # Depois:
    
    RESTORE DATABASE MeuDB FROM URL = 'URL do MEUDB.bak'
    #>
  • “Resume” neles:

    ALTER DATABASE MeuDB SET HADR AVAILABILITY GROUP = AG01;
    
    ALTER DATABASE MeuBD SET HADR RESUME;
  • Pronto! Depois de ~6h, ambiente recuperado! Uffaa…menos mal que não era “Produção” de fato e nenhuma aplicação foi afetada.

Mas e agora…

Antes de seguirmos com a instalação nos demais nodes, resolvemos abrir um chamado na Microsoft.

Explicamos o caso detalhadamente, enviamos diversos logs gerados por uma ferramenta que eles nos forneceram, backup do master, etc. e mesmo assim eles não conseguiram simular a mesma falha. Pelo menos conseguiram identificar no log que, para a instância, o server realmente mudou de nome:

AZR-SQL-03_MSSQLSERVER_1033_ERRORLOG 
2021-06-16 03:29:57.32 spid6s      Server name is 'AZR-SQL-03'. This is an informational message only. No user action is required.
  AZR-SQL-03_MSSQLSERVER_1033_ERRORLOG.1 
2021-06-16 03:11:42.04 spid6s      Server name is 'VM-SQL-03'. This is an informational message only. No user action is required.
  AZR-SQL-03_MSSQLSERVER_1033_ERRORLOG.2 
2021-06-16 03:00:53.47 spid6s      Server name is 'VM-SQL-03'. This is an informational message only. No user action is required.
  AZR-SQL-03_MSSQLSERVER_1033_ERRORLOG.3 
2021-06-16 02:42:54.12 spid5s      Server name is 'VM-SQL-03'. This is an informational message only. No user action is required.
  AZR-SQL-03_MSSQLSERVER_1033_ERRORLOG.4 
2021-06-16 02:41:16.07 spid5s      Server name is 'VM-SQL-03'. This is an informational message only. No user action is required.
  AZR-SQL-03_MSSQLSERVER_1033_ERRORLOG.5 
2021-05-15 13:03:07.59 spid6s      Server name is 'AZR-SQL-03'. This is an informational message only. No user action is required.
  AZR-SQL-03_MSSQLSERVER_1033_ERRORLOG.6 
2021-05-07 03:43:57.87 spid6s      Server name is 'AZR-SQL-03'. This is an informational message only. No user action is required.

Também tentei simular no meu lab e correu tudo bem.

A única justificativa que imaginamos foi alguém, manualmente, ter feito a mudança do nome do servidor algum tempo antes da atualização mas as poucas pessoas com esse acesso (E, digasse de passagem, conhecimento também) negaram ter feito essa alteração.

A fabricante ainda não fechou o chamado. Seguimos no aguardo de algo menos assustador.

E você? Qual sua experiência mais legal aplicando patchs de atualização? Ou o que faria de diferente nesse processo todo? Deixa aqui nos comentários.

Referências