Ana içeriğe geç

Snowflake Time Travel Kullanımı: Kapsamlı Bir Rehber

Veritabanı kurtarma üzerine derinlemesine rehberimizle, geçmişi sorgulamak, tabloları klonlamak ve verileri geri yüklemek için Snowflake Time Travel'ı nasıl kullanacağınızı keşfedin.
· 9 dk. oku

Yapay Zeka ile Keşfedin

Snowflake’te Time Travel nedir?

Nasıl ki yazılım mühendisleri sürüm kontrol için Git kullanıyorsa, veri mühendislerinin de Snowflake veritabanlarında Time Travel’ı var. Time Travel özelliği, veritabanı yöneticilerinin geçmiş verileri sorgulamasına, eski tabloları klonlamasına ve geçmişte silinen nesneleri geri yüklemesine olanak tanır.

Ancak veritabanlarının çok büyük boyutlara ulaşabildiği göz önüne alındığında, Time Travel kod sürüm kontrolünün birebir karşılığı değildir. Bir tablo her değiştirildiğinde (silindiğinde veya güncellendiğinde) Snowflake, güncelleme öncesindeki veri durumunun bir anlık görüntüsünü alır. Bu anlık görüntü yalnızca belirli gün sayısı boyunca saklanır; buna veri saklama süresi denir.

Snowflake Standard hesapları için azami saklama süresi yalnızca bir gündür. Enterprise hesapları için saklama süresi 0 ile 90 gün arasında olabilir. Saklama süresinin 0 olması Time Travel’ı fiilen devre dışı bırakır; Time Travel tüm tablolar için varsayılan olarak etkindir.

Snowflake Time Travel ve Fail-Safe

Snowflake dokümantasyonunu okurken “Fail-safe” terimiyle de karşılaşabilirsiniz. İsimlerine bakınca Time Travel ve Fail-safe özellikleri aynı işi yapıyormuş gibi görünebilir, ancak öyle değildir.

Bir nesne saklama süresini tamamladığında Snowflake Fail-safe’e taşınır. Fail-safe’te şunları yapamazsınız:

  • Geçmiş verileri sorgulamak
  • Geçmiş nesneleri klonlamak
  • Silinmiş geçmiş nesneleri geri yüklemek

Fail-safe verileri yapılandırılamayan 7 günlük bir süre boyunca saklar. Bu süre içinde veriler yalnızca Snowflake tarafından kurtarılabilir. Bu özellik bir veri kurtarma hizmeti olarak sunulur ve yalnızca tüm kurtarma yöntemleri başarısız olduğunda son çare olarak kullanılmak üzere tasarlanmıştır. Operasyonel hatalar nedeniyle veriler hasar görmüş veya silinmişse kullanılmalıdır.

Dolayısıyla, nesneleriniz belirlenen saklama süresini doğal olarak doldurduktan sonra Snowflake’ten geçmiş sürümleri kurtarmasını isteyemezsiniz. Bu öğreticiyi takip ederken bu kuralı aklınızda bulundurun.

Ortamı Hazırlama

Snowflake’in platformla etkileşim kurmak için iki arayüzü vardır: SnowSight (web arayüzü) ve Snowflake CLI (terminal istemcisi). Kurulumu daha kolay olduğu için SnowSight ile devam edeceğiz. Snowflake’e yeniyseniz, bu kapsamlı öğreticiyi okuyabilirsiniz. Snowflake CLI kullanımını da kapsar.

Önce, Snowflake ana sayfasından ücretsiz bir hesap açın. 30 günlük ücretsiz deneme süresince Enterprise özelliklerine erişebileceksiniz.

Snowflake ana sayfası

Hesabınız hazır olduğunda, panonuzdaki Worksheets sayfasına yönlendirileceksiniz. Her çalışma sayfasını SQL hatta Python çalıştırabileceğiniz ayrı bir ortam gibi düşünebilirsiniz.

Snowflake çalışma sayfaları

Şimdi sağ üstteki “+” düğmesini kullanarak yeni bir çalışma sayfası oluşturun:

Snowflake’te veritabanı ve tablolar oluşturma

Şimdi bazı veritabanları ve tablolar oluşturalım ve veriyle dolduralım.

Veritabanı ve Tabloları Oluşturma

Önce, ecommerce_db adlı bir veritabanı oluşturacağız. Aşağıdaki kodu yapıştırın ve çalıştırmak için "Ctrl + Enter" (Cmd + Enter) tuşlarına basın ("Ctrl + Shift + Enter" tüm çalışma sayfasını çalıştırır).

CREATE DATABASE IF NOT EXISTS ecommerce_db;

Bu varsayımsal veritabanını yapay zekâ temalı ürünler satmak için kullanacağız. Varsayılan olarak ayarlamak için aşağıdaki komutu çalıştırın:

USE DATABASE ecommerce_db;

Önce, üç sütunlu inventory adlı bir tablo oluşturacağız:

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

Ardından, bazı başlangıç ürünlerini ekleyeceğiz:

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

Ayrıca siparişler için bir tablo da oluşturacağız:

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

Ürünlerimizi satmak için bir web sitesi açtıktan sonra bazı siparişler aldık. Sabah, her iki ürünümüz için de iki sipariş alıyoruz:

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

Öğleden sonra bir tane daha alıyoruz:

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

Ancak bir sistem hatası nedeniyle, sipariş elimizde olandan daha fazla stok için kaydediliyor. Bunu iki hafta boyunca fark etmediğimizi varsayalım.

Arka planda tablolarda birkaç başka güncelleme yaptığımı unutmayın.

Saklama Süresini Kontrol Etme

İlk görevimiz bir saklama süresi ayarlamak. Benim ücretsiz denemem bittiği için yalnızca bir gün olarak ayarlayabiliyorum:

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

