Ga naar hoofdinhoud

Snowflake Time Travel gebruiken: een uitgebreide gids

Ontdek hoe je Snowflake Time Travel inzet om geschiedenis te bevragen, tabellen te klonen en data te herstellen met onze diepgaande gids voor databaseherstel.
· 9 min lezen

Verken met AI

Wat is Time Travel in Snowflake?

Net zoals software-engineers Git hebben voor versiebeheer, hebben data-engineers Time Travel in Snowflake-databases. Met de Time Travel-functie kunnen databasebeheerders historische data bevragen, oude tabellen klonen en objecten herstellen die in het verleden zijn verwijderd.

Aangezien databases enorm groot kunnen worden, is Time Travel echter geen één-op-één vervanging van versiebeheer voor code. Telkens wanneer een tabel wordt gewijzigd (verwijderd of bijgewerkt), maakt Snowflake een snapshot van de toestand van de data vóór de update. Deze snapshot blijft slechts een bepaald aantal dagen bestaan: de dataretentieperiode.

Voor Snowflake Standard-accounts is de maximale retentieperiode slechts één dag. Voor Enterprise-accounts kan de retentieperiode tussen 0 en 90 dagen liggen. Een retentieperiode van 0 schakelt Time Travel effectief uit; standaard is het voor alle tabellen ingeschakeld.

Snowflake Time Travel vs. Fail-Safe

Als je de Snowflake-documentatie leest, kom je mogelijk ook de term “Fail-safe” tegen. Op basis van de namen lijkt het misschien dat Time Travel en Fail-safe hetzelfde doen, maar dat is niet zo.

Wanneer een object zijn retentieperiode voltooit, wordt het verplaatst naar Snowflake Fail-safe. In Fail-safe kun je niet:

  • Historische data bevragen
  • Objecten uit het verleden klonen
  • Verwijderde objecten uit het verleden herstellen

Fail-safe bewaart de data alleen gedurende een niet-configureerbare periode van 7 dagen. In deze periode kan de data uitsluitend door Snowflake zelf worden hersteld. Deze functie is bedoeld als een dienst voor dataherstel en alleen als laatste redmiddel wanneer alle herstelmethoden falen. Het is uitsluitend bedoeld wanneer data is beschadigd of verwijderd door operationele fouten.

Je kunt Snowflake dus niet vragen om eerdere versies van je objecten te herstellen zodra ze hun vastgestelde retentieperiode op natuurlijke wijze hebben doorlopen. Houd deze regel in gedachten tijdens deze tutorial.

De omgeving instellen

Snowflake heeft twee interfaces om met het platform te werken: SnowSight (de web-UI) en Snowflake CLI (de terminalclient). We gaan verder met SnowSight omdat dit makkelijker in te stellen is. Je kunt deze uitgebreide tutorial lezen als je nieuw bent met Snowflake. Die behandelt ook hoe je Snowflake CLI gebruikt.

Maak eerst een gratis account aan via de Snowflake-homepage. Je krijgt 30 dagen gratis toegang tot Enterprise-functies.

Snowflake homepage

Zodra je account klaar is, kom je op de pagina Worksheets van je dashboard. Je kunt elke worksheet zien als een eigen omgeving om SQL of zelfs Python uit te voeren.

Snowflake-werkbladen

Maak nu een nieuw werkblad met de “+”-knop rechtsboven:

Databases en tabellen maken in Snowflake

Laten we vervolgens wat databases en tabellen aanmaken en ze met data vullen.

De database en tabellen maken

We maken eerst een database met de naam ecommerce_db. Plak de volgende code en druk op "Ctrl + Enter" (Cmd + Enter) om deze uit te voeren ("Ctrl + Shift + Enter" voert alle statements in het werkblad uit).

CREATE DATABASE IF NOT EXISTS ecommerce_db;

We gebruiken deze hypothetische database om AI-merchandise te verkopen. Voer onderstaande opdracht uit om deze als standaard in te stellen:

USE DATABASE ecommerce_db;

Eerst maken we een tabel met de naam inventory met drie kolommen:

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

Vervolgens voegen we wat startproducten toe:

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

We maken ook een tabel voor bestellingen:

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

Nadat we een website hebben opgezet om onze merchandise te verkopen, ontvangen we enkele bestellingen. In de ochtend krijgen we twee bestellingen voor beide producten:

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

In de middag krijgen we er nog een:

-- 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

Maar door een systeemfout wordt de bestelling geregistreerd voor meer voorraad dan we hebben. Laten we doen alsof we dit twee weken lang niet hebben ontdekt.

Let op dat ik onder water nog een paar andere updates aan tabellen heb gedaan.

Retentieperiode beheren

Onze eerste taak is het instellen van een retentieperiode. Mijn gratis proefperiode is afgelopen, dus ik kan deze maar op één dag instellen:

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

Als die van jou nog niet is afgelopen, probeer dan vier weken in te stellen, want je proefperiode loopt daarna af.

