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 / 340696
Accepted
ImperviousInclemency
ImperviousInclemency
Asked: 2024-07-03 22:04:29 +0800 CST2024-07-03 22:04:29 +0800 CST 2024-07-03 22:04:29 +0800 CST

Erros de backups/CHECKDB - "Não é possível encontrar o certificado do servidor"

  • 772

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_thumbprintcoluna. 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
  1. Ativar totalmente a criptografia (ALTER DATABASE SomeDatabase SET ENCRYPTION ON) - falha

  2. Basta trazer o certificado antigo de volta, não alterar nenhum banco de dados - sucesso

    1. Mas assim que o certificado antigo for descartado novamente, ele voltará ao fracasso
  3. Altere a chave de criptografia do banco de dados para outra coisa e execute CHECKDB

    1. Novo certificado temporário – falha
    2. Restaurando o certificado desejado e alterando o DEK para esse certificado - sucesso
    3. Transferir de volta para o certificado temporário enquanto o certificado restaurado ainda está presente - sucesso
    4. Descartar certificado antigo/restaurado - falha
  4. Gerar novamente a chave de criptografia do banco de dados - falha

  5. Livre-se do novo certificado TdeCert padrão e execute novamente o script de transferência - ainda uma falha

  6. Elimine a chave de criptografia do banco de dados e execute CHECKDB - sucesso

    1. 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.
sql-server
  • 1 1 respostas
  • 104 Views

1 respostas

  • Voted
  1. Best Answer
    Sean Gallardy
    2024-07-04T05:04:35+08:002024-07-04T05:04:35+08:00

    A forma como os certificados rotativos de proteção DEK funcionam e a forma como o TDE funciona exige que o certificado antigo esteja disponível por algum tempo após a alteração, a menos que você tenha planejado adequadamente o truncamento de log e os backups. Deixe-me explicar.

    O certificado que protege o DEK é carimbado na configuração do banco de dados, como tal ele sabe qual certificado o está protegendo no momento e assim pode tentar encontrá-lo no mestre da instância (ou no caso de um AG contido, também no mestre replicado). Quando um novo certificado é usado para proteger a DEK, a impressão digital do certificado antigo é movida para o ponto histórico de proteção do certificado e o novo substitui o ponto protetor atual na configuração do banco de dados, só há histórico para 2 protetores (você obterá um erro em certas situações se você tentar girar as chaves muito rapidamente).

    Quando a proteção do DEK é alterada, o VLF atual que possui um carimbo de informações semelhantes em seu cabeçalho, precisa terminar e assim o VLF é finalizado neste ponto com o protetor antigo. O próximo VLF é usado e é carimbado com o novo protetor.

    O motivo pelo qual você está recebendo erros ao executar CheckDB e Backups é porque os processos precisam voltar para VLFs que são protegidos pelos certificados antigos. Para corrigir isso, você precisará colocar os certificados antigos de volta e executar os backups de log/truncar os logs até que apenas o novo protetor seja usado. Em seguida, você pode remover o protetor antigo da instância - mas observe que ainda precisará dele para restaurar backups, etc. - quando tiver validado que o protetor antigo não é necessário usando a vlf_encryptor_thumbprintcoluna in sys.dm_db_log_infoe juntando-a ou procurando as impressões digitais no sys.certificatesmaster.

    • 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