Sử dụng Snowflake Time Travel: Hướng dẫn toàn diện
Khám phá cách tận dụng Snowflake Time Travel để truy vấn lịch sử, nhân bản bảng và khôi phục dữ liệu với hướng dẫn chuyên sâu về khôi phục cơ sở dữ liệu.
Cũng như kỹ sư phần mềm có Git để quản lý phiên bản, kỹ sư dữ liệu có Time Travel trong cơ sở dữ liệu Snowflake. Tính năng Time Travel cho phép quản trị viên cơ sở dữ liệu truy vấn dữ liệu lịch sử, nhân bản các bảng cũ và khôi phục các đối tượng đã xóa trước đó.
Tuy nhiên, do kích thước cơ sở dữ liệu có thể phình to, Time Travel không phải là bản thay thế trực tiếp cho quản lý phiên bản mã. Mỗi lần một bảng bị sửa đổi (xóa hoặc cập nhật), Snowflake sẽ chụp nhanh trạng thái dữ liệu trước khi cập nhật. Ảnh chụp nhanh này chỉ tồn tại trong một số ngày nhất định, gọi là thời gian lưu giữ dữ liệu.
Đối với tài khoản Snowflake Standard, thời gian lưu giữ tối đa chỉ là một ngày. Với tài khoản Enterprise, khoảng thời gian này có thể từ 0 đến 90 ngày. Thời gian lưu giữ bằng 0 đồng nghĩa vô hiệu hóa Time Travel, vốn được bật mặc định cho mọi bảng.
Snowflake Time Travel so với Fail-Safe
Khi đọc tài liệu Snowflake, bạn có thể gặp thuật ngữ “Fail-safe”. Nghe tên thì có vẻ Time Travel và Fail-safe làm cùng một việc, nhưng thực ra không phải vậy.
Khi một đối tượng kết thúc thời gian lưu giữ, nó sẽ được chuyển vào Snowflake Fail-safe. Trong Fail-safe, bạn không thể:
Truy vấn dữ liệu lịch sử
Nhân bản các đối tượng trong quá khứ
Khôi phục các đối tượng trong quá khứ đã bị xóa
Fail-safe chỉ giữ dữ liệu trong 7 ngày và không thể cấu hình. Trong thời gian này, dữ liệu chỉ có thể được Snowflake tự phục hồi. Tính năng này đóng vai trò dịch vụ khôi phục dữ liệu và chỉ dùng như biện pháp cuối cùng khi mọi phương án khôi phục khác đều thất bại. Nó chỉ dùng khi dữ liệu bị hỏng hoặc bị xóa do lỗi vận hành.
Vì vậy, bạn không thể yêu cầu Snowflake khôi phục các phiên bản cũ của đối tượng sau khi chúng đã tự nhiên hết thời gian lưu giữ. Hãy ghi nhớ quy tắc này khi theo dõi hướng dẫn.
Thiết lập môi trường
Snowflake có hai giao diện để tương tác với nền tảng: SnowSight (giao diện web) và Snowflake CLI (trình khách dòng lệnh). Chúng ta sẽ dùng SnowSight vì thiết lập dễ hơn. Bạn có thể đọc hướng dẫn toàn diện này nếu mới làm quen với Snowflake. Bài viết cũng hướng dẫn cách dùng Snowflake CLI.
Đầu tiên, đăng ký tài khoản miễn phí từ trang chủ Snowflake. Bạn sẽ được truy cập các tính năng Enterprise trong 30 ngày dùng thử.
Khi tài khoản sẵn sàng, bạn sẽ được chuyển đến trang Worksheets trên bảng điều khiển. Bạn có thể xem mỗi worksheet như một môi trường riêng để chạy SQL hoặc thậm chí là Python.
Bây giờ, tạo một worksheet mới bằng nút “+” ở góc trên bên phải:
Tiếp theo, hãy tạo một số cơ sở dữ liệu và bảng rồi nạp dữ liệu.
Tạo cơ sở dữ liệu và bảng
Trước hết, chúng ta sẽ tạo một cơ sở dữ liệu tên là ecommerce_db. Dán đoạn mã sau và nhấn "Ctrl + Enter" (Cmd + Enter) để chạy ("Ctrl + Shift + Enter" sẽ chạy toàn bộ các câu lệnh trong worksheet).
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 createdĐược hỗ trợ bởi
Sau khi dựng website để bán hàng hóa, chúng ta nhận được một số đơn. Buổi sáng, có hai đơn cho cả hai sản phẩm:
INSERTINTO orders (order_id, product_id, quantity)VALUES(1,1,5),(1,2,3);Được hỗ trợ bởi
Buổi chiều, nhận thêm một đơn nữa:
-- 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 stockĐược hỗ trợ bởi
Nhưng do lỗi hệ thống, đơn hàng được ghi nhận với số lượng nhiều hơn tồn kho. Hãy giả sử chúng ta không phát hiện ra điều này trong hai tuần.
Lưu ý rằng tôi đã thực hiện một vài cập nhật khác cho các bảng ở phía sau.
Kiểm soát thời gian lưu giữ
Nhiệm vụ đầu tiên là đặt thời gian lưu giữ. Gói dùng thử miễn phí của tôi đã hết, nên tôi chỉ có thể đặt là một ngày:
ALTERTABLE inventory SET DATA_RETENTION_TIME_IN_DAYS=1;ALTERTABLE orders SET DATA_RETENTION_TIME_IN_DAYS=1;Được hỗ trợ bởi
Nếu của bạn chưa hết, hãy thử đặt là bốn tuần, vì gói dùng thử cũng sẽ hết sau khoảng thời gian đó.
Sử dụng mệnh đề AT và BEFORE
Snowflake triển khai Time Travel thông qua các phần mở rộng SQL sau:
Mệnh đề AT và BEFORE dùng trong câu lệnh SELECT để xác định chính xác thời điểm (hoặc khoảng thời gian) bạn muốn truy vấn. Chúng hỗ trợ các tham số sau để thực hiện tác vụ này:
TIMESTAMP
OFFSET - độ lệch thời gian tính bằng giây so với hiện tại
STATEMENT - ID truy vấn duy nhất
Lệnh UNDROP để khôi phục bảng, schema và cơ sở dữ liệu
Hãy xem cách dùng các phần mở rộng này trên cơ sở dữ liệu mẫu của chúng ta.
Truy vấn dữ liệu lịch sử
Trước tiên, hãy xem trong inventory hiện có gì:
-- Check current stock level (might show negative value)SELECT*FROM inventory;Được hỗ trợ bởi
Bây giờ, hãy kết hợp dữ liệu đơn hàng và tồn kho hiện có:
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;Được hỗ trợ bởi
Ôi không! Có vẻ có lỗi — số lượng đặt Llama hoodie vượt quá hàng tồn. Hãy thử quay lại 17,5 giờ để xác định thời điểm chính xác câu lệnh sai này được thực thi:
SELECT*FROM orders AT(OFFSET=>-60*60*17.5);-- Go back 17.5Được hỗ trợ bởi
Vậy là đơn hàng sai được đặt lúc 4:54 PM ngày 6 tháng 3. Điều này nghĩa là chúng ta cần trạng thái bảng trước thời điểm đó. Có thể truy vấn dễ dàng bằng mệnh đề BEFORE:
-- 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);Được hỗ trợ bởi
Đừng quên thêm timestamp_tz làm kiểu dữ liệu cho dấu thời gian. tz là viết tắt của múi giờ.
Các ví dụ này minh họa cách dùng mệnh đề AT và BEFORE với timestamp và offset. Nếu bạn không muốn phải xác định thời điểm của truy vấn, bạn có thể dùng ID câu lệnh.
Ví dụ, truy vấn dưới đây thực hiện đúng việc như truy vấn trước đó - truy vấn trạng thái bảng trước khi đơn hàng sai được đặt:
SELECT*FROM orders BEFORE(STATEMENT =>'01b2ce86-0000-95e2-0000-000669127035');Được hỗ trợ bởi
Cách tìm ID truy vấn của bất kỳ câu lệnh nào như sau:
Bằng cách lọc loại truy vấn, bạn có thể nhanh chóng tìm được truy vấn mình cần trong SnowSight.
Nhân bản các đối tượng lịch sử
Vậy là trong bảng của chúng ta có một đơn hàng sai — làm sao loại bỏ nó?
Một cách là nhân bản bảng và loại dòng sai đi:
CREATEORREPLACETABLE orders_clone ASSELECT*FROM orders WHERE quantity !=100;SELECT*FROM orders_clone;Được hỗ trợ bởi
Cách này đã hiệu quả, và chúng ta không cần dựa vào Time Travel để sửa lỗi. Nhưng khi cần nhân bản trạng thái quá khứ của một bảng, bạn có thể dùng cú pháp sau:
-- Clone an object as it existed 2 days agoCREATETABLE old_table_clone CLONE olt_table
AT(OFFSET=>-2*24*60*60);-- Offset for 2 daysĐược hỗ trợ bởi
Nhân bản cơ sở dữ liệu cũng tương tự:
CREATEDATABASE cloned_db CLONE my_db
BEFORE(STATEMENT =>'8e5d0ca9-005e-44e6-b858-a8f5b37c5726');Được hỗ trợ bởi
Xóa và khôi phục đối tượng
Giả sử chúng ta vừa thuê một thực tập sinh và giao cho họ xử lý vấn đề đơn hàng sai.
Trong khi cố gắng xóa bản ghi đó, thực tập sinh vô tình xóa bảng orders trên môi trường production:
-- Simulate accidentally dropping the orders tableDROPTABLE orders
SELECT*FROM orders;;Được hỗ trợ bởi
Thực tập sinh hoảng hốt chạy đến báo cáo sự cố. Chúng ta bình tĩnh thực thi lệnh UNDROP:
-- Recover the dropped table using UNDROP
UNDROP TABLE orders
SELECT*FROM orders;;Được hỗ trợ bởi
Và lấy lại được bảng. Chúng ta cũng tha lỗi cho thực tập sinh và (tất nhiên) quyết định không sa thải vì sai sót này.
Kết luận
Trong hướng dẫn này, chúng ta đã tìm hiểu một tính năng chủ chốt của Snowflake — Time Travel. Nhờ Time Travel, bạn có thể truy vấn và khôi phục thông tin trước đây, một tính năng rất được mong muốn trong các công cụ quản trị cơ sở dữ liệu.
Mọi thứ đều có thể xảy ra trên môi trường production, và việc có bản sao lưu cơ sở dữ liệu trước mỗi lần cập nhật sẽ giúp bạn yên tâm hơn.
Tôi cho rằng Snowflake là công cụ quản trị cơ sở dữ liệu tốt nhất hiện nay. Đây là một công cụ lớn, và thành thạo nó là một kỹ năng đáng giá trong các vai trò dữ liệu. Vì vậy, nếu muốn học thêm, hãy xem khóa Introduction to Snowflake trên DataCamp.
Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng người theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt khô khan. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, cùng với một khóa nữa đang được thực hiện. Nội dung của tôi đã được hơn 5 triệu lượt xem, trong đó 20 nghìn người đã trở thành người theo dõi trên cả Medium và LinkedIn.
Time Travel trong Snowflake là gì?
Cũng như kỹ sư phần mềm có Git để quản lý phiên bản, kỹ sư dữ liệu có Time Travel trong cơ sở dữ liệu Snowflake. Tính năng Time Travel cho phép quản trị viên cơ sở dữ liệu truy vấn dữ liệu lịch sử, nhân bản các bảng cũ và khôi phục các đối tượng đã xóa trước đó.
Tuy nhiên, do kích thước cơ sở dữ liệu có thể phình to, Time Travel không phải là bản thay thế trực tiếp cho quản lý phiên bản mã. Mỗi lần một bảng bị sửa đổi (xóa hoặc cập nhật), Snowflake sẽ chụp nhanh trạng thái dữ liệu trước khi cập nhật. Ảnh chụp nhanh này chỉ tồn tại trong một số ngày nhất định, gọi là thời gian lưu giữ dữ liệu.
Đối với tài khoản Snowflake Standard, thời gian lưu giữ tối đa chỉ là một ngày. Với tài khoản Enterprise, khoảng thời gian này có thể từ 0 đến 90 ngày. Thời gian lưu giữ bằng 0 đồng nghĩa vô hiệu hóa Time Travel, vốn được bật mặc định cho mọi bảng.
Snowflake Time Travel so với Fail-Safe
Khi đọc tài liệu Snowflake, bạn có thể gặp thuật ngữ “Fail-safe”. Nghe tên thì có vẻ Time Travel và Fail-safe làm cùng một việc, nhưng thực ra không phải vậy.
Khi một đối tượng kết thúc thời gian lưu giữ, nó sẽ được chuyển vào Snowflake Fail-safe. Trong Fail-safe, bạn không thể:
Fail-safe chỉ giữ dữ liệu trong 7 ngày và không thể cấu hình. Trong thời gian này, dữ liệu chỉ có thể được Snowflake tự phục hồi. Tính năng này đóng vai trò dịch vụ khôi phục dữ liệu và chỉ dùng như biện pháp cuối cùng khi mọi phương án khôi phục khác đều thất bại. Nó chỉ dùng khi dữ liệu bị hỏng hoặc bị xóa do lỗi vận hành.
Vì vậy, bạn không thể yêu cầu Snowflake khôi phục các phiên bản cũ của đối tượng sau khi chúng đã tự nhiên hết thời gian lưu giữ. Hãy ghi nhớ quy tắc này khi theo dõi hướng dẫn.
Thiết lập môi trường
Snowflake có hai giao diện để tương tác với nền tảng: SnowSight (giao diện web) và Snowflake CLI (trình khách dòng lệnh). Chúng ta sẽ dùng SnowSight vì thiết lập dễ hơn. Bạn có thể đọc hướng dẫn toàn diện này nếu mới làm quen với Snowflake. Bài viết cũng hướng dẫn cách dùng Snowflake CLI.
Đầu tiên, đăng ký tài khoản miễn phí từ trang chủ Snowflake. Bạn sẽ được truy cập các tính năng Enterprise trong 30 ngày dùng thử.
Khi tài khoản sẵn sàng, bạn sẽ được chuyển đến trang Worksheets trên bảng điều khiển. Bạn có thể xem mỗi worksheet như một môi trường riêng để chạy SQL hoặc thậm chí là Python.
Bây giờ, tạo một worksheet mới bằng nút “+” ở góc trên bên phải:
Tiếp theo, hãy tạo một số cơ sở dữ liệu và bảng rồi nạp dữ liệu.
Tạo cơ sở dữ liệu và bảng
Trước hết, chúng ta sẽ tạo một cơ sở dữ liệu tên là
ecommerce_db. Dán đoạn mã sau và nhấn "Ctrl + Enter" (Cmd + Enter) để chạy ("Ctrl + Shift + Enter" sẽ chạy toàn bộ các câu lệnh trong worksheet).Chúng ta sẽ dùng cơ sở dữ liệu giả định này để bán hàng hóa liên quan đến AI. Chạy lệnh dưới đây để đặt nó làm mặc định:
Trước tiên, chúng ta sẽ tạo một bảng tên
inventoryvới ba cột:Sau đó, thêm một số sản phẩm ban đầu:
Chúng ta cũng sẽ tạo một bảng cho đơn hàng:
Sau khi dựng website để bán hàng hóa, chúng ta nhận được một số đơn. Buổi sáng, có hai đơn cho cả hai sản phẩm:
Buổi chiều, nhận thêm một đơn nữa:
Nhưng do lỗi hệ thống, đơn hàng được ghi nhận với số lượng nhiều hơn tồn kho. Hãy giả sử chúng ta không phát hiện ra điều này trong hai tuần.
Lưu ý rằng tôi đã thực hiện một vài cập nhật khác cho các bảng ở phía sau.
Kiểm soát thời gian lưu giữ
Nhiệm vụ đầu tiên là đặt thời gian lưu giữ. Gói dùng thử miễn phí của tôi đã hết, nên tôi chỉ có thể đặt là một ngày:
Nếu của bạn chưa hết, hãy thử đặt là bốn tuần, vì gói dùng thử cũng sẽ hết sau khoảng thời gian đó.
Sử dụng mệnh đề
ATvàBEFORESnowflake triển khai Time Travel thông qua các phần mở rộng SQL sau:
ATvàBEFOREdùng trong câu lệnhSELECTđể xác định chính xác thời điểm (hoặc khoảng thời gian) bạn muốn truy vấn. Chúng hỗ trợ các tham số sau để thực hiện tác vụ này:TIMESTAMPOFFSET- độ lệch thời gian tính bằng giây so với hiện tạiSTATEMENT- ID truy vấn duy nhấtUNDROPđể khôi phục bảng, schema và cơ sở dữ liệuHãy xem cách dùng các phần mở rộng này trên cơ sở dữ liệu mẫu của chúng ta.
Truy vấn dữ liệu lịch sử
Trước tiên, hãy xem trong
inventoryhiện có gì:Bây giờ, hãy kết hợp dữ liệu đơn hàng và tồn kho hiện có:
Ôi không! Có vẻ có lỗi — số lượng đặt Llama hoodie vượt quá hàng tồn. Hãy thử quay lại 17,5 giờ để xác định thời điểm chính xác câu lệnh sai này được thực thi:
Vậy là đơn hàng sai được đặt lúc 4:54 PM ngày 6 tháng 3. Điều này nghĩa là chúng ta cần trạng thái bảng trước thời điểm đó. Có thể truy vấn dễ dàng bằng mệnh đề
BEFORE:Đừng quên thêm
timestamp_tzlàm kiểu dữ liệu cho dấu thời gian.tzlà viết tắt của múi giờ.Các ví dụ này minh họa cách dùng mệnh đề
ATvàBEFOREvới timestamp và offset. Nếu bạn không muốn phải xác định thời điểm của truy vấn, bạn có thể dùng ID câu lệnh.Ví dụ, truy vấn dưới đây thực hiện đúng việc như truy vấn trước đó - truy vấn trạng thái bảng trước khi đơn hàng sai được đặt:
Cách tìm ID truy vấn của bất kỳ câu lệnh nào như sau:
Bằng cách lọc loại truy vấn, bạn có thể nhanh chóng tìm được truy vấn mình cần trong SnowSight.
Nhân bản các đối tượng lịch sử
Vậy là trong bảng của chúng ta có một đơn hàng sai — làm sao loại bỏ nó?
Một cách là nhân bản bảng và loại dòng sai đi:
Cách này đã hiệu quả, và chúng ta không cần dựa vào Time Travel để sửa lỗi. Nhưng khi cần nhân bản trạng thái quá khứ của một bảng, bạn có thể dùng cú pháp sau:
Nhân bản cơ sở dữ liệu cũng tương tự:
Xóa và khôi phục đối tượng
Giả sử chúng ta vừa thuê một thực tập sinh và giao cho họ xử lý vấn đề đơn hàng sai.
Trong khi cố gắng xóa bản ghi đó, thực tập sinh vô tình xóa bảng orders trên môi trường production:
Thực tập sinh hoảng hốt chạy đến báo cáo sự cố. Chúng ta bình tĩnh thực thi lệnh
UNDROP:Và lấy lại được bảng. Chúng ta cũng tha lỗi cho thực tập sinh và (tất nhiên) quyết định không sa thải vì sai sót này.
Kết luận
Trong hướng dẫn này, chúng ta đã tìm hiểu một tính năng chủ chốt của Snowflake — Time Travel. Nhờ Time Travel, bạn có thể truy vấn và khôi phục thông tin trước đây, một tính năng rất được mong muốn trong các công cụ quản trị cơ sở dữ liệu.
Mọi thứ đều có thể xảy ra trên môi trường production, và việc có bản sao lưu cơ sở dữ liệu trước mỗi lần cập nhật sẽ giúp bạn yên tâm hơn.
Tôi cho rằng Snowflake là công cụ quản trị cơ sở dữ liệu tốt nhất hiện nay. Đây là một công cụ lớn, và thành thạo nó là một kỹ năng đáng giá trong các vai trò dữ liệu. Vì vậy, nếu muốn học thêm, hãy xem khóa Introduction to Snowflake trên DataCamp.
Nếu bạn đã quen thuộc và muốn kiểm tra kỹ năng, hãy xem qua các chứng chỉ Snowflake tốt nhất hiện có trong năm 2024.