🛠️ Build powerful dev/test environments.
🔃 Cover 100% of DB migrations with CI tests.
💡 Quickly verify ChatGPT ideas to get rid of hallucinations.
Available for any PostgreSQL, including self-managed and managed services* like AWS RDS, GCP Cloud SQL, Supabase, and Timescale.
It can be installed and used anywhere: across all cloud environments and on-premises.
*For managed PostgreSQL cloud services like AWS RDS or Heroku, direct physical connection and PGDATA access aren't possible. In these cases, DBLab should run on a separate VM within the same region. It will routinely auto-refresh its data, effectively acting as a database-as-a-service solution. This setup then offers thin database branching ideal for development and testing.
- Build dev/QA/staging environments using full-scale, production-like databases.
- Provide temporary full-size database clones for SQL query analysis and optimization (see also: SQL optimization chatbot Joe).
- Automatically test database changes in CI/CD pipelines, minimizing risks of production incidents.
- Rapidly validate ChatGPT or other LLM concepts, check for hallucinations, and iterate towards effective solutions.
For example, cloning a 1 TiB PostgreSQL database takes just about 10 seconds. On a single machine, you can have dozens of independent clones running simultaneously, supporting extensive development and testing activities without any added hardware costs.
Try it yourself right now:
- Visit Postgres.ai Console, set up your first organization, and provision a DBLab Standard Edition (DBLab SE) to any cloud or on-premises environment.
- Pricing (starting at $62/month)
- Documentation: How to install DBLab SE
- Demo: https://demo.dblab.dev (use the token
demo-tokento access) - Looking for a free version? Install the DBLab Community Edition by following this tutorial.
Thin cloning is fast because it is based on Copy-on-Write (CoW). DBLab employs two technologies for enabling thin cloning: ZFS (default) and LVM.
Using ZFS, DBLab routinely takes new snapshots of the data directory, managing a collection of them and removing old or unused ones. When requesting a fresh clone, users have the option to select their preferred snapshot.
Read more:
- DBLab tutorial for any PostgreSQL database
- DBLab tutorial for Amazon RDS
- How to install DBLab SE using Postgres.ai Console
- How to install DBLab SE using AWS 市场
- Speed & scale
- Support & technologies
- PostgreSQL containers
- Source database requirements
- Location flexibility: self-managed PostgreSQL, AWS RDS, GCP Cloud SQL, Azure, etc.—no source adjustments needed.
- No ZFS or Docker requirements for source databases
- Data provisioning & retrieval
- Simple-mode setup: paste source URL + password, get a probed configuration in one click (UI Configuration → Simple tab)
- Expert-mode form for both logical (dump/restore) and physical (WAL-G, pgBackRest) retrieval
- Physical (pg_basebackup, WAL-G, pgBackRest) and logical (dump/restore) provisioning
- Partial data retrieval in logical mode (specific databases/tables)
- Database renaming during snapshot creation (
databaseRenameoption) - Continuous update in physical mode
- Periodic full refresh in logical mode without downtime
- Recovery & management
- Fast Point in Time Recovery (PITR) for physical mode
- Auto-deletion of unused clones
- Time-based auto-deletion of unused branches and snapshots (
retentionconfig; safe-only, never force-deletes dependents) - Snapshot retention policies in DBLab configuration
- Clones, branches & snapshots
- "Deletion protection" for clones, branches, and snapshots (blocks manual and auto-deletion, plus count-based retention for snapshots)
- Persistent clones withstand DBLab restarts
- "Reset" command for data version switching
- "Upgrade" command to move a single clone to a newer PostgreSQL major version in place
- Resource quotas: CPU, RAM
- Monitoring & security
/healthzAPI endpoint (no auth), extended/statusendpoint (API docs)- Prometheus metrics endpoint (
/metrics) for monitoring - Netdata module for insights
A single clone can be moved to a newer PostgreSQL major version without touching the rest of the instance, which makes it practical to test an upgrade against production-like data:
dblab clone upgrade --target-version 17 my-cloneThe same action is available in the UI on the clone page and over the API as
POST /clone/{id}/upgrade.
The clone's Postgres is shut down cleanly, pg_upgrade --link converts its data directory in
place, and the clone restarts on an image of the target major. Because --link hard-links the
data files instead of copying them, the upgrade is fast and consumes almost no extra space. The
request returns as soon as the clone enters the UPGRADING state; watch the clone status for the
result.
Enabling it. Set provision.pgUpgradeImage to an upgrade image matching the target major.
When it is unset the feature is simply unavailable and the endpoint says so; nothing else about
the instance changes.
provision:
pgUpgradeImage: "postgresai/pg-upgrade:17"
pgUpgradeTimeout: 3h
pgUpgradePullTimeout: 1hpgUpgradeTimeout bounds a single upgrade run; it defaults to three hours. When the budget runs
out, the upgrade container is removed and the clone is put back on the version its data directory
still holds, exactly as it would be after any other failure.
pgUpgradePullTimeout bounds each of the two image pulls that precede it, and defaults to one
hour. The upgrade image carries the target major plus the server packages of the four preceding
ones, so the first upgrade on an instance downloads several gigabytes; pre-pulling both images
makes the step a no-op. Both pulls happen while the clone is still serving traffic, so exceeding
the budget leaves the clone untouched and running. The two budgets are separate on purpose — a
slow pull must not eat into the time pg_upgrade gets once the clone is already stopped.
An upgrade request may name an image explicitly instead of letting the engine substitute the major
in the current tag. Set provision.upgradeImageAllowList to restrict which repositories such a
request may name; when it is empty, as it is by default, any repository the instance can reach is
accepted.
provision:
upgradeImageAllowList:
- "postgresai/extended-postgres"How it can end. Almost every outcome leaves the clone running:
| Status | Meaning |
|---|---|
OK |
The clone runs the target version; dbVersion reports it. |
WARNING |
The upgrade was not applied. Either nothing had been converted and the clone still runs its original version, or conversion had begun and the clone was rebuilt from its origin snapshot — in which case data written since the clone was created is lost. The message says which, and points at the pg_upgrade log under <clone dir>/upgrade/logs/. |
WARNING, clone not running |
The upgrade settled on disk but the clone container did not come back up. The data directory is intact and the upgrade is still recorded as pending, so the next engine start finishes or undoes it and brings the clone back. |
FATAL |
Recovery itself failed and there is nothing left to finish. Reset or delete the clone. |
Rolling back. Resetting the clone returns it to the version the instance is configured with, because a reset re-provisions from the origin snapshot using the engine-wide image.
Things to know.
- The target must be newer than the clone's current major and at most four majors ahead — the upgrade image carries binaries for the four preceding versions.
- Only majors DBLab ships a default configuration for can be targeted (10–18 today).
- The image tag keeps its extension bundle and glibc suffix; only the major changes
(
…:16-0.8.0-glibc236→…:17-0.8.0-glibc236). Changing the glibc build across an upgrade would change collation behaviour, andpg_upgradedoes not reindex. Pass--docker-imageto override the choice. pg_upgradeverifies that every extension in the source database has a matching library for the new major. An extension outside the image's set fails this check, and the clone rolls back untouched.- Clones using non-default tablespaces are refused: those live outside the clone dataset.
- In physical mode the sync instance and the pool are untouched — the upgrade only ever acts on a
clone's own dataset. The instance-wide
dockerImagemust still match the source major. - Iteration 1 limitation: a snapshot created from an upgraded clone does not record its major version, so clones created from that snapshot start on the instance-wide image and will fail to start. Avoid snapshotting upgraded clones until snapshot-level version resolution lands.
The simplest way to show your support is by giving us a star on GitHub or GitLab! ⭐
- Tweet about DBLab and mention @Database_Lab.
- Share a link to this repository on your favorite social media platform.
If DBLab has been a vital tool for you, tell the world about your journey. Use the logo from the ./assets folder for a visual touch. Whether it's in documents, presentations, applications, or on your website, let everyone know you trust and use DBLab.
HTML snippet for lighter backgrounds:
<a href="http://databaselab.io">
<img width="400" src="https://postgres.ai/assets/powered-by-dle-for-light-background.svg" />
</a>For darker backgrounds:
<a href="http://databaselab.io">
<img width="400" src="https://postgres.ai/assets/powered-by-dle-for-dark-background.svg" />
</a>For proposals, bug reports, and participation in development, see our Contributing Guide.
- How to install and initialize Database Lab CLI
- How to manage DBLab
- How to work with clones
- How to work with branches
- How to integrate DBLab with GitHub 操作 – TBD
- How to integrate DBLab with GitLab CI/CD – TBD
You can find more in the "How-to guides" section of the documentation.
- DBLab Docker images
- Extended Docker images for PostgreSQL (with plenty of extensions)
- SQL Optimization chatbot (Joe Bot)
- DB Migration Checker
The DBLab source code is licensed under the OSI-approved open source license Apache 2.0.
Reach out to the PostgresAI team if you want a trial or commercial license that does not contain the GPL clauses: Contact page.
- Database Lab Engine Community Covenant Code of Conduct
- Where to get help: Contact page.
- Community Slack
- If you need to report a security issue, follow the instructions in Database Lab Engine 安全 Guidelines.
Many thanks to our amazing contributors!
Making DBLab more accessible to engineers around the globe is a great help for the project. Check details in the translation section of contributing guide.
This README is available in the following translations:

