Insights / Blog

Deep Dive: Time Travel in Snowflake

time-travel-in-snowflake

Tra le caratteristiche uniche che contraddistinguono Snowflake dagli altri principali competitors sul mercato troviamo il Time Travel, ovvero la funzionalità che ci consente di accedere ai dati storici che sono stati cancellati o aggiornati in qualsiasi momento entro un periodo definito di tempo.

A tutti sarà infatti capitato di cancellare file, cartelle o informazioni importanti in modo involontario. Dopo ogni errore di questo tipo, avremo sviluppato nel migliore dei casi un’attenzione particolare al fine di evitare di cancellare qualcosa inintenzionalmente.

Con il Time Travel in Snowflake possiamo tranquillizzarci in quanto, grazie alla sua architettura, ci permette di recuperare gli oggetti (database, schemas, tabelle) che abbiano cancellato per sbaglio (tramite la funzione DROP).

In particolare, comprendiamo la potenzialità di questa caratteristica nel momento in cui ad esempio stiamo effettuando un bug fix e siamo collegati al database di produzione e abbiamo eseguito un update statement su una tabella che contiene milioni di records. Successivamente procediamo ad operazioni di cancellazione o aggiornamento ma ci rendiamo improvvisamente conto che abbiamo dimenticato di applicare le clausule di WHERE nella nostra query SQL.

Niente panico! In questi casi Snowflake ci permette di tornare indietro nel tempo a quel particolare periodo di tempo e recuperare i dati così come erano prima che eseguissi il primo comando di update / delete sbagliato.

Come ci riesce?

Data Storage immutabile

Analizziamo inizialmente come vengono memorizzati i dati: in Snowflake tutti i dati sono memorizzati in micro-partizioni, unità contigue di memoria che sono immutabili. Significa che una volta che una micropartizione è scritta, non sarà mai cambiata.

Questo concetto è alla base della funzionalità del Time Travel in Snowflake. Immaginiamo ad esempio che io sia interessata ad estrarre l’elenco dei prodotti (es. tramite il product ID) realizzati dalla mia azienda tramite una query SQL e che in realtà alcuni di questi prodotti non vengano più prodotti in seguito ad una certa data. Se utilizzo sempre la stessa query otterrò un dataset contenente meno righe, in quanto non sono più presenti nella nostra tabella. Allo stesso tempo, però, la funzione del Time Travel in Snowflake è in grado di preservare lo stato di queste righe nelle loro micro-partizioni originali, e siamo pertanto in grado di recuperare queste informazioni.

La funzione Time Travel ci aiuta anche nel momento in cui eliminiamo accidentalmente un oggetto su Snowflake, come ad esempio un database.

Comando Time Travel

Snowflake ci mette a disposizione diversi comandi tramite i quali possiamo viaggiare indietro nel tempo. Vediamoli qui di seguito:

AT | BEFORE

Le clausule AT o BEFORE possono essere utilizzate con i comandi SELECT o CLONE.

La clausola utilizza uno dei seguenti parametri per individuare esattamente i dati storici a cui si desidera accedere:

Offset: OFFSET=>time_difference

Esempio: 
SELECT * FROM yourtable AT (OFFSET=> -60*5) ;
//Questa query mostrerà tutto il contenuto della tua tabella nei 5 minuti precedenti.
//-60 è 60 secondi, -60*5 è 5 minuti.

Timestamp: TIMESTAMP=>timestamp

SELECT * FROM yourtable AT (TIMESTAMP => '2021-05-13 10:30:34.068'::timestamp)
//Questa query sta usando un parametro data-ora per viaggiare indietro nel tempo

Statement: STATEMENT=>id Dove ID è il numero della query verso cui si vuole andare indietro nel tempo.

Se stai usando Tableau c’è un modo per controllare le impostazioni di Time-Travel tramite dei comandi custom-SQL, come questo:

SELECT *
FROM "yourdatabase"."yourschema"."yourtable"
AT (OFFSET=> -60*<Parameters.Timetravel Minutes>)

Il Parametro può essere creato rapidamente attraverso la stessa finestra custom SQL nella dashboard.

UNDROP

Immaginiamo ad esempio di aver creato un database chiamato demo_DB_Italy e di averlo accidentalmente eliminato.

Semplicemente con il comando UNDROP possiamo ripristinarlo:

La funzione UNDROP è disponibile per un periodo tempo variabile che è legato al Retention Period.

Questo periodo dipende dalla versione di Snowflake che stai utilizzando e inoltre dal numero di giorni settati nel parametro temporale nel tuo account.

1.Versione di Snowflake

Come consultabile a questo link, ci sono quattro versioni di Snowflake disponibili: Standard, Enterprise, Business Critical e Virtual Private Snowflake (VPS).

La versione Stardard prevede un giorno di Time Travel, mentre nella versione Enterprise (e superiori) si possono selezionare fino a 90 giorni.

2. Parametro temporale

Il parametro temporale si può settare a livello di account, ma anche di database o di singola tabella.

Il parametro dell’account si può modificare tramite il comando seguente (nell’esempio è impostato a 1 giorno:

Nel caso in cui non volessi impostarlo a livello globale come appena fatto, possiamo impostarlo a 30 giorni, questa volta a livello di database:

Una volta che il Retention Period è esaurito, i dati verranno spostati su Fail-Safe.

Fail-Safe fornisce un periodo (non configurabile) di 7 giorni durante il quale i dati storici sono recuperabili solamente dal team di supporto Snowflake. Agli utenti saranno inoltre addebitati i costi per lo storage e per i giorni complessivi in cui i database e le tabelle si trovano in Fail-Safe.

Per ulteriori domande su Snowflake e la funzionalità del Time Travel vi invitamo a contattarci all’indirizzo: info@theinformationlab.it

Speriamo che questo articolo vi abbia incuriosito e che continuiate a seguire il nostro blog.

Vi diamo appuntamento alla settimana prossima per approfondire ulteriormente le differenze tra Time Travel e Fail Safe!

Alla prossima! ❄️

Blog
data driven business

Data-driven business: perché il dato è cruciale per l’azienda?

Il data-driven business è un percorso a cui ormai nessuna impresa può sottrarsi. Contare su...

Blog
creare grafici interattivi

Creare grafici interattivi: Come si fa e principali vantaggi

Nel mondo digitale odierno, la visualizzazione dei dati è fondamentale per comunicare informazioni complesse in...