Sizinki bitmediyse, dört hafta olarak ayarlamayı deneyin; denemeniz o süre sonunda sona erecektir.

AT ve BEFORE Koşullarını Kullanma

Snowflake, Time Travel’ı şu SQL uzantılarıyla uygular:

  • Hangi anı (veya dönemi) sorgulamak istediğinizi tam olarak belirtmek için SELECT ifadelerinde kullanılan AT ve BEFORE koşulları. Bu işi yapmak için şu parametreleri destekler:
  • TIMESTAMP
  • OFFSET - şimdiki zamandan saniye cinsinden fark
  • STATEMENT - benzersiz sorgu kimliği
  • Tabloları, şemaları ve veritabanlarını geri yüklemek için UNDROP komutu

Bu uzantıları örnek veritabanımızda nasıl kullanacağımıza bakalım.

Geçmiş verileri sorgulama

Önce, inventory tablosunda neler olduğuna bakalım:

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

Snowflake'te geçmiş verileri sorgulama

Şimdi elimizdeki siparişler ve envanteri birleştirelim:

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 örneği sipariş ve envanteri birleştirme

Eyvah! Bir hata var gibi görünüyor — Llama hoodie siparişlerinin miktarı elimizde olandan fazla. Bu hatalı ifadenin çalıştığı tam anı bulmak için 17,5 saat geriye gitmeyi deneyelim:

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

Snowflake time travel

Demek ki hatalı sipariş 6 Mart’ta saat 16:54’te verilmiş. Bu da o zamandan önceki tablo durumuna ihtiyacımız olduğu anlamına geliyor. Bunu BEFORE koşuluyla kolayca sorgulayabiliriz:

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

Zaman damgası için veri türü olarak timestamp_tz eklemeyi unutmayın. tz saat dilimini ifade eder.

timestamp_tz veri türü olarak ekleme

Bu örnekler, zaman damgaları ve ofsetlerle AT ve BEFORE koşullarının nasıl kullanılacağını gösterir. Sorguların zamanlamasını çıkarmakla uğraşmak istemiyorsanız, ifade kimliklerini kullanabilirsiniz.

Örneğin, aşağıdaki sorgu son örnekle aynı işi yapar — hatalı sipariş verilmeden önceki tablo durumunu sorgular:

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

Herhangi bir ifadenin sorgu kimliğini şu şekilde bulabilirsiniz:

Snowflake Sorgu Kimliği Bulma

Sorgu türünü filtreleyerek aradığınız ifadeyi SnowSight’ta çok daha hızlı bulabilirsiniz.

Geçmiş nesneleri klonlama

Tablomuzda hatalı bir sipariş var — peki bunu nasıl temizleyeceğiz?

Deneyebileceğimiz bir yöntem, hatalı satır olmadan tabloyu klonlamak:

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

SELECT * FROM orders_clone;

Geçmiş nesneleri klonlama

İşe yaradı ve sorunu düzeltmek için Time Travel’a güvenmemiz gerekmedi. Ancak bir tablonun geçmiş durumlarını klonlamanız gerektiğinde, şu söz dizimini izleyebilirsiniz:

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

Veritabanlarını klonlamak da benzerdir:

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

Nesneleri Silme ve Geri Yükleme

Diyelim ki yeni bir stajyer aldık ve onlara hatalı siparişle ilgili sorunu verdik.

O kaydı kaldırmaya çalışırken, stajyer yanlışlıkla üretimdeki orders tablosunu siliyor:

-- Simulate accidentally dropping the orders table
DROP TABLE orders

SELECT * FROM orders;;

Nesneleri silme ve geri yükleme

Stajyer panik içinde yanımıza gelip ne yaptığını anlatıyor. Biz de sakince UNDROP komutunu çalıştırıyoruz:

-- Recover the dropped table using UNDROP
UNDROP TABLE orders

SELECT * FROM orders;;

Ve tabloyu geri alıyoruz. Ayrıca stajyeni affediyor ve (elbette) bu hatası nedeniyle işten çıkarmamaya karar veriyoruz.

Sonuç

Bu öğreticide Snowflake’in kilit bir özelliğini — Time Travel’ı — öğrendik. Time Travel sayesinde geçmiş bilgileri sorgulayabilir ve geri yükleyebilirsiniz; bu, veritabanı yönetim araçlarında oldukça aranan bir özelliktir.

Üretim ortamlarında her şey olabilir ve her güncelleme öncesinde veritabanınızın bir yedeğinin olması size huzur verir.

Bence Snowflake, mevcut en iyi veritabanı yönetim aracıdır. Kapsamı çok geniştir ve ona hâkim olmak veri rollerinde aranan bir yetenektir. Daha fazlasını öğrenmek isterseniz DataCamp’teki Introduction to Snowflake kursuna göz atın.

Zaten rahatsanız ve becerilerinizi sınamak istiyorsanız, 2024’te mevcut olan en iyi Snowflake sertifikalarına bakın.

Bexruz (Bex) Tuychiev

Yazar

Bexruz (Bex) Tuychiev

2 yılı aşkın deneyime sahip bir veri bilimi içerik üreticisiyim ve Medium’da en büyük takipçi kitlelerinden birine sahibim. Yapay zekâ ve makine öğrenimi üzerine, biraz da alaycı bir üslupla yazılmış, ayrıntılı makaleler kaleme almayı seviyorum; çünkü onları biraz daha az sıkıcı hale getirmek için bir şeyler yapmak gerekiyor. 130’un üzerinde makale ve bir de DataCamp kursu ürettim; bir diğeri de hazırlık aşamasında. İçeriklerim 5 milyondan fazla kişi tarafından görüldü; bunların 20 bini Medium ve LinkedIn’de takipçim oldu. 

Konular

İlgili