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.
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.
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.
Maak nu een nieuw werkblad met de “+”-knop rechtsboven:
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).
Eerst maken we een tabel met de naam inventory met drie kolommen:
CREATEORREPLACETABLE inventory (
product_id INTPRIMARYKEY,
name VARCHAR(255),
stock_level INT,
last_updated TIMESTAMP_TZ DEFAULTCURRENT_TIMESTAMP);Mogelijk gemaakt door
Vervolgens voegen we wat startproducten toe:
INSERTINTO inventory (product_id, name, stock_level)VALUES(1, Llama hoodie', 10), (2, Falcon cap',20);Mogelijk gemaakt door
We maken ook een tabel voor bestellingen:
CREATEORREPLACETABLE orders (
order_id INTPRIMARYKEY,
product_id INTREFERENCES inventory(product_id),
quantity INT,
order_date TIMESTAMP_TZ DEFAULTCURRENT_TIMESTAMP);-- Assume some time passes after this table was createdMogelijk gemaakt door
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:
INSERTINTO orders (order_id, product_id, quantity)VALUES(1,1,5),(1,2,3);Mogelijk gemaakt door
In de middag krijgen we er nog een:
-- Simulate a system glitch causing an extra order for product 1INSERTINTO orders (order_id,(product_id, quantity)VALUES(3,1,100);-- This might cause negative stockMogelijk gemaakt door
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:
ALTERTABLE inventory SET DATA_RETENTION_TIME_IN_DAYS=1;ALTERTABLE orders SET DATA_RETENTION_TIME_IN_DAYS=1;Mogelijk gemaakt door
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;Mogelijk gemaakt door
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;Mogelijk gemaakt door
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:
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 timezoneALTERSESSIONSET TIMEZONE ='UTC';-- Select the table state before the errorSELECT*FROM orders BEFORE(TIMESTAMP=>'2024-03-06 04:54:00 -0800'::timestamp_tz);Mogelijk gemaakt door
Vergeet niet om timestamp_tz als datatype voor de timestamp toe te voegen. tz staat voor tijdzone.
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');Mogelijk gemaakt door
Zo vind je de query-ID van een willekeurig statement:
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:
CREATEORREPLACETABLE orders_clone ASSELECT*FROM orders WHERE quantity !=100;SELECT*FROM orders_clone;Mogelijk gemaakt door
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 agoCREATETABLE old_table_clone CLONE olt_table
AT(OFFSET=>-2*24*60*60);-- Offset for 2 daysMogelijk gemaakt door
Databases klonen werkt vergelijkbaar:
CREATEDATABASE cloned_db CLONE my_db
BEFORE(STATEMENT =>'8e5d0ca9-005e-44e6-b858-a8f5b37c5726');Mogelijk gemaakt door
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 tableDROPTABLE orders
SELECT*FROM orders;;Mogelijk gemaakt door
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;;Mogelijk gemaakt door
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.
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.
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:
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.
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.
Maak nu een nieuw werkblad met de “+”-knop rechtsboven:
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).We gebruiken deze hypothetische database om AI-merchandise te verkopen. Voer onderstaande opdracht uit om deze als standaard in te stellen:
Eerst maken we een tabel met de naam
inventorymet drie kolommen:Vervolgens voegen we wat startproducten toe:
We maken ook een tabel voor bestellingen:
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:
In de middag krijgen we er nog een:
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:
Als die van jou nog niet is afgelopen, probeer dan vier weken in te stellen, want je proefperiode loopt daarna af.
Gebruik van
ATenBEFORE-clausulesSnowflake implementeert Time Travel via deze SQL-uitbreidingen:
AT- enBEFORE-clausules om te gebruiken inSELECT-statements om het exacte moment (of de periode) te bepalen waarop je wilt bevragen. Ze ondersteunen deze parameters om deze taak uit te voeren:TIMESTAMPOFFSET- tijdsverschil in seconden ten opzichte van het huidige momentSTATEMENT- unieke query-IDUNDROP-opdracht om tabellen, schema’s en databases te herstellenLaten we bekijken hoe je deze uitbreidingen gebruikt op onze voorbeeld-database.
Historische data bevragen
Laten we eerst bekijken wat er in
inventorystaat:Laten we nu de bestellingen en voorraad die we hebben 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:
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:Vergeet niet om
timestamp_tzals datatype voor de timestamp toe te voegen.tzstaat voor tijdzone.Deze voorbeelden laten zien hoe je
AT- enBEFORE-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:
Zo vind je de query-ID van een willekeurig statement:
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:
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:
Databases klonen werkt vergelijkbaar:
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:
De stagiair komt overstuur naar ons toe en vertelt wat hij heeft gedaan. We voeren rustig de
UNDROP-opdracht uit: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.