sql-splitter
Split large SQL dump files into individual table files. Fast, memory-efficient, multi-dialect.
- 600+ MB/s throughput on modern hardware
- MySQL, PostgreSQL, SQLite support (including
COPY FROM stdin) - Compressed files — gzip, bzip2, xz, zstd auto-detected
- Streaming architecture — handles files larger than RAM
- 5x faster than shell-based alternatives
Installation
From crates.io
From source
Or download pre-built binaries from GitHub Releases.
Usage
# MySQL/MariaDB dump (default)
# PostgreSQL pg_dump
# SQLite dump
# Compressed files (auto-detected)
# Split specific tables only
# Schema only (CREATE TABLE, indexes, etc.)
# Data only (INSERT/COPY statements)
# Merge split files back into single dump
# Merge specific tables only
# Merge with transaction wrapper
# Analyze without splitting
# Convert between SQL dialects
# Convert with explicit source dialect
# Generate shell completions (auto-installed with make install)
Shell Completions
Shell completions are automatically installed when using make install. For manual installation:
# Install for current shell only
# Install for all shells (bash, zsh, fish)
Why sql-splitter?
sql-splitter is a dump-first, CLI-first tool designed for automation and CI/CD pipelines.
What it's optimized for
| Strength | Description |
|---|---|
| One tool for the workflow | Split → sample → shard → convert → merge in a single binary |
| Works on dump files | No running database or JDBC connection needed (unlike mydumper, Jailer, Condenser) |
| Streaming architecture | 10GB+ dumps with constant memory, 600+ MB/s throughput |
| Multi-dialect + conversion | MySQL, PostgreSQL, SQLite including COPY FROM stdin → INSERT |
| FK-aware operations | Sampling and tenant sharding preserve referential integrity |
When another tool might be better
- mydumper — Parallel snapshots from live MySQL/MariaDB databases
- Jailer — Rich GUI-based FK subsetting with JDBC across 12+ databases
- sqlglot — Query-level transpilation and AST manipulation (31 dialects)
- DuckDB — Complex analytical queries over SQL/CSV/JSON/Parquet
See docs/COMPETITIVE_ANALYSIS.md for detailed comparisons.
Options
Split Options
| Flag | Description | Default |
|---|---|---|
-o, --output |
Output directory | output |
-d, --dialect |
SQL dialect: mysql, postgres, sqlite |
auto-detect |
-t, --tables |
Only split these tables (comma-separated) | — |
-p, --progress |
Show progress bar | — |
--dry-run |
Preview without writing files | — |
--schema-only |
Only DDL statements (CREATE, ALTER, DROP) | — |
--data-only |
Only DML statements (INSERT, COPY) | — |
Merge Options
| Flag | Description | Default |
|---|---|---|
-o, --output |
Output SQL file | stdout |
-d, --dialect |
SQL dialect for headers/footers | mysql |
-t, --tables |
Only merge these tables (comma-separated) | all |
-e, --exclude |
Exclude these tables (comma-separated) | — |
--transaction |
Wrap in BEGIN/COMMIT transaction | — |
--no-header |
Skip header comments | — |
-p, --progress |
Show progress bar | — |
--dry-run |
Preview without writing files | — |
Convert Options
| Flag | Description | Default |
|---|---|---|
-o, --output |
Output SQL file | stdout |
--from |
Source dialect: mysql, postgres, sqlite |
auto-detect |
--to |
Target dialect: mysql, postgres, sqlite |
required |
--strict |
Fail on any unsupported feature | — |
-p, --progress |
Show progress bar | — |
--dry-run |
Preview without writing files | — |
Supported conversions:
- MySQL ↔ PostgreSQL (including COPY → INSERT)
- MySQL ↔ SQLite
- PostgreSQL ↔ SQLite
Features:
- 30+ data type mappings
- AUTO_INCREMENT ↔ SERIAL ↔ INTEGER PRIMARY KEY
- PostgreSQL COPY → INSERT with NULL and escape handling
- Session command stripping
- Warnings for unsupported features (ENUM, arrays, triggers)
Performance
See BENCHMARKS.md for detailed comparisons.
Testing
# Unit tests
# Verify against real-world SQL dumps (MySQL, PostgreSQL, WordPress, etc.)
License
MIT — see LICENSE.md