Normalmente, não é o servidor de banco de dados que é vulnerável a erros quando ocorre um salto instantâneo: são os aplicativos que usam o tempo que estão.
Geralmente, existem duas maneiras de acompanhar o tempo: rastreamento de tempo próprio ou comparação do tempo do sistema. Ambos têm algumas compensações positivas e negativas.
Acompanhamento de tempo próprio
Eu vejo isso usado em alguns sistemas e programação incorporados, onde o tempo exato não é tão crítico. Em um loop de aplicativo principal, uma maneira de rastrear um 'tick' é resolvida. Isso pode ser um alarme dado pelo kernel, sleep ou select, que dá uma indicação da quantidade de tempo passada. Quando você sabe que horas são passadas, você sabe que pode adicionar ou subtrair esse tempo a um contador. Este contador é o que faz a sua aplicação de sincronismo acontecer. Por exemplo, se o contador for maior que 10 segundos, você pode descartar algo ou precisa fazer algo.
Se o aplicativo não acompanhar o tempo, o contador não será alterado. Isso pode ser desejado dependendo do design do seu aplicativo. Por exemplo, controlar o tempo de duração de um processo de execução demorada é mais fácil com um contador do que com uma lista de timestamps de início / parada.
Pro:
- Não depende do relógio do sistema
- não vai quebrar em um grande momento skew
- Nenhuma chamada de sistema dispendiosa
- Contadores pequenos custarão menos memória do que um registro de data e hora completo
Con:
- O tempo não é muito preciso
- A alteração na hora do sistema pode tornar ainda mais imprecisa
- O tempo é relativo à execução do aplicativo, não persiste
Comparando a hora do sistema
Esse é o sistema usado com mais frequência: armazene um registro de data e hora e compare-o com o registro de data e hora usando uma chamada de hora do sistema. Enormes distorções no tempo do sistema podem ameaçar a integridade do seu aplicativo, uma tarefa de alguns segundos pode levar horas ou terminar imediatamente, dependendo da direção do relógio.
Pro:
- Comparação de tempo exata
- Persiste sobre reinicializações e longas indisponibilidades
Con:
- Faz uma chamada do sistema para obter um novo timestamp para comparar com outros timestamps
- O aplicativo precisa estar ciente de distorções ou pode quebrar
Sistemas afetados
A maioria dos aplicativos usará o registro de data e hora em comparação às tarefas de agendamento. Para sistemas de banco de dados que podem ser limpezas de cache.
Todos os aplicativos que usam um banco de dados e funções de tempo de chamada no idioma da consulta serão afetados por distorções se o aplicativo não detectar e manipular adequadamente. Os aplicativos nunca poderiam parar de funcionar ou permitir períodos de login indefinidos, dependendo de sua finalidade.
Os sistemas de e-mail usarão registros de data e hora e / ou tempos limite para tratar de mensagens antigas ou não entregues. Uma distorção de relógio poderia afetar isso, mas com um impacto muito menor. Temporizadores de desligamento relacionados à reconexão a servidores podem ser perdidos, resultando em penalidades no servidor de conexão.
Eu não acho (não pesquisei) que os alarmes do kernel irão disparar ao mudar a hora do sistema. Sistemas que usam estes podem ser seguros.
Soluções
Gentilmente mova o tempo. Isso pode ser encontrado na documentação de sua solução de tempo favorita.