Database Branching
Database Branching
Database branching in HeliosDB Nano 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