Domanda

In un cluster Oracle (più di una macchina che coopera per servire un database) sarà il "sysdate" la funzione restituisce sempre una risposta coerente? Anche se l'orologio del sistema operativo dei server riporta valori incoerenti?

È stato utile?

Soluzione

Sospetto fortemente che SYSDATE sia anche collegato al sistema operativo. Sii molto attento al motivo per cui devi usarlo. Se hai una logica che implementa il monitoraggio incrementale degli eventi (ad es. Stai effettuando esportazioni incrementali) e devi assicurarti che non vi siano elementi esclusi o duplicati, basare il monitoraggio su ID sequenziali anziché su SYSDATE.

In realtà, questo vale anche per i sistemi non cluster, poiché SYSDATE può talvolta cambiare (risparmi di tempo, errori sysadmin ...).

Altri suggerimenti

SYSDATE è relativo al sistema operativo del nodo; se è stato garantito correttamente in tutto il cluster, i nodi dovrebbero sincronizzarsi ogni volta che si chiama SYSDATE. In un ambiente cluster, le sequenze ordinate sono costose; meglio evitare se possibile. Una sequenza ordinata ti garantirà unicità e ordine; tuttavia, potresti comunque ottenere delle lacune se l'elaborazione non riesce dopo aver selezionato dalla sequenza e prima di eseguire la transazione.

Usiamo alcune soluzioni alternative:

  1. In genere, le sequenze sono impostate su non ordinato con cache di grandi dimensioni (25.000) per ridurre l'inter cluster comunicazione.
  2. Utilizza NTP per la sincronizzazione temporale i nodi (possono ancora essere errato, + / - nanosecondi, quindi tu non posso fare affidamento su questo)
  3. Per i log degli stili di controllo, utilizziamo systimestamp (timestamp (6)) come unico identificatore - e convivere con il fatto che è possibile (sebbene estremamente improbabile) che i registri potrebbe apparire fuori servizio (questo è possibile anche con normale elaborazione, a seconda di quando Si verificano commit)
  4. Dove un ordine è richiesta la sequenza e non è possibile be gap - usa una sequenza ordinata (cerca di evitare in un cluster ambiente come " cache " non aiuta)

  5. Dove si trova una sequenza ordinata richiesto - ma non ci possono essere spazi vuoti - abbiamo una nostra tabella sequenze, blocca il record, ottieni il numero e quindi mantenere il record bloccato fino al l'utente si impegna; questo causerà tutti gli altri cercano di ottenere lo stesso sequenza di attesa fino a quando l'utente la transazione è completamente impegnata - evitare di farlo se possibile.

Usa NTP per sincronizzare l'ora su tutti i tuoi server (Oracle e non) e assicurati che ciò non accada. Gli orologi di sistema incoerenti sono una ricetta per il disastro.

Vorrei supporre che sysdate restituisse risultati incoerenti nello scenario che descrivi.

Ho trascorso un po 'di tempo a cercare una risposta a questo, ma non sono riuscito a trovarne uno, ma, dato che sysdate sta semplicemente restituendo la data / ora dal sistema operativo, sospetto che Dmitriy sia corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top