A CLI tool that parses MySQL ROW-format binary logs, indexes every row event into MySQL with full before/after images, and generates reversal SQL for point-in-time recovery — without needing the original binlog files.
- Go 1.24+
- MySQL 8.0+ (index database)
- Source MySQL server with
binlog_format = ROWandbinlog_row_image = FULL
go install github.com/dbtrail/bintrail/cmd/bintrail@latestOr build from source:
git clone https://github.com/dbtrail/bintrail
cd bintrail
go build ./cmd/bintrail# 1. Create index tables (run once)
bintrail init --index-dsn "user:pass@tcp(127.0.0.1:3306)/binlog_index"
# 2. Snapshot schema metadata from the source server
bintrail snapshot \
--source-dsn "user:pass@tcp(source:3306)/" \
--index-dsn "user:pass@tcp(127.0.0.1:3306)/binlog_index"
# 3. Index binlog files (requires access to /var/lib/mysql on the source host)
bintrail index \
--index-dsn "user:pass@tcp(127.0.0.1:3306)/binlog_index" \
--source-dsn "user:pass@tcp(source:3306)/" \
--binlog-dir /var/lib/mysql \
--all
# 4. Query the index
bintrail query \
--index-dsn "user:pass@tcp(127.0.0.1:3306)/binlog_index" \
--schema mydb --table orders --pk 12345
# 5. Generate recovery SQL
bintrail recover \
--index-dsn "user:pass@tcp(127.0.0.1:3306)/binlog_index" \
--schema mydb --table orders --event-type DELETE \
--since "2026-02-19 14:00:00" --until "2026-02-19 14:05:00" \
--output recovery.sqlManaged MySQL (RDS, Aurora, Cloud SQL)? Use
bintrail streaminstead ofbintrail index— it connects over the replication protocol and requires no access to binlog files on disk. See Streaming.
New to bintrail? See the Practical Guide for DBAs for scenario-based walkthroughs and troubleshooting.
| Command | Description |
|---|---|
init |
Create index tables in the target MySQL database |
snapshot |
Capture table and column metadata from the source server |
index |
Parse binlog files from disk and write row events to the index |
stream |
Connect as a replica and index row events in real-time |
query |
Search the index with flexible filters (schema, table, PK, time range, GTID) |
recover |
Generate reversal SQL for matching events |
reconstruct |
Rebuild row state at a point in time from baselines + binlog events |
rotate |
Drop old partitions, add new ones, optionally archive to Parquet |
status |
Show indexed files, partition sizes, and event counts |
dump |
Invoke mydumper to create a logical dump of the source server |
baseline |
Convert mydumper output to Parquet snapshots |
upload |
Upload local Parquet files to S3 |
config init |
Generate a .bintrail.env configuration file |
profile |
Manage RBAC access profiles for query and recover |
flag |
Label tables and columns (e.g. pii, sensitive) for access rules |
access |
Link flags to profiles with allow/deny permissions |
generate-key |
Generate an AES-256 encryption key for dump encryption |
All commands accept --log-level (default info) and --log-format (default text). See each command's --help for flags and usage.
Bintrail ships an MCP server that exposes query, recover, and status as read-only tools — letting Claude (or any MCP client) explore your binlog index conversationally.
The easiest way to connect — works from claude.ai, Claude Desktop, and Claude mobile:
- Deploy the MCP Gateway (handles OAuth + tenant routing)
- In Claude, go to Settings > Integrations > Add custom integration
- Enter your gateway URL (e.g.
https://mcp.dbtrail.com/mcp) - Authorize with your tenant ID — done
The project ships .mcp.json which pre-registers the server using go run:
{
"mcpServers": {
"bintrail": {
"command": "go",
"args": ["run", "./cmd/bintrail-mcp"],
"env": { "BINTRAIL_INDEX_DSN": "user:pass@tcp(127.0.0.1:3306)/binlog_index" }
}
}
}Set BINTRAIL_INDEX_DSN to your index database DSN, then enable with claude mcp enable bintrail.
See MCP Server docs for HTTP mode, proxy setup, and tool details.
Source MySQL Index MySQL
(information_schema) ──snapshot──► schema_snapshots
│
Binlog files on disk ──index──► binlog_events (partitioned)
index_state
│
Replication stream ──stream──► binlog_events (partitioned)
stream_state (checkpoint)
│
query / recover ──► stdout / .sql file
The index stores complete before and after row images for every event, so recovery never requires the original binlog files.
bintrail index reads binlog files directly from disk — best for self-managed MySQL where the binlog directory is accessible.
bintrail stream connects as a replica over the replication protocol — best for managed MySQL (RDS, Aurora, Cloud SQL) where binlog files are not directly accessible.
| Guide | Description |
|---|---|
| Quickstart | Zero to recovery in 10 minutes |
| Practical Guide for DBAs | Scenario-based walkthroughs and troubleshooting |
| Indexing | File-based indexing in depth |
| Streaming | Real-time replication indexing |
| Streaming 101 | Getting started with stream |
| Query and Recovery | Filters, output formats, and recovery workflows |
| Rotation and Status | Partition management and monitoring |
| Dump and Baseline | mydumper workflow and Parquet baselines |
| DDL Tracking | Schema change detection and handling |
| Server Identity | Multi-server identity management |
| Upload | Parquet archive uploads to S3 |
| MCP Server | MCP server setup, HTTP mode, and proxy |
| MCP Gateway | OAuth gateway for Claude Connector |
| Deployment | cron, systemd, Ansible, and production setup |
| Docker | Container images and Docker Compose |
| Parquet Debugging | Inspecting and troubleshooting Parquet archives |
This project is licensed under the Business Source License 1.1. You may use bintrail for any purpose, including production use, except offering it as part of a competing commercial hosted service or managed consulting service. Each version converts to Apache License 2.0 four years after its release.
For alternative licensing arrangements, contact daniel@dbtrail.com.
Contributions are welcome! Please read CONTRIBUTING.md before opening a pull request. All contributors must agree to the Contributor License Agreement — first-time contributors will be prompted automatically via CLA Assistant.