Temos PCs com SQL Server (2008 SP4 e 2016 SP1) que perdem energia regularmente. Obviamente, isso às vezes leva à corrupção (índice) do banco de dados SQL Server, que precisamos restaurar posteriormente.
Estou ciente de que o SQL Server não foi projetado para esses cenários e a solução correta é corrigir a causa da perda de energia (mais sobre isso abaixo, se você estiver curioso). No entanto, existem opções de ajuste no SQL Server que eu possa definir para reduzir o risco de corrupção do banco de dados na perda de energia ?
Background: O "PC" é um tablet Windows montado em uma empilhadeira. Quando o usuário desliga a empilhadeira, o tablet fica sem energia. Tentamos ensinar os usuários a desligar corretamente o Windows antes de desligar a empilhadeira, mas falhamos (provavelmente porque apenas desligá-lo "funciona" na maioria das vezes). No momento, também estamos investigando outras opções, como adicionar um no-break que avisa o tablet para desligar em caso de perda de energia.
Na verdade, ele foi projetado para lidar com perda de energia, é por isso que existem coisas como registro antecipado de gravação (WAL) e recuperação de falhas na inicialização (ou como você quiser chamá-lo). Uma das maneiras de fazer isso é optar por não armazenar em cache as gravações, o que parece ser o que o tablet está fazendo, daí a corrupção.
Não, o SQL Server está fazendo o que deveria. Você deve procurar fora do SQL Server (configurações do Windows para armazenamento em cache da unidade [que o SQL deseja desativar, mas não podemos forçá-lo], atualizações de hardware/firmware etc.) barato que poderia resolver os sintomas (o problema real é provavelmente algum tipo de cache ou gravação com bateria que não é realmente apoiada).
Se o tablet tiver uma bateria funcionando , você poderá configurar o Windows para desligar quando a bateria estiver fraca .
Se o tablet tiver uma bateria que não funciona , considere substituir a bateria. (Eu tive laptops assim - você ficaria surpreso com o quão baratas as baterias de reposição podem ser no eBay. Elas não funcionam tão bem quanto OEM, mas ei, qualquer coisa é melhor do que nada nesta situação.)
Se o tablet não tiver recursos de bateria , considere adicionar uma pequena fonte de alimentação ininterrupta (UPS) com saídas USB que possam se comunicar com o Windows para informá-lo quando estiver funcionando com energia da bateria. (Por exemplo, eu tenho minha própria área de trabalho configurada para desligar quando o UPS estiver com pouca bateria - dessa forma, ele desligará na falta de energia mesmo se eu não estiver em casa.)
Se nenhuma dessas opções for uma opção, você está meio sem sorte. É um white paper antigo, mas o SQL Server 2000 I/O Basics da Microsoft explica basicamente que você precisa de um subsistema de I/O que possa lidar com interrupções de energia normalmente.
Existem opções que você pode usar para aumentar o risco - como Durabilidade Atrasada ou tabelas somente de memória (não duráveis) - mas, por padrão, o SQL Server já está fazendo o possível para maximizar a confiabilidade a cada gravação no log de transações. Se mesmo as gravações do log de transações não puderem ser garantidas devido a quedas de energia aleatórias, gaste os US$ 100 em uma bateria de UPS.
Supondo que você tenha um banco de dados local na empilhadeira em vez de um servidor por causa de conexões sem fio irregulares? Obviamente, tirar o SQL da empilhadeira seria a solução preferível.
De qualquer forma, como Brent sugeriu, configure o tablet para desligar sozinho após x minutos com a bateria ou algum critério semelhante.
Caso contrário, um pequeno UPS que pode iniciar um desligamento normal provavelmente será sua melhor aposta nesse caso. Confiar nos usuários para coisas assim é pedir para falhar.
O sistema operacional subjacente deve garantir uma gravação bem-sucedida ou um erro é retornado. O sistema operacional, por sua vez, depende de drivers que, por sua vez, dependem de firmware que depende do hardware. Se os drivers, firmware ou hardware estiverem, não há nada que o Windows ou o SQL Server possam fazer sobre isso.
É por isso que você precisa verificar com o fabricante do driver/firmware/hardware.
Além disso, a ordem de gravação deve ser garantida em todas as camadas, para que isso também precise ser verificado.
Mesmo os caches com bateria podem falhar, por exemplo, durante as tempestades de Nova York, alguns data centers não estavam acessíveis por dias e as baterias teriam se esgotado, potencialmente perdendo gravações comutadas
https://www.postgresql.org/docs/devel/static/wal-reliability.html
https://brad.livejournal.com/2116715.html
http://rhaas.blogspot.com/2010/10/wal-reliability.html?m=1
Para expandir as outras respostas:
Primeiro, tente tirar o SQL da empilhadeira, se possível. Pense que a recuperação de uma perda de energia é ruim, tente fazê-lo depois que o laptop foi atropelado por mais de 7.000 libras. Com horas de atividade de depósito, sem backup...
Segundo, um mecanismo para o laptop fazer um desligamento automático após x tempo na bateria deve estar em vigor de qualquer maneira.
Terceiro, conectar o laptop a uma alimentação de energia não comutada na empilhadeira seria uma opção? Certifique-se de considerar os regulamentos de segurança (o ambiente pode exigir tudo desligado com a chave da empilhadeira) e quanto tempo a empilhadeira fica entre os usos (especialmente nos finais de semana e feriados) para evitar drenar a bateria da máquina.