Database Branching
Database Branching
Database branching in HeliosDB-Lite works like Git branches for your data. Create isolated copies of your database for development, testing, or experimentation without duplicating storage.
Overview
Branches are lightweight, copy-on-write database snapshots that share unchanged data with their parent. This makes creating branches nearly instantaneous regardless of database size.
Creating Branches
From Current State
-- Create a branch from the current state of mainCREATE DATABASE BRANCH dev FROM main;
-- Or use AS OF NOW explicitlyCREATE DATABASE BRANCH dev FROM main AS OF NOW;From a Point in Time
-- Branch from a specific timestampCREATE DATABASE BRANCH hotfix FROM mainAS OF TIMESTAMP '2025-01-15 00:00:00';
-- Branch from a specific transactionCREATE DATABASE BRANCH feature FROM mainAS OF TRANSACTION 12345;Switching Branches
SQL Syntax
USE BRANCH dev;REPL Command
\use devCheck Current Branch
\show branchListing Branches
REPL
\branchesSQL
SELECT * FROM pg_database_branches();Output includes:
name- Branch nameparent- Parent branch namecreated_at- Creation timestampcommit_count- Number of commitsis_current- Whether this is the active branch
Merging Branches
Basic Merge
MERGE DATABASE BRANCH dev INTO main;With Conflict Strategy
MERGE DATABASE BRANCH dev INTO mainWITH (strategy = 'theirs');Strategies:
| Strategy | Description |
|---|---|
fail | Fail on any conflict (default) |
ours | Keep target branch version on conflict |
theirs | Keep source branch version on conflict |
Dropping Branches
DROP DATABASE BRANCH dev;
-- With IF EXISTS to avoid errorsDROP DATABASE BRANCH IF EXISTS dev;Use Cases
Development Environment
-- Create dev branchCREATE DATABASE BRANCH dev FROM main;USE BRANCH dev;
-- Make experimental changesALTER TABLE users ADD COLUMN preferences JSONB;INSERT INTO users (name, preferences) VALUES ('Test', '{}');
-- If changes work, merge backUSE BRANCH main;MERGE DATABASE BRANCH dev INTO main;Feature Testing
-- Create branch for testing a featureCREATE DATABASE BRANCH feature_x FROM main;USE BRANCH feature_x;
-- Run integration tests with modified dataDELETE FROM users WHERE test_account = true;-- Tests run here...
-- Discard when done (no merge needed)USE BRANCH main;DROP DATABASE BRANCH feature_x;Point-in-Time Recovery
-- Create branch from before the incidentCREATE DATABASE BRANCH recovery FROM mainAS OF TIMESTAMP '2025-01-15 00:00:00';
-- Verify data is correctUSE BRANCH recovery;SELECT COUNT(*) FROM orders;
-- If good, make it the new main-- (requires careful planning in production)How It Works
- Copy-on-Write: Branches share data pages with their parent. Only modified pages are copied.
- Snapshot Isolation: Each branch has its own transaction log and snapshot.
- Minimal Overhead: Creating a branch is O(1) regardless of data size.
Best Practices
- Name branches descriptively:
feature_auth_refactor,bugfix_order_calc - Keep branches short-lived: Merge or delete when done
- Test merges on a copy first: Create a test branch to verify merge results
- Use timestamps for recovery branches: Makes it clear what state you’re restoring
Limitations
- Cannot merge into a branch that has diverged significantly
- Circular branch relationships are not allowed
- Branch names must be unique
Related
- Time-Travel Queries - Query historical data without branches
- REPL Commands -
\branches,\usecommands