Gebruik van AT en BEFORE-clausules

Snowflake implementeert Time Travel via deze SQL-uitbreidingen:

  • AT- en BEFORE-clausules om te gebruiken in SELECT-statements om het exacte moment (of de periode) te bepalen waarop je wilt bevragen. Ze ondersteunen deze parameters om deze taak uit te voeren:
  • TIMESTAMP
  • OFFSET - tijdsverschil in seconden ten opzichte van het huidige moment
  • STATEMENT - unieke query-ID
  • UNDROP-opdracht om tabellen, schema’s en databases te herstellen

Laten we bekijken hoe je deze uitbreidingen gebruikt op onze voorbeeld-database.

Historische data bevragen

Laten we eerst bekijken wat er in inventory staat:

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

Historische data bevragen snowflake

Laten we nu de bestellingen en voorraad die we hebben combineren:

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;

Snowflake-voorbeeld: bestellingen en voorraad combineren

Oei! Het lijkt erop dat er een fout is — het aantal bestellingen voor de Llama-hoodie is groter dan we hebben. Laten we 17,5 uur teruggaan om het exacte moment te vinden waarop deze foutieve statement is uitgevoerd:

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

Snowflake time travel

Dus, de onjuiste bestelling is geplaatst om 16:54 uur op 6 maart. Dat betekent dat we de toestand van de tabel vóór dat tijdstip nodig hebben. Dat kun je eenvoudig bevragen met de BEFORE-clausule:

-- 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);

Vergeet niet om timestamp_tz als datatype voor de timestamp toe te voegen. tz staat voor tijdzone.

timestamp_tz als datatype toevoegen

Deze voorbeelden laten zien hoe je AT- en BEFORE-clausules met timestamps en offsets gebruikt. Als je niet zelf het tijdstip van queries wilt uitzoeken, kun je statement-ID’s gebruiken.

De onderstaande query voert bijvoorbeeld dezelfde taak uit als de vorige: de toestand van de tabel bevragen vóórdat de onjuiste bestelling is geplaatst:

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

Zo vind je de query-ID van een willekeurig statement:

Snowflake Query-ID vinden

Door te filteren op het type queries kun je in SnowSight veel sneller vinden wat je zoekt.

Historische objecten klonen

We hebben dus een onjuiste bestelling in onze tabel — hoe raken we die kwijt?

Eén ding dat we kunnen proberen, is de tabel klonen zonder de onjuiste rij:

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

SELECT * FROM orders_clone;

Historische objecten klonen

Dit werkte, en we hoefden niet op Time Travel te vertrouwen om het probleem op te lossen. Maar wanneer je eerdere toestanden van een tabel moet klonen, kun je deze syntax volgen:

-- 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

Databases klonen werkt vergelijkbaar:

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

Objecten verwijderen en herstellen

Stel, we hebben net een stagiair aangenomen en hem het probleem met de onjuiste bestelling gegeven.

Bij het proberen te verwijderen van dat record, verwijdert de stagiair per ongeluk de tabel orders in productie:

-- Simulate accidentally dropping the orders table
DROP TABLE orders

SELECT * FROM orders;;

Objecten verwijderen en herstellen

De stagiair komt overstuur naar ons toe en vertelt wat hij heeft gedaan. We voeren rustig de UNDROP-opdracht uit:

-- Recover the dropped table using UNDROP
UNDROP TABLE orders

SELECT * FROM orders;;

En we krijgen de tabel terug. We vergeven de stagiair en besluiten (natuurlijk) hem niet te ontslaan vanwege deze fout.

Conclusie

In deze tutorial hebben we een kernfunctie in Snowflake leren kennen: Time Travel. Met Time Travel kun je informatie uit het verleden bevragen en herstellen, een zeer gewilde functie in tools voor databasemanagement.

In productieomgevingen kan van alles gebeuren, en een back-up van je database vóór elke update geeft rust.

Ik vind Snowflake de beste tool voor databasemanagement die er is. Het is een omvangrijke tool en het beheersen ervan is een waardevolle vaardigheid in datarollen. Wil je er meer over leren, bekijk dan de cursus Introduction to Snowflake op DataCamp.

Als je al comfortabel bent met Snowflake en je skills wilt testen, bekijk dan de beste Snowflake-certificeringen die in 2024 beschikbaar zijn.

Bexruz (Bex) Tuychiev

Auteur

Bexruz (Bex) Tuychiev

Ik ben een contentmaker op het gebied van data science met meer dan 2 jaar ervaring en een van de grootste achterbannen op Medium. Ik schrijf graag uitgebreide artikelen over AI en ML met een vleugje sarcastische stijl, want je moet toch íets doen om ze wat minder saai te maken. Ik heb meer dan 130 artikelen en een DataCamp-cursus gemaakt, en er is nog een nieuwe in de maak. Mijn content is door meer dan 5 miljoen paar ogen gezien, van wie 20k volgers werden op zowel Medium als LinkedIn. 

Onderwerpen

Gerelateerd