Tenho trocado certificados TDE em vários servidores para facilitar as restaurações - alguns tinham o nome errado, a impressão digital errada ou até mesmo ambos. Isso envolve a transferência de bancos de dados para um certificado temporário, a eliminação de certificados antigos, a criação do certificado pretendido (a partir do certificado e dos arquivos de chave) e a transferência de bancos de dados para ele. Tudo correu bem, exceto para bancos de dados em um servidor.
Ao executar DBCC CHECKDB(SomeDatabase) WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY
, recebo isto:
Msg 33111, Level 16, State 3, Line 106
Cannot find server certificate with thumbprint '<old removed thumbprint>'.
Msg 1823, Level 16, State 2, Line 106
A database snapshot cannot be created because it failed to start.
Msg 1823, Level 16, State 8, Line 106
A database snapshot cannot be created because it failed to start.
Msg 7928, Level 16, State 1, Line 106
The database snapshot for online checks could not be created. Either the reason is given in a previous error or one of the underlying volumes does not support sparse files or alternate streams. Attempting to get exclusive access to run checks offline.
Se for executado novamente com mensagens informativas, ele executa o comportamento esperado do CHECKDB posteriormente, de modo que parece obter o acesso necessário para off-line.
Os backups têm uma saída semelhante. Normalmente uso a UI do SSMS para backups ad hoc, que geram scripts como este comando:
BACKUP DATABASE [SomeDatabase] TO DISK = N'some\path\SomeDatabase.bak' WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'SomeDatabase-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
. Isto resulta em:
Msg 33111, Level 16, State 3, Line 108
Cannot find server certificate with thumbprint '<old removed thumbprint>'.
Msg 3013, Level 16, State 1, Line 108
BACKUP DATABASE is terminating abnormally.
A mesma coisa acontece com backups completos e somente cópia.
Observando o status da criptografia:
SELECT a.dbid, a.name AS DatabaseName
,b.encryption_state
,CASE b.encryption_state
WHEN 0 THEN 'No database encryption key present, no encryption'
WHEN 1 THEN 'Unencrypted - Encryption enabled, but not turned on'
WHEN 2 THEN 'Encryption in progress'
WHEN 3 THEN 'Encrypted'
WHEN 4 THEN 'Key change in progress'
WHEN 5 THEN 'Decryption in progress'
WHEN 6 THEN 'Protection change in progress (The certificate or asymmetric key that is encrypting the database encryption key is being changed.)'
END AS encryption_state_desc
,percent_complete
,encryptor_type
,key_algorithm
,key_length
,encryptor_thumbprint
,create_date
,regenerate_date
,modify_date
,set_date
,opened_date
FROM master.dbo.sysdatabases a
LEFT JOIN sys.dm_database_encryption_keys b
ON a.dbid = b.database_id
ORDER BY b.encryption_state desc,
DatabaseName;
Os bancos de dados com falha estão no estado 1 (chave de criptografia do banco de dados criada, mas a criptografia não está ativada) e mostram a nova impressão digital do TdeCert como encryptor_thumbprint
coluna. Existem alguns bancos de dados que estão no estado 3 (criptografados) e eles farão backup sem o certificado antigo. Se eu simplesmente colocar o certificado de volta no servidor, o CHECKDB/backups será executado com prazer - nenhum comando adicional no banco de dados será necessário.
Questões
- Por que ainda está tentando usar o certificado antigo? Achei que, como a chave de criptografia do banco de dados estava criptografada pelo novo certificado, não haveria mais necessidade do certificado antigo.
- Por que simplesmente colocar o certificado antigo de volta no servidor faz com que as coisas funcionem novamente? Eu esperava ter que mudar algo no banco de dados novamente.
- Por que não ocorre um erro quando removo o certificado antigo se algo o estiver usando?
- Existe um motivo provável para eu ter encontrado esse comportamento em apenas um servidor?
informações gerais
- Versão: Microsoft SQL Server 2019 (RTM-CU27) (KB5037331) - 15.0.4375.4 (X64) ... Edição Padrão
- O TDE é configurado com chaves simétricas, sem cofres de chaves externos.
- Tudo está no local, sem fatores Azure/nuvem.
- Este é um servidor não-prod; todos os bancos de dados usam o modelo de recuperação SIMPLES (sem logs de transações).
- Esses erros ocorrem em trabalhos automatizados, bem como em instruções executadas diretamente no SSMS. Tanto eu quanto a conta usada para trabalhos temos sysadmin no servidor.
- Isso está acontecendo em um único servidor. Todos os outros servidores nos quais troquei certificados (incluindo aqueles da mesma versão) não tiveram esse problema e não consigo replicar esse problema em outros servidores.
- O certificado antigo tinha o mesmo nome do certificado que eu gostaria de usar. Eu não esperaria que isso importasse - não importava para outros servidores - mas dado que algo parece estar "travado", pode ser relevante.
Testes
- Falha: CHECKDB gera uma mensagem de erro e passa a funcionar offline
- Sucesso: Nenhuma mensagem de erro, os comandos são executados com sucesso
Ativar totalmente a criptografia (ALTER DATABASE SomeDatabase SET ENCRYPTION ON) - falha
Basta trazer o certificado antigo de volta, não alterar nenhum banco de dados - sucesso
- Mas assim que o certificado antigo for descartado novamente, ele voltará ao fracasso
Altere a chave de criptografia do banco de dados para outra coisa e execute CHECKDB
- Novo certificado temporário – falha
- Restaurando o certificado desejado e alterando o DEK para esse certificado - sucesso
- Transferir de volta para o certificado temporário enquanto o certificado restaurado ainda está presente - sucesso
- Descartar certificado antigo/restaurado - falha
Gerar novamente a chave de criptografia do banco de dados - falha
Livre-se do novo certificado TdeCert padrão e execute novamente o script de transferência - ainda uma falha
Elimine a chave de criptografia do banco de dados e execute CHECKDB - sucesso
- Crie uma nova chave de criptografia de banco de dados com qualquer certificado - sucesso
Itens relacionados que não resolveram meu problema
- Esta questão demonstra algo bastante semelhante, mas não parece relevante porque estou em uma versão diferente, vários lançamentos após a correção descrita.
- Este artigo da Microsoft descreve um erro em que ocorreu "Não é possível localizar o certificado do servidor" ao especificar as opções COMPRESSION e MAXTRANSFERSIZE. O comando de backup que estou usando não especifica essas opções e o problema descrito foi resolvido em versões mais antigas.
- Existem muitas perguntas e artigos por aí sobre a mensagem "Não é possível encontrar o certificado do servidor" ao tentar uma restauração, nenhum dos quais parece relevante, pois não estou fazendo uma restauração.