BigQuery keeps changed and deleted data for a short window, so you can query or restore a table as it was a few days ago. For longer protection you take a snapshot.
Time travel
SELECT * FROM analytics.orders FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 2 HOUR);
The default window is 7 days, and you can configure it for each dataset between 2 and 7 days. A shorter window lowers storage cost when you use physical storage billing, because the history is counted. To recover a table that someone overwrote or a deleted one, create a new table from that earlier point:
CREATE TABLE analytics.orders_restored AS SELECT * FROM analytics.orders FOR SYSTEM_TIME AS OF TIMESTAMP '2025-03-01 08:00:00 UTC';
A table that was dropped can also be restored within the window (and in the console or with bq cp using a snapshot decorator).
Fail-safe
After time travel ends, BigQuery keeps deleted data for a further 7 days in fail-safe storage. Like Snowflake's, you cannot query it. Contact Google Cloud support to ask for recovery, and treat it as a last resort.
Table snapshots
A snapshot is a read-only copy of a table at a given time, which can be kept for as long as you set. You are charged only for the data that differs from the base table, so a snapshot of an unchanged table costs almost nothing.
CREATE SNAPSHOT TABLE backups.orders_20250301 CLONE analytics.orders OPTIONS (expiration_timestamp = TIMESTAMP '2025-06-01 00:00:00 UTC');
Table clones
A clone is a writable copy that shares storage with the original until either changes. It suits dev and test copies, the same idea as zero-copy cloning in Snowflake.
Choosing
Mistake noticed today or this week: time travel. Need to keep a point-in-time copy for audits or before a migration: snapshot. Need a writable copy: clone.