Vai al contenuto principale

Usare Snowflake Time Travel: guida completa

Scopri come sfruttare Snowflake Time Travel per interrogare la cronologia, clonare tabelle e ripristinare i dati con la nostra guida approfondita al recovery del database.
· 9 min leggi

Scopri con l'IA

Che cos'è il Time Travel in Snowflake?

Così come gli ingegneri software usano Git per il controllo di versione, i data engineer hanno Time Travel nei database Snowflake. La funzione Time Travel permette agli amministratori del database di interrogare i dati storici, clonare vecchie tabelle e ripristinare oggetti eliminati in passato.

Tuttavia, dato che i database possono crescere fino a dimensioni enormi, Time Travel non è l'equivalente plug-and-play del controllo di versione del codice. Ogni volta che una tabella viene modificata (eliminata o aggiornata), Snowflake scatta un'istantanea dello stato dei dati prima dell'aggiornamento. Questa istantanea vive solo per un numero di giorni specificato, chiamato periodo di conservazione dei dati.

Per gli account Snowflake Standard, il periodo massimo di conservazione è di un solo giorno. Per gli account Enterprise, il periodo può andare da 0 a 90 giorni. Un periodo di conservazione pari a 0 disattiva di fatto Time Travel, che è abilitato per impostazione predefinita su tutte le tabelle.

Snowflake Time Travel vs. Fail-safe

Leggendo la documentazione di Snowflake, potresti imbatterti anche nel termine “Fail-safe”. Dai nomi potrebbe sembrare che le funzioni Time Travel e Fail-safe svolgano lo stesso compito, ma non è così.

Quando un oggetto termina il suo periodo di conservazione, viene quindi spostato nel Fail-safe di Snowflake. In Fail-safe non puoi:

  • Interrogare i dati storici
  • Clonare oggetti passati
  • Ripristinare oggetti passati che sono stati eliminati

Fail-safe conserva i dati solo per un periodo non configurabile di 7 giorni. Durante questo periodo, i dati possono essere recuperati solo da Snowflake stesso. Questa funzione è pensata come un servizio di recupero dati ed è destinata a essere usata solo come ultima risorsa quando tutti i metodi di ripristino falliscono. Va usata solo quando i dati sono stati danneggiati o eliminati a causa di errori operativi.

Quindi, non puoi chiedere a Snowflake di recuperare versioni passate dei tuoi oggetti una volta che hanno trascorso naturalmente il loro periodo di conservazione stabilito. Tieni a mente questa regola mentre segui questo tutorial.

Configurare l'ambiente

Snowflake ha due interfacce per interagire con la piattaforma: SnowSight (la web UI) e Snowflake CLI (il client da terminale). Andremo avanti con SnowSight perché è più semplice da configurare. Puoi leggere questo tutorial completo se sei alle prime armi con Snowflake. Copre anche come usare Snowflake CLI.

Per iniziare, registrati per un account gratuito dalla homepage di Snowflake. Potrai accedere alle funzionalità Enterprise per una prova gratuita di 30 giorni.

Homepage di Snowflake

Una volta che il tuo account è pronto, verrai indirizzato alla pagina Worksheets della tua dashboard. Puoi considerare ogni worksheet come un ambiente separato in cui eseguire SQL o anche Python.

Worksheet di Snowflake

Ora crea un nuovo worksheet usando il pulsante “+” in alto a destra:

Creazione di database e tabelle in Snowflake

Successivamente, creiamo alcuni database e tabelle e popoliamoli con dei dati.

Creare il database e le tabelle

Per prima cosa creeremo un database chiamato ecommerce_db. Incolla il codice seguente e premi "Ctrl + Invio" (Cmd + Invio) per eseguirlo ("Ctrl + Shift + Invio" esegue tutte le istruzioni del worksheet).

CREATE DATABASE IF NOT EXISTS ecommerce_db;

Useremo questo database ipotetico per vendere merchandising legato all'AI. Esegui il seguente comando per impostarlo come predefinito:

USE DATABASE ecommerce_db;

Per prima cosa, creeremo una tabella chiamata inventory con tre colonne:

CREATE OR REPLACE TABLE inventory (
 product_id INT PRIMARY KEY,
 name VARCHAR(255),
 stock_level INT,
 last_updated TIMESTAMP_TZ DEFAULT CURRENT_TIMESTAMP
);

Poi aggiungeremo alcuni prodotti iniziali:

INSERT INTO inventory (product_id, name, stock_level)
VALUES (1, Llama hoodie', 10), (2, Falcon cap', 20);

Creeremo anche una tabella per gli ordini:

CREATE OR REPLACE TABLE orders (
 order_id INT PRIMARY KEY,
 product_id INT REFERENCES inventory(product_id),
 quantity INT,
 order_date TIMESTAMP_TZ DEFAULT CURRENT_TIMESTAMP
);
-- Assume some time passes after this table was created

Dopo aver messo online un sito per vendere il nostro merchandise, riceviamo alcuni ordini. Al mattino riceviamo due ordini per entrambi i nostri prodotti:

INSERT INTO orders (order_id, product_id, quantity)
VALUES (1, 1, 5), (1, 2, 3);

Nel pomeriggio, ne arriva un altro:

-- Simulate a system glitch causing an extra order for product 1
INSERT INTO orders (order_id, (product_id, quantity)
VALUES  (3, 1, 100);  -- This might cause negative stock

Ma a causa di un glitch di sistema, l'ordine viene registrato per più stock di quello che abbiamo. Facciamo finta di non accorgercene per due settimane.

Nota che ho fatto qualche altro aggiornamento alle tabelle dietro le quinte.

Controllare il periodo di conservazione

Il nostro primo compito è impostare un periodo di conservazione. La mia prova gratuita è finita, quindi posso impostarlo solo per un giorno:

ALTER TABLE inventory SET DATA_RETENTION_TIME_IN_DAYS=1;
ALTER TABLE orders SET DATA_RETENTION_TIME_IN_DAYS=1;

Se la tua non è finita, prova a impostarlo su quattro settimane, dato che la prova scadrà dopo quel periodo.

Uso delle clausole AT e BEFORE

Snowflake implementa Time Travel tramite queste estensioni SQL:

  • Clausole AT e BEFORE da usare nelle istruzioni SELECT per individuare l'esatto punto (o periodo) nel tempo che vuoi interrogare. Supportano questi parametri per eseguire il compito:
  • TIMESTAMP
  • OFFSET - differenza temporale in secondi dal momento presente
  • STATEMENT - ID univoco della query
  • Comando UNDROP per ripristinare tabelle, schemi e database

Vediamo come usare queste estensioni sul nostro database di esempio.

Interrogare i dati storici

Per cominciare, vediamo cosa abbiamo in inventory:

-- Check current stock level (might show negative value)
SELECT * FROM inventory;

Query dei dati storici in Snowflake

Ora uniamo gli ordini e l'inventario che abbiamo:

SELECT i.name, i.stock_level, o.quantity as "order_amount"
 FROM inventory as i
 JOIN orders as o
   ON i.product_id = o.product_id;

Esempio Snowflake: combinare ordini e inventario

Ops! Sembra ci sia un errore: la quantità di ordini per la Llama hoodie è superiore a quella che abbiamo. Proviamo a tornare indietro di 17,5 ore per individuare il momento esatto in cui è stata eseguita l'istruzione errata:

SELECT * FROM orders AT(OFFSET => -60*60*17.5); -- Go back 17.5

Snowflake time travel

Quindi, l'ordine errato è stato inserito alle 16:54 del 6 marzo. Questo significa che ci serve lo stato della tabella prima di quell'ora. È facile interrogarlo con la clausola BEFORE:

-- Change the timezone
ALTER SESSION  SET TIMEZONE = 'UTC';

-- Select the table state before the error
SELECT * FROM orders BEFORE(TIMESTAMP => '2024-03-06 04:54:00 -0800'::timestamp_tz);

Non dimenticare di aggiungere timestamp_tz come tipo di dato per il timestamp. tz sta per fuso orario (time zone).

aggiungi timestamp_tz come tipo di dato

Questi esempi mostrano come usare le clausole AT e BEFORE con timestamp e offset. Se non vuoi dover calcolare l'orario delle query, puoi usare gli ID delle istruzioni.

Per esempio, la query qui sotto esegue lo stesso compito dell'ultima: interroga lo stato della tabella prima che fosse inserito l'ordine errato:

SELECT * FROM orders BEFORE(STATEMENT => '01b2ce86-0000-95e2-0000-000669127035');

Ecco come puoi trovare l'ID query di qualsiasi istruzione:

Snowflake: trovare l'ID della query

Filtrando il tipo di query, puoi trovare molto più velocemente quella che cerchi in SnowSight.

Clonare oggetti storici

Dunque, abbiamo un ordine errato nella nostra tabella: come ce ne sbarazziamo?

Una cosa che possiamo provare è clonare la tabella senza la riga errata:

CREATE OR REPLACE TABLE orders_clone AS
SELECT * FROM orders WHERE quantity != 100;

SELECT * FROM orders_clone;

Clonare oggetti storici

Ha funzionato e non abbiamo dovuto affidarci a Time Travel per risolvere il problema. Ma quando ti serve clonare stati passati di una tabella, ecco una sintassi che puoi seguire:

-- Clone an object as it existed 2 days ago
CREATE TABLE old_table_clone CLONE olt_table
   AT(OFFSET => -2 * 24 * 60 * 60);  -- Offset for 2 days

Clonare i database è simile:

CREATE DATABASE cloned_db CLONE my_db
 BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');

Eliminare e ripristinare oggetti

Diciamo che abbiamo appena assunto un/una stagista e gli/le abbiamo assegnato il problema dell'ordine errato.

Nel tentativo di rimuovere quel record, lo/la stagista elimina per sbaglio la tabella degli ordini in produzione:

-- Simulate accidentally dropping the orders table
DROP TABLE orders

SELECT * FROM orders;;

Eliminare e ripristinare oggetti

Lo/la stagista viene da noi, nel panico, e ci dice cosa ha fatto. Quindi, eseguiamo con calma il comando UNDROP:

-- Recover the dropped table using UNDROP
UNDROP TABLE orders

SELECT * FROM orders;;

E recuperiamo la tabella. Perdoniamo anche lo/la stagista e (ovviamente) decidiamo di non licenziarlo/la per l'errore.

Conclusione

In questo tutorial abbiamo visto una funzione chiave di Snowflake: Time Travel. Con Time Travel puoi interrogare e ripristinare informazioni passate, una funzionalità molto ricercata negli strumenti di gestione dei database.

In produzione può succedere di tutto e avere un backup del database prima di ogni aggiornamento trasmette tranquillità.

Penso che Snowflake sia il miglior strumento di gestione dei database in circolazione. È uno strumento enorme e padroneggiarlo è una competenza preziosa nei ruoli data. Quindi, se vuoi saperne di più, dai un'occhiata al corso Introduction to Snowflake su DataCamp.

Se invece ti senti già a tuo agio e vuoi mettere alla prova le tue competenze, dai un'occhiata alle migliori certificazioni Snowflake disponibili nel 2024.

Bexruz (Bex) Tuychiev

Autore

Bexruz (Bex) Tuychiev

Sono un creator di contenuti sulla data science con oltre 2 anni di esperienza e uno dei più seguiti su Medium. Mi piace scrivere articoli dettagliati su AI e ML con un pizzico di sarcasmo, perché bisogna pur fare qualcosa per renderli un po’ meno noiosi. Ho pubblicato oltre 130 articoli e un corso su DataCamp, con un altro in arrivo. I miei contenuti sono stati visti da oltre 5 milioni di persone, 20.000 delle quali sono diventate follower sia su Medium che su LinkedIn. 

Argomenti

Correlato