Open Source · Java · CLI & Maven

One tool to keep your
entire data platform in sync

Define every schema or infrastructure change once, in version control, and roll it out reliably across all your databases and data processing systems with a single command.

📖 Read the Docs ⚡ Get Started with CLI

One release. Many systems. One command.

Say a single release must touch an operational PostgreSQL database, a BigQuery data warehouse, a Bigtable key-value store, and a Kafka topic whose configuration must be in place before the first message arrives — with the guarantee that all of it lands in the right sequence.

Traditional schema change tools are excellent for a single database. They fall short the moment a release must touch multiple systems at once: the gap is typically filled with runbooks, shell scripts, and careful humans — all of which fail in ways that are hard to detect and hard to reverse.

TotalSchema is designed for exactly that gap. Changes in one place. One command. All systems updated, in order.

What it manages

Any system, one workflow

Apply changes consistently across every tier of your data platform.

🗄️

Relational Databases

Oracle, PostgreSQL, MySQL, SQL Server, and any JDBC-compatible database.

☁️

Cloud Analytical Stores

BigQuery, Redshift, Snowflake, and other cloud-native data warehouses.

📦

NoSQL & Key-Value Stores

BigTable, HBase, MongoDB, Cassandra, and similar distributed stores.

🖥️

Servers &
Infrastructure

Linux/Unix servers via SSH, cloud services, and configuration file management.

📨

Streaming Platforms

Kafka topic creation, partition and retention settings, schema registry entries—versioned and applied like any other change.

🔌

Legacy & Custom Systems

Custom connectors for proprietary or legacy systems are first-class citizens—invoked and scripted exactly like built-in connectors.

Everything a data engineering team needs

A focused, production-ready feature set—no bloat.

Sequenced Cross-System Changes

Each change targets one system and has a defined position in the global execution order—so multi-system releases always run in exactly the sequence you intend.

State Tracking

A persistent state table records every applied change, with optional content hashing to detect tampering.

Multiple Script Types

SQL, Shell, Groovy, and any JVM scripting language your team already knows—JavaScript, Kotlin Script, JRuby, and more (via JSR-223).

Flexible Execution Modes

Run once, run always, run on content change, or revert—each script declares its own lifecycle.

Environment Management

Separate configurations, variables, and system targets for DEV, QA, PROD, and any custom environment.

Variable Substitution

Powerful variable system with environment overrides, expression evaluation, and encrypted secret support.

Distributed Locking

Optional database-backed locking prevents concurrent executions across your team or CI/CD pipeline.

Wildcard Selection

Deploy an arbitrary subset of changes—no forced linear versioning. You decide what runs and when.

Validation

Built-in detection of change scripts that were modified after being applied—safeguarding deployment integrity.

Get Started

Three ways to use TotalSchema

Pick the approach that fits your workflow.

📦

CLI Distribution

Recommended for most teams

Download, extract, add your JDBC drivers, and run. No build tool required—ideal for ops teams and CI/CD pipelines.

CLI Usage Guide →
🔧

Maven Plugin

Best for Java projects

Integrate directly into your Maven build lifecycle. JDBC drivers are managed as Maven dependencies.

Maven Plugin Guide →
💻

Java API

For custom integrations

Embed TotalSchema programmatically in your application for maximum flexibility and control.

Java API Guide →
# Download and extract the CLI distribution export TOTALSCHEMA_VERSION=1.2.0 wget https://repo1.maven.org/maven2/io/github/totalschema/totalschema-release/${TOTALSCHEMA_VERSION}/totalschema-release-${TOTALSCHEMA_VERSION}.tar.gz tar -xzf totalschema-${TOTALSCHEMA_VERSION}.tar.gz && cd totalschema-${TOTALSCHEMA_VERSION} # Add your JDBC driver and apply changes to DEV cp postgresql-42.7.3.jar user_libs/ bin/totalschema.sh apply -e DEV